[Erp5-report] r13609 - in /erp5/trunk/utils/oood: pool.py serw.py worker.py

nobody at svn.erp5.org nobody at svn.erp5.org
Sat Mar 24 17:47:15 CET 2007


Author: bartek
Date: Sat Mar 24 17:47:13 2007
New Revision: 13609

URL: http://svn.erp5.org?rev=13609&view=rev
Log:
Fixed a bug: if a worker finished its job after a timeout, it was not available but still released the semaphore, thus putting semaphore and pool out of sync.

Modified:
    erp5/trunk/utils/oood/pool.py
    erp5/trunk/utils/oood/serw.py
    erp5/trunk/utils/oood/worker.py

Modified: erp5/trunk/utils/oood/pool.py
URL: http://svn.erp5.org/erp5/trunk/utils/oood/pool.py?rev=13609&r1=13608&r2=13609&view=diff
==============================================================================
--- erp5/trunk/utils/oood/pool.py (original)
+++ erp5/trunk/utils/oood/pool.py Sat Mar 24 17:47:13 2007
@@ -71,7 +71,8 @@
     w=None
     self.acquire() # wait untill something is free
     for idx in range(self.total):
-      if not self.inst[idx].busy:
+      candidate = self.inst[idx]
+      if not candidate.busy and not candidate.dead:
         w=self.inst[idx]
         break
     if w is None: # means semaphore is out of sync with pool
@@ -100,6 +101,7 @@
       print 'That takes too long !'
       lib.log('Instance %s not responding - restart it' % i, 3)
       start.killInstance(i)
+      self._killWorker(i)
       start.startInstance(i)
       # give it time to load before we try to connect
       time.sleep(config.instance_load_time)
@@ -110,6 +112,9 @@
   def _mkWorker(self, i):
     self.inst[i] = (factory.builder.build(self, i))
 
+  def _killWorker(self, i):
+    self.inst[i].dead = True
+
 pool = Pool()
 
 # vim: shiftwidth=2

Modified: erp5/trunk/utils/oood/serw.py
URL: http://svn.erp5.org/erp5/trunk/utils/oood/serw.py?rev=13609&r1=13608&r2=13609&view=diff
==============================================================================
--- erp5/trunk/utils/oood/serw.py (original)
+++ erp5/trunk/utils/oood/serw.py Sat Mar 24 17:47:13 2007
@@ -153,8 +153,7 @@
       if kw.get('newfilename') is not None:
         self._safeRemove(self._mkName(kw['newfilename']))
     finally:
-      if w is not None:
-        w.setFree()
+      w.setFree()
 
   def _wrap(self,funcname):
     '''wrap function execute _pre and _post if newfname,
@@ -197,6 +196,7 @@
         return kw
       # let's get to work
       kw=dict(zip(argtpl,args))
+      w = None # initialize worker variable
       try:
         try:
           id,w=self._pre(kw)
@@ -212,7 +212,9 @@
           raise e
       finally:
         try:
-          self._post(w,kw)
+          if w is not None:
+            # do cleanup only if worker has been created
+            self._post(w,kw)
         except Exception,e:
           print e
           traceback.print_tb(sys.exc_info()[2])

Modified: erp5/trunk/utils/oood/worker.py
URL: http://svn.erp5.org/erp5/trunk/utils/oood/worker.py?rev=13609&r1=13608&r2=13609&view=diff
==============================================================================
--- erp5/trunk/utils/oood/worker.py (original)
+++ erp5/trunk/utils/oood/worker.py Sat Mar 24 17:47:13 2007
@@ -76,6 +76,7 @@
   metafields=('title','subject','keywords','description','MIMEType')
   userfields=('reference','version','language')
   busy=False
+  dead = False
 
   def __init__(self,idx,desktop,pool=None):
     self.idx=idx
@@ -91,8 +92,8 @@
   def setFree(self):
     '''marks self as not busy, releases semaphore in the 
     pool object'''
-    self.busy=False
-    if self.pool is not None:
+    if not self.dead:
+      self.busy=False
       self.pool.release(self.idx)
 
   def convert(self,kw):




More information about the Erp5-report mailing list