Hi Markus,
On 27/02/11 19:54, Markus Roberts wrote:
> B --
>
> Thoughts:
>
> 1) Wow.
>
>> + def enable
>
> + raise "Probe already enabled" if enabled?
> + method = @method
> + label = @label
> + data = @data
> + klass.class_eval {
> + alias_method("instrumented_#{method}", method)
> + define_method(method) do |*args|
> + begin
> + instrumentation_label = label.respond_to?(:call) ?
> label.call(self, args) : label
> + instrumentation_data = data.respond_to?(:call) ?
> data.call(self, args) : data
> +
> Puppet::Util::Instrumentation.start(instrumentation_label,
> instrumentation_data)
> + send("instrumented_#{method}".to_sym, *args)
> + rescue => e
> + raise
> + ensure
> + Puppet::Util::Instrumentation.stop(instrumentation_label)
> + end
> + end
> + }
> + @enabled = true
> + end
>
>
> 2) Would you get a more useful stack-trace without the rescue?
Actually the first version didn't had the rescue, but I had some issues
and I wanted to print the exception, it apparently escaped the garbage
collection.
Now, I thought that a straight raise would rethrow the exception without
touching it, or am I wrong?
In any case, this is easy to change :)
Now that you talk about, I should begin/rescue the instrumentation code
on front and in the ensure, because the thing we really don't want is to
crash puppet with the instrumentation code :)
> 3) And is there a race condition on @enabled?
Theorically yes, but in this scheme you can only enable all probes or
disable them all at once. And this looks protected.
>
> + def disable
> + raise "Probe is not enabled" unless enabled?
> + method = @method
> + label = @label
> + data = @data
> + klass.class_eval do
> + alias_method("instrumented_#{method}", method)
> + remove_method("instrumented_#{method}".to_sym)
> + end
> + end
>
>
> 4) Should you set @enabled = false somewhere in here?
Yes, I should :)
> + def self.clear_probes
> + INSTRUMENTED_CLASSES.synchronize {
> + INSTRUMENTED_CLASSES.clear
> + }
> + end
>
>
> 5) Do you want a:
>
> nil # do not leak our probes to the exterior world
>
> on clear_probes as well as on each_probes?
Actually, clear_probes is only called in test, but you're right.
And there's some other place (like the listeners) that also leak some
internal instances to the indirector.
Thanks for your comments!
--
Brice Figureau
My Blog: http://www.masterzen.fr/
--
You received this message because you are subscribed to the Google Groups
"Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/puppet-dev?hl=en.