|
139 | 139 | from odoo.tools import config
|
140 | 140 |
|
141 | 141 | from . import queue_job_config
|
142 |
| -from .channels import ENQUEUED, NOT_DONE, ChannelManager |
| 142 | +from .channels import ENQUEUED, NOT_DONE, PENDING, ChannelManager |
143 | 143 |
|
144 | 144 | SELECT_TIMEOUT = 60
|
145 | 145 | ERROR_RECOVERY_DELAY = 5
|
@@ -296,6 +296,13 @@ def keep_alive(self):
|
296 | 296 | with closing(self.conn.cursor()) as cr:
|
297 | 297 | cr.execute(query)
|
298 | 298 |
|
| 299 | + def set_job_pending(self, uuid): |
| 300 | + with closing(self.conn.cursor()) as cr: |
| 301 | + cr.execute( |
| 302 | + "UPDATE queue_job SET state=%s, " "date_enqueued=NULL " "WHERE uuid=%s", |
| 303 | + (PENDING, uuid), |
| 304 | + ) |
| 305 | + |
299 | 306 | def set_job_enqueued(self, uuid):
|
300 | 307 | with closing(self.conn.cursor()) as cr:
|
301 | 308 | cr.execute(
|
@@ -358,6 +365,19 @@ def _query_requeue_dead_jobs(self):
|
358 | 365 | )
|
359 | 366 | FOR UPDATE SKIP LOCKED
|
360 | 367 | )
|
| 368 | + OR |
| 369 | + id in ( |
| 370 | + SELECT |
| 371 | + id |
| 372 | + FROM |
| 373 | + queue_job |
| 374 | + WHERE |
| 375 | + state = 'started' AND NOT EXISTS ( |
| 376 | + SELECT 1 FROM queue_job_lock |
| 377 | + WHERE queue_job_id = queue_job.id |
| 378 | + ) |
| 379 | + FOR UPDATE SKIP LOCKED |
| 380 | + ) |
361 | 381 | RETURNING uuid
|
362 | 382 | """
|
363 | 383 |
|
@@ -467,6 +487,18 @@ def initialize_databases(self):
|
467 | 487 | self.db_by_name[db_name] = db
|
468 | 488 | with db.select_jobs("state in %s", (NOT_DONE,)) as cr:
|
469 | 489 | for job_data in cr:
|
| 490 | + # In case we have enqueued jobs we move them to pending, |
| 491 | + # otherwise they remain enqueued and occupy channels slots. |
| 492 | + if job_data[6] == "enqueued": |
| 493 | + try: |
| 494 | + self.db_by_name[db_name].set_job_pending(job_data[1]) |
| 495 | + job_data = (*job_data[:6], "pending") |
| 496 | + except Exception: |
| 497 | + _logger.warning( |
| 498 | + "error setting job %s to pending", |
| 499 | + job_data[1], |
| 500 | + exc_info=True, |
| 501 | + ) |
470 | 502 | self.channel_manager.notify(db_name, *job_data)
|
471 | 503 | _logger.info("queue job runner ready for db %s", db_name)
|
472 | 504 |
|
|
0 commit comments