[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