Hi Brice,

Thanks for resubmitting. We are wrapping up Windows support this week, and
will be back reviewing patches soon.

Thanks again,
Josh

--
Join us for PuppetConf, September 22nd and 23rd in Portland, OR:
http://bit.ly/puppetconfsig

On Sun, Sep 18, 2011 at 6:55 AM, Brice Figureau <
brice-pup...@daysofwonder.com> wrote:

> Hi Josh,
>
> I know this was long overdue, but my own schedule couldn't fit any
> puppet development until now.
> I'm aware this will take you or the dev team a looong time to get back
> into context :)
>
> Anyway, I started working on modifying the PIF to take into account your
> comments, and my answers are interspersed into yours below.
>
> I'm also sending an official pull request at the same time.
> Thanks for your time,
>
> On 17/06/11 01:10, Josh Cooper wrote:
> > Hi Brice,
> >
> > Thanks for sending these patches, it's great stuff. I have some
> > general comments first, and then comments about each commit below:
> >
> > GENERAL
> >
> >  * I noticed places where a monitor was being created lazily, e.g.
> > @last_logs ||= {}.extend(MonitorMixin). This is not thread safe, as
> > two threads could create and synchronize on different objects. To be
> > safe, I would create the last_logs hash in the initialize method or
> > include the MonitorMixin in your class.
>
> Those were found most in the "example" code than in the framework
> itself. I've taken care of it.
>
> >  * There are a couple of places where access to a hash is
> > synchronized, e.g. Instrumentation.listeners_of, but the hash is
> > returned from the method call. As a result a caller may be iterating
> > over it while another thread modifies it, resulting in undefined
> > behavior. It would be safer to return a dup'ed hash.
>
> I changed the ones I could find to use a block (ie kind of visitor
> pattern) instead of returning internal values.
>
> >  * Have you considered how inheritance will affect instrumented
> > methods? I wasn't able to produce a failure condition, but I'm
> > concerned about an infinite loop if a super and sub class instrument
> > the same method due to them both creating an "instrumented_method"
> > alias. You may want to make the instrumented method name unique, e.g
> > adding the klass object id to the method name?
>
> No, I didn't try anything specific in this respect. I'll consider using
> the klass object id to decorate the instrumented method name, though the
> current pull request don't have it.
>
> > COMMIT 1/8
> >
> >  lib/puppet/util/instrumentation.rb
> >
> >  * The unsubscribe method is never called as far as I can tell.
>
> ... which doesn't mean it won't ever :)
>
> >  * The listeners_of method should return a dup of the @listeners_of
> > hash, otherwise, in the publish method, one thread could be iterating
> > though the hash, while another thread, e.g. rest, attempts to
> > concurrently modify it, e.g. saving a listener through the rest
> > interface causes the rehash method to be called.
>
> I changed the semantic to a visitor pattern.
>
> >  * Related to this, if a listener has been notified, there's nothing
> > to prevent it from unsubscribing, or instrumenting additional methods
> > (from within its notify). I'm pretty sure bad-things-would-happen.
>
> That's correct. I don't think it adds anything to sandbox the listeners.
> Let's trust people writing listeners :)
>
> >  * The subscribe method registers listener.name, but the unsubscribe
> > uses listener.name.to_s
>
> Fixed.
>
> >  * rehash assumes that the caller is holding the monitor while it
> > clears the listeners_of hash. I'd recommend making it private.
>
> Fixed.
>
> >  lib/puppet/util/instrumentation/listener.rb
> >
> >  * Puppet.warnonce "Error during instrumentation notification: #{e}"
> >
> >    This should just be: warnonce(...)
>
> Fixed.
>
> >  spec/unit/util/instrumentation/listener_spec.rb
> >
> >  * This could use more tests, e.g. calling unsubscribe, without first
> > calling subscribe, calling subscribe multiple times, etc..
> >
> >  spec/unit/util/instrumentation_spec.rb
> >
> >  * This should also test that listeners are not notified when literal
> > and regex patterns don't match
>
> Both fixed (note your comments were interverted).
>
> > -----------------------------------------------------
> >
> > COMMIT 2/8
> >
> >  lib/puppet/indirector/instrumentation_data.rb
> >  lib/puppet/indirector/instrumentation_data/local.rb
> >  lib/puppet/indirector/instrumentation_data/rest.rb
> >  lib/puppet/indirector/instrumentation_listener.rb
> >  lib/puppet/indirector/instrumentation_listener/local.rb
> >  lib/puppet/indirector/instrumentation_listener/rest.rb
> >  lib/puppet/util/instrumentation/data.rb
> >
> >  * I had a lot of trouble getting this to work, partly because it's
> > new to me and also because of the whole plurality business. But we
> > could use better error messages. For example, when trying to search
> > for instrumentation data I tried the following
> >
> >    curl -k -H 'Accept: pson' -X GET "https://localhost:8140/production/
> > instrumentation_data/all"
> >    Could not render to pson: undefined method `name' for nil:NilClass
> >
> >    I instead had to do ".../instrumentation_data_search/all"
>
> The commit message might have been wrong. I think you need to
> "pluralize" instrumentation_data to instrumentation_datas.
> Reading the API code, we apparently also support _search now for just
> the cases where pluralization by adding 's' doesn't work :)
>
> >  * Also, if the listener does not provide data, e.g. process_name:
> >
> >    curl -k -H 'Accept: pson' -X GET "https://localhost:8140/production/
> > instrumentation_data/process_name"
> >    Could not render to pson: undefined method `data' for
> > #<Puppet::Util::Instrumentation::Process_name:0x1024bca28>
>
> Fixed
>
> >  * I'm seeing data leakage when "save"ing the listener
> >
> >    curl -k -H 'Accept: pson' -X PUT -H "Content-Type: text/pson" -d
> > "{\"document_type\":\"Puppet::Util::Instrumentation::Listener\",\"data
> > \":{\"enabled\":true,\"name\":\"log\"}}" "https://localhost:8140/
> > production/instrumentation_listener/log"
> >   --- !ruby/object:Puppet::Util::Instrumentation::Listener
> >   enabled: true
> >   listener: !ruby/object:Puppet::Util::Instrumentation::Log
> >     last_logs:
> >       save_instrumentation_listener_local:
> >         - save_instrumentation_listener_local took 0.000217
>
> Fixed.
>
> > -----------------------------------------------------
> >
> > COMMIT 3/8
> >
> >  lib/puppet/util/instrumentation/Instrumentable.rb
> >
> >  * The disable method does not restore the original method. The order
> > of the parameters to the alias_method needs to be reversed.
>
> Oops :)
> Fixed
>
> >  * Need to lowercase the filename
>
> Fixed
>
> >  * Do the enable and disable methods really need to create local
> > variables, e.g. method = @method? We definitely don't need label and
> > data variables in the disable method.
>
> It simpler to use method in the class_eval block than the outlining
> Instrumentable object instance variable @method.
> You're correct data and label are unneeded.
>
> >  spec/unit/util/instrumentation/instrumentable_spec.rb
> >
> >  * The spec should really call the various instrumented methods (as
> > opposed to seeing if they respond to) after the probe is enabled and
> > after it has been disabled, to ensure that the "disable" method really
> > works.
>
> Fixed.
>
> > -----------------------------------------------------
> >
> > COMMIT 4/8
> >
> >  lib/puppet/util/instrumentation/listeners/log.rb
> >
> >  * There's a race condition creating the @last_log object, which is
> > later used to synchronize on.
> >
> >  * The data method returns the actual last_logs array, not a dup, but
> > as the caller is iterating the array, another event could be
> > delivered. Note the :performance listener does perform a dup within a
> > synchronized block when returning its data.
>
> Both are fixed.
>
> >  spec/unit/util/instrumentation/listeners/log_spec.rb
> >
> >  * Dir.chdir(File.dirname(__FILE__)) { (s = lambda { |f| File.exist?
> > (f) ? require(f) : Dir.chdir("..") { s.call(f) } }).call("spec/
> > spec_helper.rb") }
> >
> >    can be changed to just:
> >
> >    require 'spec/spec_helper'
>
> Fixed.
>
> > -----------------------------------------------------
> >
> > COMMIT 5/8
> >
> >  lib/puppet/util/instrumentation/listeners/performance.rb
> >
> >  * Same comment about synchronizing on a mutable samples hash.
>
> Fixed
>
> >  * If the duration is always greater than 32768, then min will
> > incorrectly be 32768
>
> Fixed
>
> >  spec/unit/util/instrumentation/listeners/performance_spec.rb
> >
> >  * Same comment about require 'spec/spec_helper'
>
> Fixed
>
> > -----------------------------------------------------
> >
> > COMMIT 6/8
> >
> >  lib/puppet/util/instrumentation/listeners/process_name.rb
> >
> >  * @oldname is set, but never used
> >
> >  * Same comment about synchronizing on a mutable @mutex
> >
> >  * The scroller thread should be stopped if the listener is disabled
> >
> >  spec/unit/util/instrumentation/listeners/process_name_spec.rb
> >
> >  * require 'spec/spec_helper'
>
> I reworked the process name listener and this should fix all these
> concerns.
>
> > -----------------------------------------------------
> >
> > COMMIT 7/8
> >
> >  lib/puppet/indirector/instrumentation_probe.rb
> >  lib/puppet/indirector/instrumentation_probe/local.rb
> >  lib/puppet/indirector/instrumentation_probe/rest.rb
> >
> >  * Getting a list of "probes" doesn't exactly work, due to rest
> > interface pluralizing (something to just document when telling people
> > how to use this feature):
> >
> >    curl -k -H 'Accept: pson' -X GET -H "Content-Type: text/pson" -d
> > "{}" "https://localhost:8140/production/instrumentation_probes/all";
> >    Forbidden request: localhost(127.0.0.1) access to /
> > instrumentation_prob/all [search] at line 105
> >
> >    Have to say .../instrumentation_probe_search/all instead.
>
> I'll update the commit message.
>
> >  lib/puppet/util/instrumentation/indirection_probe.rb
> >
> >  * :docuemnt_type misspelled
>
> Fixed.
>
> >  spec/unit/indirector/instrumentation_probe/local_spec.rb
> >  spec/unit/indirector/instrumentation_probe/rest_spec.rb
> >  spec/unit/util/instrumentation/indirection_probe_spec.rb
>
> No comments for those?
>
> > -----------------------------------------------------
> >
> > COMMIT 8/8
> >
> >  lib/puppet/indirector/indirection.rb
> >
> >  * no comments
>
> Hey, that's cool!
> --
> 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 puppet-dev@googlegroups.com.
> To unsubscribe from this group, send email to
> puppet-dev+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/puppet-dev?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Developers" group.
To post to this group, send email to puppet-dev@googlegroups.com.
To unsubscribe from this group, send email to 
puppet-dev+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/puppet-dev?hl=en.

Reply via email to