diff options
author | Eric Wong <normalperson@yhbt.net> | 2012-10-01 19:53:05 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2012-10-01 20:01:35 -0700 |
commit | a309f22f835afe0e6be0e4e2f1a13eaead7434f2 (patch) | |
tree | 4f2993378a92f4e6cbe8fc46ec100ba8d8a90439 | |
parent | 088a8541946b8e5379c1076c759ea56ab9bd7f0b (diff) | |
download | mogilefs-client-a309f22f835afe0e6be0e4e2f1a13eaead7434f2.tar.gz |
On an installation with 3000+ domains, get_domains gets bottlenecked by calling #grep on the keys of a hash. Allow specifying a "want" directive to filter in data we expect (instead of grepping blindly)
-rw-r--r-- | lib/mogilefs/admin.rb | 44 |
1 files changed, 28 insertions, 16 deletions
diff --git a/lib/mogilefs/admin.rb b/lib/mogilefs/admin.rb index 6a746ac..0a90cd6 100644 --- a/lib/mogilefs/admin.rb +++ b/lib/mogilefs/admin.rb @@ -151,7 +151,8 @@ class MogileFS::Admin < MogileFS::Client # "test" => { # "default" => { # "mindevcount" => 2, - # "replpolicy" => "MultipleHosts()" + # "replpolicy" => "MultipleHosts()", + # "hashtype => nil, # } # } # } @@ -166,12 +167,13 @@ class MogileFS::Admin < MogileFS::Client domains = {} to_i = %w(mindevcount) + want = %w(name replpolicy hashtype mindevcount) (1..res['domains'].to_i).each do |i| - domain = clean "domain#{i}classes", "domain#{i}class", res, false, to_i - - tmp = domains[res["domain#{i}"].freeze] = {} + domain = clean("domain#{i}classes", "domain#{i}class", res, false, to_i, + want) + tmp = domains[res["domain#{i}"]] = {} domain.each do |d| - tmp[d.delete("name").freeze] = d + tmp[d.delete("name")] = d have_replpolicy ||= d.include?("replpolicy") end end @@ -370,23 +372,33 @@ class MogileFS::Admin < MogileFS::Client # "altip"=>"", # "altmask"=>""}] - def clean(count, prefix, res, underscore = true, to_i = []) + def clean(count, prefix, res, underscore = true, to_i = [], want = nil) empty = "" underscore = underscore ? '_' : empty # convert array to hash for O(1) lookups to_i = to_i.inject({}) { |m,k| m[k] = m } - - keys = res.keys - (1..res[count].to_i).map do |i| - re = /^#{prefix}#{i}#{underscore}/ - row = {} - keys.grep(re).each do |k| - v = res[k] - k = k.sub(re, empty).freeze - row[k] = to_i.include?(k) ? (empty == v ? nil : v.to_i) : v + if want + (1..res[count].to_i).map do |i| + row = {} + want.each do |k| + v = res["#{prefix}#{i}#{underscore}#{k}"] or next + row[k] = to_i.include?(k) ? (empty == v ? nil : v.to_i) : v + end + row + end + else + keys = res.keys + (1..res[count].to_i).map do |i| + re = /^#{prefix}#{i}#{underscore}/ + row = {} + keys.grep(re).each do |k| + v = res[k] + k = k.sub(re, empty) + row[k] = to_i.include?(k) ? (empty == v ? nil : v.to_i) : v + end + row end - row end end |