From 828a7dd7eda4e6b941f895e3de24bd63b8ac40fc Mon Sep 17 00:00:00 2001
From: Kazuhiko Shiozaki <kazuhiko@nexedi.com>
Date: Wed, 29 Sep 2010 21:17:16 +0000
Subject: [PATCH] if memcached connection is lost, recreate the connection and
 try once more.

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@38772 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Type/Tool/MemcachedTool.py | 34 +++++++++++++++++++-------
 1 file changed, 25 insertions(+), 9 deletions(-)

diff --git a/product/ERP5Type/Tool/MemcachedTool.py b/product/ERP5Type/Tool/MemcachedTool.py
index b866ff3716..6f86a3d095 100644
--- a/product/ERP5Type/Tool/MemcachedTool.py
+++ b/product/ERP5Type/Tool/MemcachedTool.py
@@ -94,14 +94,19 @@ if memcache is not None:
       """
       self.local_cache = {}
       self.scheduled_action_dict = {}
-      init_dict = {}
       self.server_list = server_list
       self.expiration_time = expiration_time
-      if server_max_key_length is not MARKER:
-        init_dict['server_max_key_length'] = server_max_key_length
-      if server_max_value_length is not MARKER:
-        init_dict['server_max_value_length'] = server_max_value_length
-      self.memcached_connection = memcache.Client(server_list, **init_dict)
+      self.server_max_key_length = server_max_key_length
+      self.server_max_value_length = server_max_value_length
+      self._initialiseConnection()
+
+    def _initialiseConnection(self):
+      init_dict = {}
+      if self.server_max_key_length is not MARKER:
+        init_dict['server_max_key_length'] = self.server_max_key_length
+      if self.server_max_value_length is not MARKER:
+        init_dict['server_max_value_length'] = self.server_max_value_length
+      self.memcached_connection = memcache.Client(self.server_list, **init_dict)
 
     def __del__(self):
       """
@@ -127,11 +132,19 @@ if memcache is not None:
                                                     self.local_cache[key], 
                                                     self.expiration_time)
             if not succeed:
-              LOG('MemcacheTool', 0, 'set command to memcached server (%r) failed' % (self.server_list,))
+              self._initialiseConnection()
+              succeed = self.memcached_connection.set(encodeKey(key),
+                                                      self.local_cache[key], 
+                                                      self.expiration_time)
+              if not succeed:
+                LOG('MemcacheTool', 0, 'set command to memcached server (%r) failed' % (self.server_list,))
           elif action is DELETE_ACTION:
             succeed = self.memcached_connection.delete(encodeKey(key), 0)
             if not succeed:
-              LOG('MemcacheTool', 0, 'delete command to memcached server (%r) failed' % (self.server_list,))
+              self._initialiseConnection()
+              succeed = self.memcached_connection.delete(encodeKey(key), 0)
+              if not succeed:
+                LOG('MemcacheTool', 0, 'delete command to memcached server (%r) failed' % (self.server_list,))
       except:
         LOG('MemcachedDict', 0, 'An exception occured during _finish : %s' % (traceback.format_exc(), ))
       self.scheduled_action_dict.clear()
@@ -156,7 +169,10 @@ if memcache is not None:
       if result is MARKER:
         result = self.memcached_connection.get(encoded_key)
         if result is None:
-          raise KeyError, 'Key %s (was %s) not found.' % (encoded_key, key)
+          self._initialiseConnection()
+          result = self.memcached_connection.get(encoded_key)
+          if result is None:
+            raise KeyError, 'Key %s (was %s) not found.' % (encoded_key, key)
         self.local_cache[key] = result
       return result
 
-- 
2.30.9