--- memcache.rb.orig	2006-10-18 22:09:31.000000000 +0100
+++ memcache.rb	2006-10-18 23:01:55.000000000 +0100
@@ -45,6 +45,7 @@
     :namespace   => nil,
     :readonly    => false,
     :multithread => false,
+    :auto_reconnect => false,
   }
 
   ##
@@ -111,6 +112,11 @@
     @mutex       = Mutex.new if @multithread
     self.servers = servers
     @buckets     = []
+    @auto_reconnect = opts[:auto_reconnect]
+  end
+
+  def auto_reconnect?
+    @auto_reconnect
   end
 
   ##
@@ -175,7 +181,9 @@
     cache_key = make_cache_key key
     server = get_server_for_key cache_key
 
-    raise MemCacheError, 'No connection to server' if server.socket.nil?
+    sock = server.socket
+    sock = server.socket(true) if sock.nil? and auto_reconnect?
+    raise MemCacheError, 'No connection to server' if sock.nil?
 
     value = if @multithread then
               threadsafe_cache_get server, cache_key
@@ -188,10 +196,19 @@
     # Return the unmarshaled value.
     return Marshal.load(value)
   rescue ArgumentError, TypeError, SystemCallError, IOError => err
+    if err.message.eql?('Broken pipe') and auto_reconnect?
+      begin
+        sock = server.socket(true)
+        raise MemCacheError, "No connection to server" if sock.nil?
+        sock.write command
+        return sock.gets
+      rescue
+        server.close
+        raise coerce_error(err, MemCacheError)
+      end
+    end
     server.close
-    new_err = MemCacheError.new err.message
-    new_err.set_backtrace err.backtrace
-    raise new_err
+    raise coerce_error(err, MemCacheError)
   end
 
   ##
@@ -216,6 +233,7 @@
     server = get_server_for_key(cache_key)
 
     sock = server.socket
+    sock = server.socket(true) if sock.nil? and auto_reconnect?
     raise MemCacheError, "No connection to server" if sock.nil?
 
     marshaled_value = Marshal.dump value
@@ -225,6 +243,17 @@
       sock.write command
       sock.gets
     rescue SystemCallError, IOError => err
+      if err.message.eql?('Broken pipe') and auto_reconnect?
+        begin
+          sock = server.socket(true)
+          raise MemCacheError, "No connection to server" if sock.nil?
+          sock.write command
+          return sock.gets
+        rescue
+          server.close
+          raise MemCacheError, err.message
+        end
+      end
       server.close
       raise MemCacheError, err.message
     end
@@ -243,12 +272,26 @@
     server = get_server_for_key cache_key
 
     sock = server.socket
+    sock = server.socket(true) if sock.nil? and auto_reconnect?
     raise MemCacheError, "No connection to server" if sock.nil?
 
+    command = "delete #{cache_key} #{expiry}\r\n"
+
     begin
-      sock.write "delete #{cache_key} #{expiry}\r\n"
+      sock.write command
       sock.gets
     rescue SystemCallError, IOError => err
+      if err.message.eql?('Broken pipe') and auto_reconnect?
+        begin
+          sock = server.socket(true)
+          raise MemCacheError, "No connection to server" if sock.nil?
+          sock.write command
+          return sock.gets
+        rescue
+          server.close
+          raise MemCacheError, err.message
+        end
+      end
       server.close
       raise MemCacheError, err.message
     end
@@ -280,6 +323,12 @@
 
   protected unless $TESTING
 
+  def coerce_error(err, klass) #:nodoc:
+    new_err = klass.new err.message
+    new_err.set_backtrace err.backtrace
+    new_err
+  end
+
   ##
   # Create a key for the cache, incorporating the namespace qualifier if
   # requested.
@@ -428,14 +477,14 @@
     # Try to connect to the memcached server targeted by this object.
     # Returns the connected socket object on success or nil on failure.
 
-    def socket
+    def socket(force=false)
       @mutex.lock if @multithread
-      return @sock if @sock and not @sock.closed?
+      return @sock if @sock and not @sock.closed? and not force
 
       @sock = nil
 
       # If the host was dead, don't retry for a while.
-      return if @retry and @retry > Time.now
+      return if @retry and @retry > Time.now and not force
 
       # Attempt to connect if not already connected.
       begin
