Use one lock per database for issue627
This commit is contained in:
1 parent
62c35ebafc
commit
afe4768117
3 files changed
+25
-6
No files matched your search
@@ -1,3 +1,4 @@
|
||||
* Use one lock per database
|
||||
* Improve netrpc communication speed
|
||||
* Add contextual domain on inherited views
|
||||
* Allow to use globals in domain and states
|
||||
|
||||
+19
-5
@@ -5,6 +5,7 @@ import logging
|
||||
from threading import RLock
|
||||
|
||||
_LOCK = RLock()
|
||||
_LOCKS = {}
|
||||
_DB = {}
|
||||
_POOL = {}
|
||||
_POOL_WIZARD = {}
|
||||
@@ -15,6 +16,9 @@ def get_db_and_pool(db_name, update_module=False, wizard=False, report=False,
|
||||
|
||||
restart = False
|
||||
_LOCK.acquire()
|
||||
lock = _LOCKS.setdefault(db_name, RLock())
|
||||
_LOCK.release()
|
||||
lock.acquire()
|
||||
try:
|
||||
if db_name in _DB:
|
||||
database = _DB[db_name]
|
||||
@@ -51,7 +55,7 @@ def get_db_and_pool(db_name, update_module=False, wizard=False, report=False,
|
||||
restart = not load_modules(database, pool, pool_wizard, pool_report,
|
||||
update_module, lang)
|
||||
finally:
|
||||
_LOCK.release()
|
||||
lock.release()
|
||||
if restart:
|
||||
restart_pool(db_name)
|
||||
|
||||
@@ -63,16 +67,22 @@ def get_db_and_pool(db_name, update_module=False, wizard=False, report=False,
|
||||
|
||||
def restart_pool(db_name, update_module=False, lang=None):
|
||||
_LOCK.acquire()
|
||||
lock = _LOCKS.setdefault(db_name, RLock())
|
||||
_LOCK.release()
|
||||
lock.acquire()
|
||||
try:
|
||||
del _POOL[db_name]
|
||||
del _POOL_WIZARD[db_name]
|
||||
del _POOL_REPORT[db_name]
|
||||
finally:
|
||||
_LOCK.release()
|
||||
lock.release()
|
||||
return get_db_and_pool(db_name, update_module=update_module, lang=lang)
|
||||
|
||||
def close_db(db_name):
|
||||
_LOCK.acquire()
|
||||
lock = _LOCKS.setdefault(db_name, RLock())
|
||||
_LOCK.release()
|
||||
lock.acquire()
|
||||
try:
|
||||
if db_name in _DB:
|
||||
_DB[db_name].close()
|
||||
@@ -80,10 +90,14 @@ def close_db(db_name):
|
||||
if db_name in _POOL:
|
||||
del _POOL[db_name]
|
||||
finally:
|
||||
_LOCK.release()
|
||||
lock.release()
|
||||
|
||||
def get_db_only(db_name, verbose=True):
|
||||
def get_db_only(db_name, verbose=True, blocking=True):
|
||||
_LOCK.acquire()
|
||||
lock = _LOCKS.setdefault(db_name, RLock())
|
||||
_LOCK.release()
|
||||
if not lock.acquire(blocking):
|
||||
return None
|
||||
try:
|
||||
if db_name in _DB:
|
||||
database = _DB[db_name]
|
||||
@@ -94,7 +108,7 @@ def get_db_only(db_name, verbose=True):
|
||||
database = db_connect(db_name)
|
||||
_DB[db_name] = database
|
||||
finally:
|
||||
_LOCK.release()
|
||||
lock.release()
|
||||
return database
|
||||
|
||||
def get_db(db_name):
|
||||
|
||||
@@ -232,7 +232,11 @@ class DB(Service):
|
||||
"ORDER BY datname")
|
||||
res = []
|
||||
for db_name, in cursor.fetchall():
|
||||
cursor2 = pooler.get_db_only(db_name, verbose=False).cursor()
|
||||
database = pooler.get_db_only(db_name, verbose=False,
|
||||
blocking=False)
|
||||
if not database:
|
||||
continue
|
||||
cursor2 = database.cursor()
|
||||
if not cursor2.test():
|
||||
cursor2.close()
|
||||
pooler.close_db(db_name)
|
||||
|
||||
Reference in new issue
Block a user