summaryrefslogtreecommitdiffstats
path: root/nova/process.py
diff options
context:
space:
mode:
authorEwan Mellor <ewan.mellor@citrix.com>2010-07-25 15:00:37 +0100
committerEwan Mellor <ewan.mellor@citrix.com>2010-07-25 15:00:37 +0100
commit1a53eaeed901f3c789ebdb867b73996ccac608c3 (patch)
treecf3bbf0a06ba4c9966bda7188261868c165ec101 /nova/process.py
parent7050e7e49e8aad3ff3f5d0060c96ff97d9c2852f (diff)
downloadnova-1a53eaeed901f3c789ebdb867b73996ccac608c3.tar.gz
nova-1a53eaeed901f3c789ebdb867b73996ccac608c3.tar.xz
nova-1a53eaeed901f3c789ebdb867b73996ccac608c3.zip
Fix assertion "Someone released me too many times: too many tokens!" when more
than one process was running at the same time. This was caused by the override of SharedPool.__new__ not stopping ProcessPool.__init__ from being run whenever process.simple_execute is called. When __init__ ran for the second time, the DeferredSemaphore was replaced, and this meant that we ended up releasing a different semaphore to the one that was acquired.
Diffstat (limited to 'nova/process.py')
-rw-r--r--nova/process.py13
1 files changed, 6 insertions, 7 deletions
diff --git a/nova/process.py b/nova/process.py
index d3558ed2e..8ecef1584 100644
--- a/nova/process.py
+++ b/nova/process.py
@@ -205,13 +205,12 @@ class ProcessPool(object):
self._pool.release()
return rv
-class SharedPool(ProcessPool):
- _instance = None
- def __new__(cls, *args, **kwargs):
- if not cls._instance:
- cls._instance = super(SharedPool, cls).__new__(
- cls, *args, **kwargs)
- return cls._instance
+_instance = None
+def SharedPool():
+ global _instance
+ if _instance is None:
+ _instance = ProcessPool()
+ return _instance
def simple_execute(cmd, **kwargs):
return SharedPool().simple_execute(cmd, **kwargs)