about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-11-10 09:22:49 +0000
committerEric Wong <normalperson@yhbt.net>2011-11-10 09:22:49 +0000
commit7b4f4a079e1fa86aab41b7d8238ca07593159eb9 (patch)
tree7c2b40a0e7c2cbcc70efd3512b397a6d0bf05035
parentfebf8fc2aab898218333e245bab4bda972de5692 (diff)
downloadmogilefs-client-7b4f4a079e1fa86aab41b7d8238ca07593159eb9.tar.gz
Each backend could have a different story to tell
-rw-r--r--lib/mogilefs.rb4
-rw-r--r--lib/mogilefs/backend.rb12
2 files changed, 8 insertions, 8 deletions
diff --git a/lib/mogilefs.rb b/lib/mogilefs.rb
index 9ed0a32..506d64b 100644
--- a/lib/mogilefs.rb
+++ b/lib/mogilefs.rb
@@ -23,9 +23,7 @@ module MogileFS
   class UnsupportedPathError < Error; end
   class RequestTruncatedError < Error; end
   class InvalidResponseError < Error; end
-  class UnreachableBackendError < Error
-    def message; "couldn't connect to mogilefsd backend"; end
-  end
+  class UnreachableBackendError < Error; end
 
   # IO.copy_stream was buggy in Ruby 1.9.2 and earlier
   if RUBY_VERSION >= "1.9.3"
diff --git a/lib/mogilefs/backend.rb b/lib/mogilefs/backend.rb
index 8b9dc6d..17f7b67 100644
--- a/lib/mogilefs/backend.rb
+++ b/lib/mogilefs/backend.rb
@@ -170,8 +170,8 @@ class MogileFS::Backend
         io = socket
         begin
           io.timed_write(request, @timeout)
-        rescue SystemCallError
-          @dead[@active_host] = Time.now
+        rescue SystemCallError => err
+          @dead[@active_host] = [ Time.now, err ]
           shutdown_unlocked
           io = socket
           retry
@@ -240,21 +240,23 @@ class MogileFS::Backend
     now = Time.now
 
     @hosts.shuffle.each do |host|
-      next if @dead.include? host and @dead[host] > now - 5
+      next if @dead.include?(host) and @dead[host][0] > now - 5
 
       begin
         addr, port = host.split(/:/)
         @socket = MogileFS::Socket.tcp(addr, port, @timeout)
         @active_host = host
       rescue SystemCallError, MogileFS::Timeout => err
-        @dead[host] = now
+        @dead[host] = [ now, err ]
         next
       end
 
       return @socket
     end
 
-    raise MogileFS::UnreachableBackendError
+    errors = @dead.map { |host,(_,e)| "#{host} - #{e.message} (#{e.class})" }
+    raise MogileFS::UnreachableBackendError,
+          "couldn't connect to any tracker: #{errors.join(', ')}"
   end
 
   ##