From 29776f70fc61b7d1730f8224f0b74c832b316b7c Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Wed, 9 Aug 2023 16:30:42 +1200 Subject: [PATCH] Re-enable any queues that were disabled for background processing, on end This addresses what is likely an artificial scenario but essentially if these steps are followed twice within the same function - create a queue - run the queue via runAll The second time will fail because the queue was disabled & no re-enabled, despite being perisistent --- CRM/Queue/Runner.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/CRM/Queue/Runner.php b/CRM/Queue/Runner.php index dfbb37328ac3..33359009b4c7 100644 --- a/CRM/Queue/Runner.php +++ b/CRM/Queue/Runner.php @@ -214,6 +214,7 @@ public function runAll() { if ($taskResult['numberOfItems'] === 0) { $result = $this->handleEnd(); + $this->enableBackgroundExecution(); if (!empty($result['redirect_url'])) { CRM_Utils_System::redirect($result['redirect_url']); } @@ -521,4 +522,24 @@ protected function disableBackgroundExecution(): void { ]); } + /** + * Ensure that background workers will not try to run this queue. + */ + protected function enableBackgroundExecution(): void { + if (CRM_Core_Config::isUpgradeMode()) { + // Versions <=5.50 do not have `status` column. + if (!CRM_Core_DAO::checkTableExists('civicrm_queue') || !CRM_Core_BAO_SchemaHandler::checkIfFieldExists('civicrm_queue', 'status')) { + // The system doesn't have automatic background workers yet. Neither necessary nor possible to toggle `status`. + // See also: https://lab.civicrm.org/dev/core/-/issues/3653 + return; + } + } + + // If it was disabled for background processing & has not been otherwise altered then + // re-enable it as it might be a persistent queue. + CRM_Core_DAO::executeQuery('UPDATE civicrm_queue SET status = "active" WHERE name = %1 AND status IS NULL', [ + 1 => [$this->queue->getName(), 'String'], + ]); + } + }