From a2f9e4b8d14d764e66dfacfd8866b39da99016ba Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Tue, 28 Sep 2021 22:21:27 +0100 Subject: [PATCH 01/10] Set process title when running cron job --- app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 0f266b5d62d83..b5eb6fdc85a17 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -339,6 +339,7 @@ protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, ); } + cli_set_process_title("Magento cron - group=$groupId - job=$jobCode"); $schedule->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', $this->dateTime->gmtTimestamp())); $this->retrier->execute( function () use ($schedule) { From 0ac321b79ba079a5c4bec42b1d770e10364c8726 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Thu, 30 Sep 2021 22:58:49 +0100 Subject: [PATCH 02/10] Preserve (most of the) original command line title --- .../Observer/ProcessCronQueueObserver.php | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index b5eb6fdc85a17..00d2a4d68f41c 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -9,6 +9,7 @@ */ namespace Magento\Cron\Observer; +use Laminas\Http\PhpEnvironment\Request; use Magento\Cron\Model\ResourceModel\Schedule\Collection as ScheduleCollection; use Magento\Cron\Model\Schedule; use Magento\Framework\App\State; @@ -128,6 +129,16 @@ class ProcessCronQueueObserver implements ObserverInterface */ protected $dateTime; + /** + * @var Request + */ + protected Request $environment; + + /** + * @var string + */ + protected string $originalProcessTitle; + /** * @var \Symfony\Component\Process\PhpExecutableFinder */ @@ -201,7 +212,8 @@ public function __construct( StatFactory $statFactory, \Magento\Framework\Lock\LockManagerInterface $lockManager, \Magento\Framework\Event\ManagerInterface $eventManager, - DeadlockRetrierInterface $retrier + DeadlockRetrierInterface $retrier, + Request $environment ) { $this->_objectManager = $objectManager; $this->_scheduleFactory = $scheduleFactory; @@ -211,6 +223,7 @@ public function __construct( $this->_request = $request; $this->_shell = $shell; $this->dateTime = $dateTime; + $this->environment = $environment; $this->phpExecutableFinder = $phpExecutableFinderFactory->create(); $this->logger = $logger; $this->state = $state; @@ -339,7 +352,17 @@ protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, ); } - cli_set_process_title("Magento cron - group=$groupId - job=$jobCode"); + if (!isset($this->originalProcessTitle)) { + $this->originalProcessTitle = implode(' ', $this->environment->getServer('argv')); + } + + if (strpos($this->originalProcessTitle, " --group=$groupId ") !== false) { + // Group is already shown, so no need to include here in duplicate + cli_set_process_title($this->originalProcessTitle . " # job: $jobCode"); + } else { + cli_set_process_title($this->originalProcessTitle . " # group: $groupId, job: $jobCode"); + } + $schedule->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', $this->dateTime->gmtTimestamp())); $this->retrier->execute( function () use ($schedule) { From 3613f8096fbd3faa7add9ad8611dfe413d7fba72 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Thu, 30 Sep 2021 23:00:50 +0100 Subject: [PATCH 03/10] Correct docblock --- app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 00d2a4d68f41c..80106512b7809 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -195,6 +195,7 @@ class ProcessCronQueueObserver implements ObserverInterface * @param \Magento\Framework\Lock\LockManagerInterface $lockManager * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param DeadlockRetrierInterface $retrier + * @param Request $environment * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( From 55bf25eb5af5440b5330d19a6fcabb3a8fe5635d Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Fri, 1 Oct 2021 22:34:41 +0100 Subject: [PATCH 04/10] Include PHP_BINARY in process title --- app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 80106512b7809..77e33fbfbf0d2 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -354,7 +354,7 @@ protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, } if (!isset($this->originalProcessTitle)) { - $this->originalProcessTitle = implode(' ', $this->environment->getServer('argv')); + $this->originalProcessTitle = PHP_BINARY . ' ' . implode(' ', $this->environment->getServer('argv')); } if (strpos($this->originalProcessTitle, " --group=$groupId ") !== false) { From 5969ba7608aed1d0ea312ff1b5316f059093c3fc Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Wed, 6 Oct 2021 23:15:08 +0100 Subject: [PATCH 05/10] Fix unit test --- .../Cron/Observer/ProcessCronQueueObserver.php | 10 +++++----- .../Unit/Observer/ProcessCronQueueObserverTest.php | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 77e33fbfbf0d2..ba5f98611937f 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -9,7 +9,7 @@ */ namespace Magento\Cron\Observer; -use Laminas\Http\PhpEnvironment\Request; +use Laminas\Http\PhpEnvironment\Request as Environment; use Magento\Cron\Model\ResourceModel\Schedule\Collection as ScheduleCollection; use Magento\Cron\Model\Schedule; use Magento\Framework\App\State; @@ -130,9 +130,9 @@ class ProcessCronQueueObserver implements ObserverInterface protected $dateTime; /** - * @var Request + * @var Environment */ - protected Request $environment; + protected Environment $environment; /** * @var string @@ -195,7 +195,7 @@ class ProcessCronQueueObserver implements ObserverInterface * @param \Magento\Framework\Lock\LockManagerInterface $lockManager * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param DeadlockRetrierInterface $retrier - * @param Request $environment + * @param Environment $environment * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( @@ -214,7 +214,7 @@ public function __construct( \Magento\Framework\Lock\LockManagerInterface $lockManager, \Magento\Framework\Event\ManagerInterface $eventManager, DeadlockRetrierInterface $retrier, - Request $environment + Environment $environment ) { $this->_objectManager = $objectManager; $this->_scheduleFactory = $scheduleFactory; diff --git a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php index 26b844a22a548..28849d388cba3 100644 --- a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php +++ b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php @@ -8,6 +8,7 @@ namespace Magento\Cron\Test\Unit\Observer; use Exception; +use Laminas\Http\PhpEnvironment\Request as Environment; use Magento\Cron\Model\Config; use Magento\Cron\Model\DeadlockRetrierInterface; use Magento\Cron\Model\ResourceModel\Schedule as ScheduleResourceModel; @@ -20,8 +21,8 @@ use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\App\Console\Request as ConsoleRequest; use Magento\Framework\App\ObjectManager; -use Magento\Framework\App\State; use Magento\Framework\App\State as AppState; +use Magento\Framework\App\State; use Magento\Framework\DataObject; use Magento\Framework\DB\Adapter\AdapterInterface; use Magento\Framework\Event\ManagerInterface; @@ -219,6 +220,14 @@ protected function setUp(): void $this->retrierMock = $this->getMockForAbstractClass(DeadlockRetrierInterface::class); + $environmentMock = $this->getMockBuilder(Environment::class) + ->disableOriginalConstructor() + ->getMock(); + $environmentMock->expects($this->any()) + ->method('getServer') + ->with('argv') + ->willReturn($_SERVER['argv']); + $this->cronQueueObserver = new ProcessCronQueueObserver( $this->objectManagerMock, $this->scheduleFactoryMock, @@ -234,7 +243,8 @@ protected function setUp(): void $this->statFactory, $this->lockManagerMock, $this->eventManager, - $this->retrierMock + $this->retrierMock, + $environmentMock ); } From 07cabe45de60e76246c9fd177913a6b2c5cb9c4c Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Mon, 25 Oct 2021 22:38:32 +0100 Subject: [PATCH 06/10] Reduce property visibility --- app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index ba5f98611937f..6eeb7189d83f6 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -132,12 +132,12 @@ class ProcessCronQueueObserver implements ObserverInterface /** * @var Environment */ - protected Environment $environment; + private Environment $environment; /** * @var string */ - protected string $originalProcessTitle; + private string $originalProcessTitle; /** * @var \Symfony\Component\Process\PhpExecutableFinder From 4cca4c7df602d735262988f5a9586391450cb860 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Sat, 27 Nov 2021 13:02:50 +0000 Subject: [PATCH 07/10] Recover from failed merge conflict resolution --- app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index f53cbfda133c0..5e32fad035583 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -376,7 +376,7 @@ protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, cli_set_process_title($this->originalProcessTitle . " # group: $groupId, job: $jobCode"); } - $schedule->setExecutedAt(strftime('%Y-%m-%d %H:%M:%S', $this->dateTime->gmtTimestamp())); + $schedule->setExecutedAt(date('Y-m-d H:i:s', $this->dateTime->gmtTimestamp())); $this->retrier->execute( function () use ($schedule) { $schedule->save(); From ae72fdd165544ca2ba47e4c6d6451f2207c1d397 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Sat, 27 Nov 2021 13:03:41 +0000 Subject: [PATCH 08/10] Extract new feature to its own method --- .../Observer/ProcessCronQueueObserver.php | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 5e32fad035583..1085dcce64bbf 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -365,16 +365,7 @@ protected function _runJob($scheduledTime, $currentTime, $jobConfig, $schedule, ); } - if (!isset($this->originalProcessTitle)) { - $this->originalProcessTitle = PHP_BINARY . ' ' . implode(' ', $this->environment->getServer('argv')); - } - - if (strpos($this->originalProcessTitle, " --group=$groupId ") !== false) { - // Group is already shown, so no need to include here in duplicate - cli_set_process_title($this->originalProcessTitle . " # job: $jobCode"); - } else { - cli_set_process_title($this->originalProcessTitle . " # group: $groupId, job: $jobCode"); - } + $this->setProcessTitle($jobCode, $groupId); $schedule->setExecutedAt(date('Y-m-d H:i:s', $this->dateTime->gmtTimestamp())); $this->retrier->execute( @@ -954,4 +945,24 @@ function () use ($scheduleResource, $where) { $scheduleResource->getConnection() ); } + + /** + * Set the process title to include the job code and group + * + * @param string $jobCode + * @param string $groupId + */ + private function setProcessTitle(string $jobCode, string $groupId): void + { + if (!isset($this->originalProcessTitle)) { + $this->originalProcessTitle = PHP_BINARY . ' ' . implode(' ', $this->environment->getServer('argv')); + } + + if (strpos($this->originalProcessTitle, " --group=$groupId ") !== false) { + // Group is already shown, so no need to include here in duplicate + cli_set_process_title($this->originalProcessTitle . " # job: $jobCode"); + } else { + cli_set_process_title($this->originalProcessTitle . " # group: $groupId, job: $jobCode"); + } + } } From c584355fa59e5a321535aebb22638e2b5e532586 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Sat, 27 Nov 2021 13:05:20 +0000 Subject: [PATCH 09/10] Set required visibility on consts --- .../Observer/ProcessCronQueueObserver.php | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php index 1085dcce64bbf..95211a8d3622d 100644 --- a/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php +++ b/app/code/Magento/Cron/Observer/ProcessCronQueueObserver.php @@ -35,59 +35,59 @@ class ProcessCronQueueObserver implements ObserverInterface /**#@+ * Cache key values */ - const CACHE_KEY_LAST_SCHEDULE_GENERATE_AT = 'cron_last_schedule_generate_at'; + public const CACHE_KEY_LAST_SCHEDULE_GENERATE_AT = 'cron_last_schedule_generate_at'; - const CACHE_KEY_LAST_HISTORY_CLEANUP_AT = 'cron_last_history_cleanup_at'; + public const CACHE_KEY_LAST_HISTORY_CLEANUP_AT = 'cron_last_history_cleanup_at'; /** * Flag for internal communication between processes for running * all jobs in a group in parallel as a separate process */ - const STANDALONE_PROCESS_STARTED = 'standaloneProcessStarted'; + public const STANDALONE_PROCESS_STARTED = 'standaloneProcessStarted'; /**#@-*/ /**#@+ * List of configurable constants used to calculate and validate during handling cron jobs */ - const XML_PATH_SCHEDULE_GENERATE_EVERY = 'schedule_generate_every'; + public const XML_PATH_SCHEDULE_GENERATE_EVERY = 'schedule_generate_every'; - const XML_PATH_SCHEDULE_AHEAD_FOR = 'schedule_ahead_for'; + public const XML_PATH_SCHEDULE_AHEAD_FOR = 'schedule_ahead_for'; - const XML_PATH_SCHEDULE_LIFETIME = 'schedule_lifetime'; + public const XML_PATH_SCHEDULE_LIFETIME = 'schedule_lifetime'; - const XML_PATH_HISTORY_CLEANUP_EVERY = 'history_cleanup_every'; + public const XML_PATH_HISTORY_CLEANUP_EVERY = 'history_cleanup_every'; - const XML_PATH_HISTORY_SUCCESS = 'history_success_lifetime'; + public const XML_PATH_HISTORY_SUCCESS = 'history_success_lifetime'; - const XML_PATH_HISTORY_FAILURE = 'history_failure_lifetime'; + public const XML_PATH_HISTORY_FAILURE = 'history_failure_lifetime'; /**#@-*/ /** * Value of seconds in one minute */ - const SECONDS_IN_MINUTE = 60; + public const SECONDS_IN_MINUTE = 60; /** * How long to wait for cron group to become unlocked */ - const LOCK_TIMEOUT = 60; + public const LOCK_TIMEOUT = 60; /** * Static lock prefix for cron group locking */ - const LOCK_PREFIX = 'CRON_'; + public const LOCK_PREFIX = 'CRON_'; /** * Timer ID for profiling */ - const CRON_TIMERID = 'job %s'; + public const CRON_TIMERID = 'job %s'; /** * Max retries for acquire locks for cron jobs */ - const MAX_RETRIES = 5; + public const MAX_RETRIES = 5; /** * @var ScheduleCollection From 9a71f4ecc7f718104ba3d69f863471f99f8eac79 Mon Sep 17 00:00:00 2001 From: Dan Wallis Date: Thu, 6 Jan 2022 13:10:07 +0000 Subject: [PATCH 10/10] Remove use of superglobal --- .../Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php index 0a0e1193d2efa..1a67056c24e17 100644 --- a/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php +++ b/app/code/Magento/Cron/Test/Unit/Observer/ProcessCronQueueObserverTest.php @@ -226,7 +226,7 @@ protected function setUp(): void $environmentMock->expects($this->any()) ->method('getServer') ->with('argv') - ->willReturn($_SERVER['argv']); + ->willReturn([]); $this->cronQueueObserver = new ProcessCronQueueObserver( $this->objectManagerMock,