Issue #18187 has been updated by Adrien Thebo.

Status changed from In Topic Branch Pending Review to Merged - Pending Release
Target version set to 3.1.1

Since it was decided that this is a valuable contribution but we're trying to 
wrap up the 2.7.x line, I rebased this onto 3.1.x and merged it as 7bd6a90 into 
3.1.x and master. It should be released into 3.1.1.
----------------------------------------
Bug #18187: Cached *root* environment isn't cleared when 
Puppet::Node::Environment.clear is called
https://projects.puppetlabs.com/issues/18187#change-82656

Author: Dominic Cleal
Status: Merged - Pending Release
Priority: Normal
Assignee: Dominic Cleal
Category: autoloader
Target version: 3.1.1
Affected Puppet version: 2.7.20
Keywords: autoloader environments type regression
Branch: https://github.com/puppetlabs/puppet/pull/1455


2.7.20 included a backport of a performance fix, which included a change to how 
types are autoloaded.

[commit 
8173a6e6c199426381f1f9fb8d0a71e0d0c12f2a](https://github.com/puppetlabs/puppet/commit/8173a6e6c199426381f1f9fb8d0a71e0d0c12f2a)

    commit 8173a6e6c199426381f1f9fb8d0a71e0d0c12f2a
    Author: Daniel Pittman <[email protected]>
    Date:   Mon Jul 16 23:40:31 2012 -0700
    
        Avoid object creation/destruction when possible.
        
        Object creation and destruction, even over a short time-frame, is 
expensive,
        so where we can avoid it we should.

    [..]
    diff --git a/lib/puppet/metatype/manager.rb b/lib/puppet/metatype/manager.rb
    index 597a89f..dfcc74d 100644
    --- a/lib/puppet/metatype/manager.rb
    +++ b/lib/puppet/metatype/manager.rb
    @@ -108,17 +108,24 @@ module Manager
    [..]
    +    # Try loading the type.
    +    if typeloader.load(name, Puppet::Node::Environment.current)
    +      Puppet.warning "Loaded puppet/type/#{name} but no class was created" 
unless @types.include? name
         end

This happens to fix #13858, but now makes the autoloader for types depend on 
the current environment.  I run a module spec and load types from a 
`modulepath` (set up in my module's spec_helper for third party modules).  The 
spec_helper looks a bit like this:

    require 'puppetlabs_spec_helper/puppetlabs_spec_helper'
    Puppet[:modulepath] = File.join(dir, '..', 'modules')

Puppet is initialised, settings are loaded by the pl_spec_helper / testhelper, 
then I specify a new modulepath, then begin loading types and testing them.

The autoloader calls:

    real_env = Puppet::Node::Environment.new(env)

With 2.7.19, env would have been nil (since none was passed in) and so 
`Puppet::Node::Environment` returns the "production" environment.  2.7.20 (see 
commit above) gets the "*root*" environment from 
`Puppet::Node::Environment.current` and passes it in.

Both `TestHelper` and `Puppet::Util::Settings` call 
`Puppet::Node::Environment.clear` when things change (i.e. the modulepath I'm 
setting), but this doesn't clear the special `*root*` environment.  This causes 
the old modulepath to remain cached in both the *root* environment itself and 
the autoloader (which has a thread cache based on the environment object), 
therefore types in the new modulepath can't be found.

With 3.1.0 and Josh's fix in #15529, this isn't a problem since the modulepath 
won't get cached until app_defaults_initialized becomes true, which is just 
before the new modulepath is set, so all is OK.


-- 
You have received this notification because you have either subscribed to it, 
or are involved in it.
To change your notification preferences, please click here: 
http://projects.puppetlabs.com/my/account

-- 
You received this message because you are subscribed to the Google Groups 
"Puppet Bugs" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/puppet-bugs?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to