diff --git a/src/sprout/Controllers/CronJobController.php b/src/sprout/Controllers/CronJobController.php index 86521ada..87c2e902 100644 --- a/src/sprout/Controllers/CronJobController.php +++ b/src/sprout/Controllers/CronJobController.php @@ -15,6 +15,7 @@ use Kohana; use Sprout\Controllers\Admin\ManagedAdminController; +use Sprout\Helpers\Mutex; use Sprout\Helpers\Register; use Sprout\Helpers\Sprout; @@ -52,6 +53,13 @@ public function run($schedule) exit(1); } + $mutex = Mutex::create('cron_job:' . $schedule); + + if (!$mutex->acquire()) { + fwrite(STDERR, "Cron schedule [{$schedule}] already running" . PHP_EOL); + exit(0); + } + $jobs = Register::getCronJobs($schedule); echo 'Num jobs: ', count($jobs), PHP_EOL; @@ -102,6 +110,8 @@ public function run($schedule) } } + $mutex->release(); + echo PHP_EOL, 'Failures: ', $failed, PHP_EOL; exit($failed); } diff --git a/src/sprout/Helpers/Mutex.php b/src/sprout/Helpers/Mutex.php new file mode 100644 index 00000000..3613aa9a --- /dev/null +++ b/src/sprout/Helpers/Mutex.php @@ -0,0 +1,59 @@ +. + */ +namespace Sprout\Helpers; + +use karmabunny\interfaces\MutexInterface; +use karmabunny\pdb\PdbMutex; +use karmabunny\rdb\RdbMutex; +use Kohana; +use Kohana_Exception; + +/** + * Mutex helper. + */ +class Mutex +{ + + /** + * Create a new mutex. + * + * @param string $name mutex name + * @param string $group config group + * @return MutexInterface + * @throws Kohana_Exception + */ + public static function create(string $name, string $group = 'default'): MutexInterface + { + $config = Kohana::config('mutex.' . $group); + + if ($config['driver'] === 'pdb') { + $pdb = Pdb::getInstance(); + $mutex = new PdbMutex($pdb, $name); + + } else if ($config['driver'] === 'redis') { + $rdb = Rdb::getInstance(); + $mutex = new RdbMutex($rdb, $name); + + } else { + throw new Kohana_Exception('Unknown mutex driver: ' . $config['driver']); + } + + foreach ($config['config'] as $key => $value) { + if (property_exists($mutex, $key)) { + $mutex->$key = $value; + } + } + + return $mutex; + } +} diff --git a/src/sprout/config/mutex.php b/src/sprout/config/mutex.php new file mode 100644 index 00000000..7941d0e8 --- /dev/null +++ b/src/sprout/config/mutex.php @@ -0,0 +1,17 @@ + 'pdb', + 'config' => [ + 'autoRelease' => true, + 'uniqueLocks' => true, + 'releaseAllLocks' => false, + ], + + // 'driver' => 'redis', + // 'config' => [ + // 'autoRelease' => true, + // 'prefix' => 'mutex:', + // 'autoExpire' => 60, + // ], +];