diff -Nru facter-1.6.5/debian/changelog facter-1.6.5/debian/changelog --- facter-1.6.5/debian/changelog 2013-05-30 19:10:19.000000000 +0000 +++ facter-1.6.5/debian/changelog 2013-07-02 03:33:00.000000000 +0000 @@ -1,3 +1,10 @@ +facter (1.6.5-1ubuntu1.2) precise; urgency=low + + * d/p/thread-critical-freeze: fix "puppet apply" hang by avoiding + unnecessary thread critical sections (LP: #986973). + + -- Robie Basak Tue, 02 Jul 2013 03:21:36 +0000 + facter (1.6.5-1ubuntu1.1) precise; urgency=low * d/p/kvm-cpuinfo: detect "Common KVM processor" in /proc/cpuinfo as virtual diff -Nru facter-1.6.5/debian/patches/series facter-1.6.5/debian/patches/series --- facter-1.6.5/debian/patches/series 2013-05-30 19:10:19.000000000 +0000 +++ facter-1.6.5/debian/patches/series 2013-07-02 03:21:02.000000000 +0000 @@ -1,2 +1,3 @@ no-require-rubygems kvm-cpuinfo +thread-critical-freeze diff -Nru facter-1.6.5/debian/patches/thread-critical-freeze facter-1.6.5/debian/patches/thread-critical-freeze --- facter-1.6.5/debian/patches/thread-critical-freeze 1970-01-01 00:00:00.000000000 +0000 +++ facter-1.6.5/debian/patches/thread-critical-freeze 2013-07-02 03:21:07.000000000 +0000 @@ -0,0 +1,170 @@ +Bug: http://projects.puppetlabs.com/issues/12723 +Bug-Ubuntu: https://launchpad.net/bugs/986973 +Origin: https://github.com/puppetlabs/facter/commit/9ff4453b2f0843df887ae1ec2098a4336291df0c +Last-Update: 2013-07-02 +From: Timur Batyrshin +Date: Mon, 20 Feb 2012 16:16:07 +0400 +Subject: [PATCH] Removed exclusive threading + +I've experienced regular facter freezes on puppet apply. +Tracing back the freezes showed that they were produced by exclusive threads. +After I've removed the exclusive thread wrapper the facter stopped freezing. + +(FYI those were introduced by https://github.com/puppetlabs/facter/commit/c2aa5086ab55da9c708d962b84a1b85404fc6329) + +Note: there is a similar code in facter/processor.rb for Windows. I've left +that intact as I don't quite understand the ways Windows works. +--- + lib/facter/util/memory.rb | 22 +++++------- + lib/facter/util/processor.rb | 84 +++++++++++++++++++------------------------- + 2 files changed, 46 insertions(+), 60 deletions(-) + +--- a/lib/facter/util/memory.rb ++++ b/lib/facter/util/memory.rb +@@ -3,23 +3,19 @@ + ## + + module Facter::Memory +- require 'thread' +- + def self.meminfo_number(tag) + memsize = "" +- Thread::exclusive do +- size, scale = [0, ""] +- File.readlines("/proc/meminfo").each do |l| +- size, scale = [$1.to_f, $2] if l =~ /^#{tag}:\s+(\d+)\s+(\S+)/ +- # MemoryFree == memfree + cached + buffers +- # (assume scales are all the same as memfree) +- if tag == "MemFree" && +- l =~ /^(?:Buffers|Cached):\s+(\d+)\s+(?:\S+)/ +- size += $1.to_f +- end ++ size, scale = [0, ""] ++ File.readlines("/proc/meminfo").each do |l| ++ size, scale = [$1.to_f, $2] if l =~ /^#{tag}:\s+(\d+)\s+(\S+)/ ++ # MemoryFree == memfree + cached + buffers ++ # (assume scales are all the same as memfree) ++ if tag == "MemFree" && ++ l =~ /^(?:Buffers|Cached):\s+(\d+)\s+(?:\S+)/ ++ size += $1.to_f + end +- memsize = scale_number(size, scale) + end ++ memsize = scale_number(size, scale) + + memsize + end +--- a/lib/facter/util/processor.rb ++++ b/lib/facter/util/processor.rb +@@ -8,55 +8,47 @@ + model = Facter.value(:architecture) + case model + when "x86_64", "amd64", "i386", /parisc/, "hppa", "ia64" +- Thread::exclusive do +- File.readlines(cpuinfo).each do |l| +- if l =~ /processor\s+:\s+(\d+)/ +- processor_num = $1.to_i +- elsif l =~ /model name\s+:\s+(.*)\s*$/ +- processor_list[processor_num] = $1 unless processor_num == -1 +- processor_num = -1 +- elsif l =~ /processor\s+(\d+):\s+(.*)/ +- processor_num = $1.to_i +- processor_list[processor_num] = $2 unless processor_num == -1 +- end ++ File.readlines(cpuinfo).each do |l| ++ if l =~ /processor\s+:\s+(\d+)/ ++ processor_num = $1.to_i ++ elsif l =~ /model name\s+:\s+(.*)\s*$/ ++ processor_list[processor_num] = $1 unless processor_num == -1 ++ processor_num = -1 ++ elsif l =~ /processor\s+(\d+):\s+(.*)/ ++ processor_num = $1.to_i ++ processor_list[processor_num] = $2 unless processor_num == -1 + end + end + + when "ppc64" +- Thread::exclusive do +- File.readlines(cpuinfo).each do |l| +- if l =~ /processor\s+:\s+(\d+)/ +- processor_num = $1.to_i +- elsif l =~ /cpu\s+:\s+(.*)\s*$/ +- processor_list[processor_num] = $1 unless processor_num == -1 +- processor_num = -1 +- end ++ File.readlines(cpuinfo).each do |l| ++ if l =~ /processor\s+:\s+(\d+)/ ++ processor_num = $1.to_i ++ elsif l =~ /cpu\s+:\s+(.*)\s*$/ ++ processor_list[processor_num] = $1 unless processor_num == -1 ++ processor_num = -1 + end + end + + when /arm/ +- Thread::exclusive do +- File.readlines(cpuinfo).each do |l| +- if l =~ /Processor\s+:\s+(.+)/ ++ File.readlines(cpuinfo).each do |l| ++ if l =~ /Processor\s+:\s+(.+)/ ++ processor_num += 1 ++ processor_list[processor_num] = $1.chomp ++ elsif l =~ /processor\s+:\s+(\d+)\s*$/ ++ proc_num = $1.to_i ++ if proc_num != 0 + processor_num += 1 +- processor_list[processor_num] = $1.chomp +- elsif l =~ /processor\s+:\s+(\d+)\s*$/ +- proc_num = $1.to_i +- if proc_num != 0 +- processor_num += 1 +- processor_list[processor_num] = processor_list[processor_num-1] +- end ++ processor_list[processor_num] = processor_list[processor_num-1] + end + end + end + + when /sparc/ +- Thread::exclusive do +- File.readlines(cpuinfo).each do |l| +- if l =~ /cpu\s+:\s+(.*)\s*$/ +- processor_num += 1 +- processor_list[processor_num] = $1 +- end ++ File.readlines(cpuinfo).each do |l| ++ if l =~ /cpu\s+:\s+(.*)\s*$/ ++ processor_num += 1 ++ processor_list[processor_num] = $1 + end + end + end +@@ -67,18 +59,16 @@ + def self.enum_lsdev + processor_num = -1 + processor_list = {} +- Thread::exclusive do +- procs = Facter::Util::Resolution.exec('lsdev -Cc processor') +- if procs +- procs.each_line do |proc| +- if proc =~ /^proc(\d+)/ +- processor_num = $1.to_i +- # Not retrieving the frequency since AIX 4.3.3 doesn't support the +- # attribute and some people still use the OS. +- proctype = Facter::Util::Resolution.exec('lsattr -El proc0 -a type') +- if proctype =~ /^type\s+(\S+)\s+/ +- processor_list[processor_num] = $1 +- end ++ procs = Facter::Util::Resolution.exec('lsdev -Cc processor') ++ if procs ++ procs.each_line do |proc| ++ if proc =~ /^proc(\d+)/ ++ processor_num = $1.to_i ++ # Not retrieving the frequency since AIX 4.3.3 doesn't support the ++ # attribute and some people still use the OS. ++ proctype = Facter::Util::Resolution.exec('lsattr -El proc0 -a type') ++ if proctype =~ /^type\s+(\S+)\s+/ ++ processor_list[processor_num] = $1 + end + end + end