Skip to content

Commit 2663141

Browse files
committed
Use a single FacterDB.get_facts call
The major cost is FacterDB.get_facts. Instead of calling it once for every OS version this instead calls it once with a complex filter. It then uses JGrep to simulate another smaller DB and futher query that. In my non-scientific test this reduces the load time of puppet-example from 3.5 to 2.5 seconds.
1 parent 5c92f4f commit 2663141

File tree

2 files changed

+16
-4
lines changed

2 files changed

+16
-4
lines changed

lib/rspec-puppet-facts.rb

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,11 +118,21 @@ def on_supported_os_implementation(opts = {})
118118
loose_requirement = RspecPuppetFacts::facter_version_to_loose_requirement(facterversion)
119119
received_facts = []
120120

121+
db = FacterDB.get_facts(filter)
122+
unless db.any?
123+
RspecPuppetFacts.warning "No facts were found in the FacterDB for: #{filter.inspect}"
124+
return {}
125+
end
126+
121127
# FacterDB may have newer versions of facter data for which it contains a subset of all possible
122128
# facter data (see FacterDB 0.5.2 for Facter releases 3.8 and 3.9). In this situation we need to
123129
# cycle through and downgrade Facter versions per platform type until we find matching Facter data.
124130
filter.each do |filter_spec|
125-
versions = FacterDB.get_facts(filter_spec).to_h { |facts| [Gem::Version.new(facts[:facterversion]), facts] }
131+
versions = JGrep.jgrep(db.to_json, FacterDB.generate_filter_str(filter_spec)) \
132+
.to_h do |facts|
133+
result = facts.to_h { |k, v| [k.to_sym, v] }
134+
[Gem::Version.new(result[:facterversion]), result]
135+
end
126136

127137
version, facts = versions.select { |v, _f| strict_requirement =~ v }.max_by { |v, _f| v }
128138

spec/rspec_puppet_facts_spec.rb

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -854,11 +854,13 @@
854854
end
855855

856856
before do
857-
allow(FacterDB).to receive(:get_facts).and_call_original
858857
allow(FacterDB).to receive(:get_facts).with(
859-
{:operatingsystem=>"CentOS", :operatingsystemrelease=>"/^7/", :hardwaremodel=>"x86_64"},
858+
[
859+
{:operatingsystem=>"CentOS", :operatingsystemrelease=>"/^7/", :hardwaremodel=>"x86_64"},
860+
{:operatingsystem=>"OpenSuSE", :operatingsystemrelease=>"/^42/", :hardwaremodel=>"x86_64"},
861+
],
860862
).and_wrap_original do |m, *args|
861-
m.call(*args).reject { |facts| facts[:facterversion].start_with?('3.9.') }
863+
m.call(*args).reject { |facts| facts[:operatingsystem] == 'CentOS' && facts[:facterversion].start_with?('3.9.') }
862864
end
863865
end
864866

0 commit comments

Comments
 (0)