Change in vdsm[master]: oop: Use a single instance of IOProcess per SD

ykaplan at redhat.com ykaplan at redhat.com
Thu Aug 14 10:17:12 UTC 2014


Yeela Kaplan has uploaded a new change for review.

Change subject: oop: Use a single instance of IOProcess per SD
......................................................................

oop: Use a single instance of IOProcess per SD

Next step after switching from RFH to IOPROC is to
use a single IOProcess instance for each SD.

Currently only a single IOProcess instance is used
for all SDs.

To avoid load on the system by holding many unused
IOProcesses we will maintain dictionary:
KEY - domainID, VALUE - (timestamp, IOPROC)
When IOProc for domainID is used we will renew the
timestamp, or delete the item from dictionary

We will also maintain another dictionary:
KEY - domainID, VALUE - IOPROC weakref,
that will allow us to check if IOPROC obj is
still alive or needs to be recreated.

Change-Id: I383fe617ee4ce22de368ba54f980887d70ff37c5
Bug-Url: https://bugzilla.redhat.com/show_bug.cgi?id=1126206
Signed-off-by: Yeela Kaplan <ykaplan at redhat.com>
---
M lib/vdsm/config.py.in
M vdsm/storage/outOfProcess.py
2 files changed, 36 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/01/31501/1

diff --git a/lib/vdsm/config.py.in b/lib/vdsm/config.py.in
index 69185e0..518d3ff 100644
--- a/lib/vdsm/config.py.in
+++ b/lib/vdsm/config.py.in
@@ -319,6 +319,8 @@
 
         ('process_pool_timeout', '60', None),
 
+        ('ioprocess_timeout', '60', 'TTL of IOProcess that is not renewed'),
+
         ('process_pool_max_slots_per_domain', '10', None),
 
         ('iscsi_default_ifaces', 'default',
diff --git a/vdsm/storage/outOfProcess.py b/vdsm/storage/outOfProcess.py
index 6230fad..e5c82af 100644
--- a/vdsm/storage/outOfProcess.py
+++ b/vdsm/storage/outOfProcess.py
@@ -24,6 +24,8 @@
 import stat
 import sys
 import types
+import time
+import weakref
 
 from vdsm import constants
 from vdsm.config import config
@@ -45,10 +47,13 @@
 _oopImpl = RFH
 
 DEFAULT_TIMEOUT = config.getint("irs", "process_pool_timeout")
+DEF_IOPROC_TIMEOUT = config.getint("irs", "ioprocess_timeout")
 HELPERS_PER_DOMAIN = config.getint("irs", "process_pool_max_slots_per_domain")
 
-_procLock = threading.Lock()
-_proc = {}
+_procPoolLock = threading.Lock()
+_procPool = {}
+_refProcPool = {}
+_rfhPool = {}
 
 log = logging.getLogger('oop')
 
@@ -63,18 +68,38 @@
 
 def getProcessPool(clientName):
     try:
-        return _proc[clientName]
+        if _oopImpl == IOPROC:
+            with _procPoolLock:
+                keys = sorted(_procPool, key=_procPool.get)
+                for k in keys:
+                    if (time.time() - _procPool[k][0]) > DEF_IOPROC_TIMEOUT:
+                        del _procPool[k]
+                    else:
+                        break
+
+                procref = _refProcPool[clientName]
+                proc = procref()
+                if proc is None:
+                    raise KeyError
+                else:
+                    _procPool[clientName] = (time.time(), proc)
+                    return proc
+        else:
+            return _rfhPool[clientName]
     except KeyError:
-        with _procLock:
+        with _procPoolLock:
             if _oopImpl == IOPROC:
-                if GLOBAL not in _proc:
-                    _proc[GLOBAL] = _OopWrapper(IOProcess(DEFAULT_TIMEOUT))
-                _proc[clientName] = _proc[GLOBAL]
+                proc = _OopWrapper(IOProcess(DEFAULT_TIMEOUT))
+                _procPool[clientName] = (time.time(), proc)
+                _refProcPool[clientName] = weakref.ref(proc)
+                procref = _refProcPool[clientName]
+
+                return procref()
             else:
-                _proc[clientName] = _OopWrapper(
+                _rfhPool[clientName] = _OopWrapper(
                     RemoteFileHandlerPool(HELPERS_PER_DOMAIN))
 
-            return _proc[clientName]
+                return _rfhPool[clientName]
 
 
 def getGlobalProcPool():


-- 
To view, visit http://gerrit.ovirt.org/31501
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I383fe617ee4ce22de368ba54f980887d70ff37c5
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Yeela Kaplan <ykaplan at redhat.com>


More information about the vdsm-patches mailing list