changeset a78b19372dbb in trytond:6.2
details: https://hg.tryton.org/trytond?cmd=changeset&node=a78b19372dbb
description:
        Initialize the pool before running queue or cron tasks

        issue11400
        review384981002
        (grafted from b52363a1d96234cf8cf0f955a12752c5a22f6508)
diffstat:

 trytond/cron.py   |   5 +++++
 trytond/worker.py |  28 ++++++++++++++++++----------
 2 files changed, 23 insertions(+), 10 deletions(-)

diffs (94 lines):

diff -r db9e12d44720 -r a78b19372dbb trytond/cron.py
--- a/trytond/cron.py   Mon Apr 18 19:40:01 2022 +0200
+++ b/trytond/cron.py   Tue Apr 19 13:21:42 2022 +0200
@@ -5,6 +5,7 @@
 import logging
 
 from trytond.pool import Pool
+from trytond.transaction import Transaction
 
 __all__ = ['run']
 logger = logging.getLogger(__name__)
@@ -27,7 +28,11 @@
                 logger.info(
                     'skip "%s" as previous cron still running', db_name)
                 continue
+            database_list = Pool.database_list()
             pool = Pool(db_name)
+            if db_name not in database_list:
+                with Transaction().start(db_name, 0, readonly=True):
+                    pool.init()
             Cron = pool.get('ir.cron')
             thread = threading.Thread(
                     target=Cron.run,
diff -r db9e12d44720 -r a78b19372dbb trytond/worker.py
--- a/trytond/worker.py Mon Apr 18 19:40:01 2022 +0200
+++ b/trytond/worker.py Tue Apr 19 13:21:42 2022 +0200
@@ -22,19 +22,22 @@
 
 
 class Queue(object):
-    def __init__(self, pool, mpool):
-        self.database = backend.Database(pool.database_name).connect()
+    def __init__(self, database_name, mpool):
+        self.database = backend.Database(database_name).connect()
         self.connection = self.database.get_connection(autocommit=True)
-        self.pool = pool
         self.mpool = mpool
 
     def pull(self, name=None):
-        Queue = self.pool.get('ir.queue')
+        database_list = Pool.database_list()
+        pool = Pool(self.database.name)
+        if self.database.name not in database_list:
+            with Transaction().start(self.database.name, 0, readonly=True):
+                pool.init()
+        Queue = pool.get('ir.queue')
         return Queue.pull(self.database, self.connection, name=name)
 
     def run(self, task_id):
-        return self.mpool.apply_async(
-            run_task, (self.pool.database_name, task_id))
+        return self.mpool.apply_async(run_task, (self.database.name, task_id))
 
 
 class TaskList(list):
@@ -55,8 +58,9 @@
         processes = 1
     logger.info("start %d workers", processes)
     mpool = MPool(
-        processes, initializer, (options,), options.maxtasksperchild)
-    queues = [Queue(pool, mpool) for pool in initializer(options, False)]
+        processes, initializer, (options.database_names,),
+        options.maxtasksperchild)
+    queues = [Queue(name, mpool) for name in options.database_names]
 
     tasks = TaskList()
     timeout = options.timeout
@@ -82,12 +86,12 @@
         mpool.close()
 
 
-def initializer(options, worker=True):
+def initializer(database_names, worker=True):
     if worker:
         signal.signal(signal.SIGINT, signal.SIG_IGN)
     pools = []
     database_list = Pool.database_list()
-    for database_name in options.database_names:
+    for database_name in database_names:
         pool = Pool(database_name)
         if database_name not in database_list:
             with Transaction().start(database_name, 0, readonly=True):
@@ -98,7 +102,11 @@
 
 def run_task(pool, task_id):
     if not isinstance(pool, Pool):
+        database_list = Pool.database_list()
         pool = Pool(pool)
+        if pool.database_name not in database_list:
+            with Transaction().start(pool.database_name, 0, readonly=True):
+                pool.init()
     Queue = pool.get('ir.queue')
     Error = pool.get('ir.error')
     name = '<Task %s@%s>' % (task_id, pool.database_name)

Reply via email to