From c9b77a973e1018d47a85b0bfbc9cdf07a1997b4a Mon Sep 17 00:00:00 2001
From: Rafael Monnerat <rafael@nexedi.com>
Date: Fri, 10 Aug 2012 19:06:38 +0900
Subject: [PATCH] Set socket timeout for taskdistributions RPC calls

If socket timeout is not set the call can never receive a response and
system become locked for ever waiting a reply from task distribution server.
---
 erp5/util/taskdistribution/__init__.py | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/erp5/util/taskdistribution/__init__.py b/erp5/util/taskdistribution/__init__.py
index baa60353a5..2891dcd8ab 100644
--- a/erp5/util/taskdistribution/__init__.py
+++ b/erp5/util/taskdistribution/__init__.py
@@ -95,16 +95,21 @@ def patchRPCParser(error_handler):
     parser_klass.feed = verbose_feed
 
 class RPCRetry(object):
-    def __init__(self, proxy, retry_time, logger):
+    def __init__(self, proxy, retry_time, logger, timeout=120):
         super(RPCRetry, self).__init__()
         self._proxy = proxy
         self._retry_time = retry_time
         self._logger = logger
         self.__rpc_lock = threading.Lock()
+        self.timeout = timeout
 
     def _RPC(self, func_id, args=()):
-        with self.__rpc_lock:
-            return getattr(self._proxy, func_id)(*args)
+            default_timeout = socket.getdefaulttimeout()
+            socket.setdefaulttimeout(self.timeout)
+            try:
+                return getattr(self._proxy, func_id)(*args)
+            finally:
+                socket.setdefaulttimeout(default_timeout)
 
     def _retryRPC(self, func_id, args=()):
         retry_time = self._retry_time
-- 
2.30.9