client: small speedup for list_keys_verbose
authorEric Wong <normalperson@yhbt.net>
Tue, 9 Oct 2012 00:24:43 +0000 (9 00:24 +0000)
committerEric Wong <normalperson@yhbt.net>
Tue, 9 Oct 2012 00:33:14 +0000 (9 00:33 +0000)
Array#pop is faster than Array#shift in most Ruby versions
as the latter may require memmove() of all elements.
Additionally, ensure ordering is correct if a backend
chokes up (for each_file_info, too).

lib/mogilefs/mogilefs.rb

index 426217e..f5cb096 100644 (file)
@@ -131,7 +131,7 @@ class MogileFS::MogileFS < MogileFS::Client
            MogileFS::InvalidResponseError, # truncated response
            MogileFS::Timeout
       @backend.shutdown
-      keys = ordered - ready.keys
+      keys = (ordered - ready.keys).reverse!
       retry
     end while limit == nil || limit > 0
   rescue
@@ -390,7 +390,7 @@ class MogileFS::MogileFS < MogileFS::Client
 
   def list_keys_verbose(keys, block) # :nodoc:
     # emulate the MogileFS::Mysql interface, slowly...
-    ordered = keys.dup
+    ordered = keys.reverse
     ready = {}
     on_file_info = lambda do |info|
       Hash === info or raise info
@@ -398,8 +398,8 @@ class MogileFS::MogileFS < MogileFS::Client
 
       # deal with trackers with multiple queryworkers responding out-of-order
       ready[info["key"]] = info
-      while info = ready.delete(ordered[0])
-        block.call(ordered.shift, info["length"], info["devcount"])
+      while info = ready.delete(ordered[-1])
+        block.call(ordered.pop, info["length"], info["devcount"])
       end
     end
     opts = { :domain => @domain }
@@ -422,7 +422,7 @@ class MogileFS::MogileFS < MogileFS::Client
            MogileFS::InvalidResponseError, # truncated response
            MogileFS::Timeout
       @backend.shutdown
-      keys = ordered - ready.keys
+      keys = (ordered - ready.keys).reverse!
       retry
     rescue
       @backend.shutdown