From 400bab9fcf167bc76710a260822e0b0e114c98fa Mon Sep 17 00:00:00 2001 From: Luke Kanies Date: Tue, 20 May 2008 23:12:06 -0500 Subject: Adding a timeout to fact retrieval, fixing #56. The timeout is currently 0.5 seconds, which should generally be enough time. --- lib/facter/util/fact.rb | 12 +++++++++++- spec/unit/util/fact.rb | 7 +++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/lib/facter/util/fact.rb b/lib/facter/util/fact.rb index c73dfbf..0b2d5b9 100644 --- a/lib/facter/util/fact.rb +++ b/lib/facter/util/fact.rb @@ -1,6 +1,8 @@ require 'facter' require 'facter/util/resolution' +require 'timeout' + class Facter::Util::Fact attr_accessor :name, :searching, :ldapname @@ -80,7 +82,15 @@ class Facter::Util::Fact next unless resolve.suitable? foundsuits = true - tmp = resolve.value + tmp = nil + begin + Timeout.timeout(0.5) do + tmp = resolve.value + end + rescue Timeout::Error => detail + warn "Timed out seeking value for %s" % self.name + next + end break tmp unless tmp.nil? or tmp == "" } diff --git a/spec/unit/util/fact.rb b/spec/unit/util/fact.rb index 1652032..cee70b9 100755 --- a/spec/unit/util/fact.rb +++ b/spec/unit/util/fact.rb @@ -121,6 +121,13 @@ describe Facter::Util::Fact do @fact.value.should be_nil end + + it "should timeout after 0.5 seconds" do + @fact.expects(:warn) + @fact.add { setcode { sleep 2; raise "This is a test" } } + + @fact.value.should be_nil + end end it "should have a method for flushing the cached fact" do -- cgit