changeset f9982286317a in trytond:default
details: https://hg.tryton.org/trytond?cmd=changeset;node=f9982286317a
description:
        Store database pool per process

        The connection pool can not be shared between multiple processes.

        issue8281
        review285251002
diffstat:

 trytond/backend/postgresql/database.py |  14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diffs (55 lines):

diff -r e4f619ba9c25 -r f9982286317a trytond/backend/postgresql/database.py
--- a/trytond/backend/postgresql/database.py    Wed Jun 26 21:56:16 2019 +0200
+++ b/trytond/backend/postgresql/database.py    Thu Jun 27 21:45:37 2019 +0200
@@ -1,5 +1,6 @@
 # This file is part of Tryton.  The COPYRIGHT file at the top level of
 # this repository contains the full copyright notices and license terms.
+from collections import defaultdict
 import time
 import logging
 import os
@@ -108,7 +109,7 @@
 class Database(DatabaseInterface):
 
     _lock = RLock()
-    _databases = {}
+    _databases = defaultdict(dict)
     _connpool = None
     _list_cache = {}
     _list_cache_timestamp = {}
@@ -130,13 +131,14 @@
     def __new__(cls, name='template1'):
         with cls._lock:
             now = datetime.now()
-            for database in list(cls._databases.values()):
+            databases = cls._databases[os.getpid()]
+            for database in list(databases.values()):
                 if ((now - database._last_use).total_seconds() > _timeout
                         and database.name != name
                         and not database._connpool._used):
                     database.close()
-            if name in cls._databases:
-                inst = cls._databases[name]
+            if name in databases:
+                inst = databases[name]
             else:
                 if name == 'template1':
                     minconn = 0
@@ -147,7 +149,7 @@
                 inst._connpool = ThreadedConnectionPool(
                     minconn, _maxconn, **cls._connection_params(name),
                     cursor_factory=LoggingCursor)
-                cls._databases[name] = inst
+                databases[name] = inst
             inst._last_use = datetime.now()
             return inst
 
@@ -200,7 +202,7 @@
         with self._lock:
             logger.info('disconnect from "%s"', self.name)
             self._connpool.closeall()
-            self._databases.pop(self.name)
+            self._databases[os.getpid()].pop(self.name)
 
     @classmethod
     def create(cls, connection, database_name, template='template0'):

Reply via email to