From dd28f11219c8b617386805e4db81d0bd5af14486 Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Wed, 21 Feb 2018 15:38:08 -0500 Subject: [PATCH 1/7] #11002 fix --- .../Cron/Model/ResourceModel/Schedule.php | 46 ++++++++++--------- 1 file changed, 25 insertions(+), 21 deletions(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index 25dd02c207f4e..eca23a157dd6e 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -1,9 +1,9 @@ _init('cron_schedule', 'schedule_id'); } @@ -67,29 +66,34 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta $connection = $this->getConnection(); // this condition added to avoid cron jobs locking after incorrect termination of running job - $match = $connection->quoteInto( - 'existing.job_code = current.job_code ' . - 'AND (existing.executed_at > UTC_TIMESTAMP() - INTERVAL 1 DAY OR existing.executed_at IS NULL) ' . - 'AND existing.status = ?', - $newStatus - ); + + $match = $connection->select() + ->from(['schedule' => $this->getTable('cron_schedule')]) + ->where('schedule.schedule_id = ?', $scheduleId); + + $result = $connection->fetchAll($match); $selectIfUnlocked = $connection->select() - ->joinLeft( - ['existing' => $this->getTable('cron_schedule')], - $match, - ['status' => new \Zend_Db_Expr($connection->quote($newStatus))] - ) - ->where('current.schedule_id = ?', $scheduleId) - ->where('current.status = ?', $currentStatus) - ->where('existing.schedule_id IS NULL'); + ->from(['schedule' => $this->getTable('cron_schedule')]) + ->where('schedule.job_code = ?', $result[0]["job_code"]) + ->where('schedule.executed_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') + ->where('schedule.status = ? ', $newStatus); + $result = $connection->query($selectIfUnlocked)->rowCount(); - $update = $connection->updateFromSelect($selectIfUnlocked, ['current' => $this->getTable('cron_schedule')]); - $result = $connection->query($update)->rowCount(); + if ($result == 0) { + $where = $connection->quoteInto('schedule_id =?', $scheduleId); + $result = $connection->update( + $this->getTable('cron_schedule'), + array('status'=>$newStatus), + $where); - if ($result == 1) { + if ($result == 1) { return true; + } else { + return false; + } } return false; } } + From 9d29fc7edb2b4ecec60350d3517ef1d96417a960 Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Thu, 22 Feb 2018 09:53:24 -0500 Subject: [PATCH 2/7] updated fix #11002 --- app/code/Magento/Cron/Model/ResourceModel/Schedule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index eca23a157dd6e..de32b3b3619f0 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -3,7 +3,7 @@ * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ -namespace Magemojo\Cron\Model; +namespace Magento\Cron\Model\ResourceModel; /** * Schedule resource From bfe337ae27135d8661406147440901616ca69069 Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Thu, 22 Feb 2018 12:08:36 -0500 Subject: [PATCH 3/7] fixing indents --- .../Cron/Model/ResourceModel/Schedule.php | 30 +++++++++---------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index de32b3b3619f0..561e2227ada88 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -68,30 +68,28 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta // this condition added to avoid cron jobs locking after incorrect termination of running job $match = $connection->select() - ->from(['schedule' => $this->getTable('cron_schedule')]) - ->where('schedule.schedule_id = ?', $scheduleId); + ->from(['schedule' => $this->getTable('cron_schedule')]) + ->where('schedule.schedule_id = ?', $scheduleId); $result = $connection->fetchAll($match); $selectIfUnlocked = $connection->select() - ->from(['schedule' => $this->getTable('cron_schedule')]) - ->where('schedule.job_code = ?', $result[0]["job_code"]) - ->where('schedule.executed_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') - ->where('schedule.status = ? ', $newStatus); + ->from(['schedule' => $this->getTable('cron_schedule')]) + ->where('schedule.job_code = ?', $result[0]["job_code"]) + ->where('schedule.executed_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') + ->where('schedule.status = ? ', $newStatus); $result = $connection->query($selectIfUnlocked)->rowCount(); if ($result == 0) { - $where = $connection->quoteInto('schedule_id =?', $scheduleId); - $result = $connection->update( - $this->getTable('cron_schedule'), - array('status'=>$newStatus), - $where); + $where = $connection->quoteInto('schedule_id =?', $scheduleId); + $result = $connection->update( + $this->getTable('cron_schedule'), + array('status'=>$newStatus), + $where); - if ($result == 1) { - return true; - } else { - return false; - } + if ($result == 1) { + return true; + } } return false; } From 781fc0aa22b81495538a8361c519197c484b4575 Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Thu, 22 Feb 2018 17:47:03 -0500 Subject: [PATCH 4/7] update to fix race condition in reading executed_at time --- .../Magento/Cron/Model/ResourceModel/Schedule.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index 561e2227ada88..511126b6c3041 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -61,7 +61,7 @@ public function trySetJobStatusAtomic($scheduleId, $newStatus, $currentStatus) * @return bool * @since 100.2.0 */ - public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentStatus) + public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentStatus) { $connection = $this->getConnection(); @@ -72,19 +72,21 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta ->where('schedule.schedule_id = ?', $scheduleId); $result = $connection->fetchAll($match); + $jobcode = $result[0]["job_code"]; $selectIfUnlocked = $connection->select() ->from(['schedule' => $this->getTable('cron_schedule')]) - ->where('schedule.job_code = ?', $result[0]["job_code"]) - ->where('schedule.executed_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') + ->where('schedule.job_code = ?', $jobcode) + ->where('schedule.scheduled_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') ->where('schedule.status = ? ', $newStatus); - $result = $connection->query($selectIfUnlocked)->rowCount(); + + $result = count($connection->fetchAll($selectIfUnlocked)); if ($result == 0) { $where = $connection->quoteInto('schedule_id =?', $scheduleId); $result = $connection->update( $this->getTable('cron_schedule'), - array('status'=>$newStatus), + ['status'=>$newStatus,'executed_at'=>date("Y-m-d H:i:s", time())], $where); if ($result == 1) { @@ -95,3 +97,4 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta } } + From a7038b83c1c2d7a7186fb4dc4cd80755ea013853 Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Fri, 23 Feb 2018 15:53:22 -0500 Subject: [PATCH 5/7] format fixes --- app/code/Magento/Cron/Model/ResourceModel/Schedule.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index 511126b6c3041..9f75b59387d8a 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -61,7 +61,7 @@ public function trySetJobStatusAtomic($scheduleId, $newStatus, $currentStatus) * @return bool * @since 100.2.0 */ - public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentStatus) + public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentStatus) { $connection = $this->getConnection(); @@ -78,7 +78,8 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta ->from(['schedule' => $this->getTable('cron_schedule')]) ->where('schedule.job_code = ?', $jobcode) ->where('schedule.scheduled_at > UTC_TIMESTAMP() - INTERVAL 1 DAY') - ->where('schedule.status = ? ', $newStatus); + ->where('schedule.status = ? ', $newStatus) + ->where('schedule.status != ? ', $currentStatus); $result = count($connection->fetchAll($selectIfUnlocked)); @@ -86,7 +87,7 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta $where = $connection->quoteInto('schedule_id =?', $scheduleId); $result = $connection->update( $this->getTable('cron_schedule'), - ['status'=>$newStatus,'executed_at'=>date("Y-m-d H:i:s", time())], + ['status'=>$newStatus], $where); if ($result == 1) { @@ -96,5 +97,3 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta return false; } } - - From c64c1267e34d3820e994aadf9b6711c27f17b41f Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Sat, 24 Feb 2018 12:42:14 -0500 Subject: [PATCH 6/7] spacing fixes --- app/code/Magento/Cron/Model/ResourceModel/Schedule.php | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index 9f75b59387d8a..c7974fad7330a 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -18,7 +18,8 @@ class Schedule extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb * * @return void */ - public function _construct() { + public function _construct() + { $this->_init('cron_schedule', 'schedule_id'); } @@ -85,10 +86,7 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta if ($result == 0) { $where = $connection->quoteInto('schedule_id =?', $scheduleId); - $result = $connection->update( - $this->getTable('cron_schedule'), - ['status'=>$newStatus], - $where); + $result = $connection->update($this->getTable('cron_schedule'),['status'=>$newStatus],$where); if ($result == 1) { return true; From 29703106559f18ffa8f37b7a52fafe81c8fa960d Mon Sep 17 00:00:00 2001 From: Martin Pachol Date: Sun, 25 Feb 2018 16:20:06 -0500 Subject: [PATCH 7/7] more spacing stuff --- app/code/Magento/Cron/Model/ResourceModel/Schedule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php index c7974fad7330a..4b481c8bc17a5 100644 --- a/app/code/Magento/Cron/Model/ResourceModel/Schedule.php +++ b/app/code/Magento/Cron/Model/ResourceModel/Schedule.php @@ -86,7 +86,7 @@ public function trySetJobUniqueStatusAtomic($scheduleId, $newStatus, $currentSta if ($result == 0) { $where = $connection->quoteInto('schedule_id =?', $scheduleId); - $result = $connection->update($this->getTable('cron_schedule'),['status'=>$newStatus],$where); + $result = $connection->update($this->getTable('cron_schedule'), ['status'=>$newStatus], $where); if ($result == 1) { return true;