about summary refs log tree commit homepage
path: root/lib/mogilefs/mogilefs.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mogilefs/mogilefs.rb')
-rw-r--r--lib/mogilefs/mogilefs.rb32
1 files changed, 25 insertions, 7 deletions
diff --git a/lib/mogilefs/mogilefs.rb b/lib/mogilefs/mogilefs.rb
index d942373..a40c519 100644
--- a/lib/mogilefs/mogilefs.rb
+++ b/lib/mogilefs/mogilefs.rb
@@ -248,14 +248,29 @@ class MogileFS::MogileFS < MogileFS::Client
     keys = (1..res['key_count'].to_i).map { |i| res["key_#{i}"] }
     if block_given?
       # emulate the MogileFS::Mysql interface, slowly...
-      keys.each do |key|
-        begin
-          res = file_info(key)
-        rescue MogileFS::Backend::UnknownCommandError # MogileFS < 2.45
+      begin
+        opts = { :domain => @domain }
+        keys.each do |key|
+          opts[:key] = key
+          @backend.pipeline_dispatch(:file_info, opts) do |info|
+            if Hash === info
+              file_info_cleanup(info)
+              yield key, info["length"], info["devcount"]
+            else
+              raise info
+            end
+          end
+        end
+        @backend.pipeline_wait
+      rescue MogileFS::Backend::UnknownCommandError # MogileFS < 2.45
+        @backend.shutdown # reset the socket
+        keys.each do |key|
           paths = get_paths(key)
-          res = { "length" => paths_size(paths), "devcount" => paths.size }
+          yield key, paths_size(paths), paths.size
         end
-        yield key, res["length"], res["devcount"]
+      rescue
+        @backend.shutdown
+        raise
       end
     end
 
@@ -272,7 +287,10 @@ class MogileFS::MogileFS < MogileFS::Client
   def file_info(key, args = nil)
     opts = { :domain => @domain, :key => key }
     args and devices = args[:devices] and opts[:devices] = devices ? 1 : 0
-    rv = @backend.file_info(opts)
+    file_info_cleanup(@backend.file_info(opts))
+  end
+
+  def file_info_cleanup(rv)
     %w(fid length devcount).each { |f| rv[f] = rv[f].to_i }
     devids = rv["devids"] and
       rv["devids"] = devids.split(/,/).map! { |x| x.to_i }