about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2012-10-01 19:53:05 -0700
committerEric Wong <normalperson@yhbt.net>2012-10-01 20:01:35 -0700
commita309f22f835afe0e6be0e4e2f1a13eaead7434f2 (patch)
tree4f2993378a92f4e6cbe8fc46ec100ba8d8a90439
parent088a8541946b8e5379c1076c759ea56ab9bd7f0b (diff)
downloadmogilefs-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.rb44
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