This patch fixes the narrow problem of #4205, wherein type_loader would reparse
a file each time it was imported (causing the parser to incorrectly think that
it was in a loop) by checking @imported inside the existing check on the
thread-guarded @loaded.  (@imported was being set but never checked).

This works (and is thread safe) because all of this is going on inside a giant
synchronize care of @loaded.  But it, like the fix for #4208, does nothing
about the global lock.

Areas for future research:

1) Why is the looping inside of import?
2) Why are there separate @loaded and @imported tables?
3) Why is the parsing treated like a function (called deep in the structure)
   yet coded like a thread-savvy pseudo state monad (e.g. raising errors that
   presume it knows/owns what's going on outside the whole process)?

These and many other exciting questions are deferred to #4211

Signed-off-by: Markus Roberts <[email protected]>
---
 lib/puppet/parser/type_loader.rb |    6 ++++--
 1 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/lib/puppet/parser/type_loader.rb b/lib/puppet/parser/type_loader.rb
index 6c32f6a..cb8657f 100644
--- a/lib/puppet/parser/type_loader.rb
+++ b/lib/puppet/parser/type_loader.rb
@@ -51,8 +51,10 @@ class Puppet::Parser::TypeLoader
       unless file =~ /^#{File::SEPARATOR}/
         file = File.join(dir, file)
       end
-      @imported[file] = true
-      parse_file(file)
+      unless imported? file
+        @imported[file] = true
+        parse_file(file)
+      end
     end
 
     modname
-- 
1.6.4

-- 
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.

Reply via email to