|
14 | 14 | from multiprocessing import cpu_count
|
15 | 15 |
|
16 | 16 | try:
|
17 |
| - from concurrent.futures import ThreadPoolExecutor |
| 17 | + from concurrent.futures import ThreadPoolExecutor # noqa: I001 |
| 18 | + import concurrent |
18 | 19 | except ImportError:
|
19 | 20 | ThreadPoolExecutor = None
|
20 | 21 |
|
|
29 | 30 | pass
|
30 | 31 |
|
31 | 32 | import psycopg2
|
32 |
| -from psycopg2 import sql |
| 33 | +from psycopg2 import errorcodes, sql |
33 | 34 |
|
34 | 35 | try:
|
35 | 36 | from odoo.sql_db import db_connect
|
@@ -117,17 +118,34 @@ def execute(query):
|
117 | 118 |
|
118 | 119 | cr.commit()
|
119 | 120 |
|
| 121 | + CONCURRENCY_ERRORCODES = {errorcodes.DEADLOCK_DETECTED} |
| 122 | + failed_queries = [] |
| 123 | + tot_cnt = 0 |
120 | 124 | with ThreadPoolExecutor(max_workers=max_workers) as executor:
|
121 |
| - return sum( |
122 |
| - log_progress( |
123 |
| - executor.map(execute, queries), |
124 |
| - logger, |
125 |
| - qualifier="queries", |
126 |
| - size=len(queries), |
127 |
| - estimate=False, |
128 |
| - log_hundred_percent=True, |
129 |
| - ) |
130 |
| - ) |
| 125 | + future_queries = {executor.submit(execute, q): q for q in queries} |
| 126 | + for future in log_progress( |
| 127 | + concurrent.futures.as_completed(future_queries), |
| 128 | + logger, |
| 129 | + qualifier="queries", |
| 130 | + size=len(queries), |
| 131 | + estimate=False, |
| 132 | + log_hundred_percent=True, |
| 133 | + ): |
| 134 | + try: |
| 135 | + tot_cnt += future.result() |
| 136 | + except psycopg2.OperationalError as exc: |
| 137 | + if exc.pgcode not in CONCURRENCY_ERRORCODES: |
| 138 | + raise |
| 139 | + |
| 140 | + # to be retried without concurrency |
| 141 | + failed_queries.append(future_queries[future]) |
| 142 | + |
| 143 | + if failed_queries: |
| 144 | + logger.warning("Serialize queries that failed due to concurrency issues") |
| 145 | + tot_cnt += _parallel_execute_serial(cr, failed_queries, logger=logger) |
| 146 | + cr.commit() |
| 147 | + |
| 148 | + return tot_cnt |
131 | 149 |
|
132 | 150 | else:
|
133 | 151 | _parallel_execute_threaded = _parallel_execute_serial
|
|
0 commit comments