From 9b07132b801791783a60eeeafe69df8ae735b24b Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sun, 24 Feb 2019 10:08:28 +0100 Subject: [PATCH] Fixing force-flag for lock-releasing --- src/Core/Lock.php | 7 ++++--- src/Core/Lock/CacheLockDriver.php | 8 ++++++-- src/Core/Lock/DatabaseLockDriver.php | 10 ++++++++-- src/Core/Lock/ILockDriver.php | 5 +++-- src/Core/Lock/SemaphoreLockDriver.php | 2 +- src/Core/Update.php | 2 +- 6 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/Core/Lock.php b/src/Core/Lock.php index e8c8a70416..adff049dce 100644 --- a/src/Core/Lock.php +++ b/src/Core/Lock.php @@ -122,12 +122,13 @@ class Lock /** * @brief Releases a lock if it was set by us * - * @param string $key Name of the lock + * @param string $key Name of the lock + * @param bool $force Force the lock to get releases * @return void */ - public static function release($key) + public static function release($key, $force = false) { - self::getDriver()->releaseLock($key); + self::getDriver()->releaseLock($key, $force); } /** diff --git a/src/Core/Lock/CacheLockDriver.php b/src/Core/Lock/CacheLockDriver.php index 18d441ffea..d1ef1acffa 100644 --- a/src/Core/Lock/CacheLockDriver.php +++ b/src/Core/Lock/CacheLockDriver.php @@ -61,11 +61,15 @@ class CacheLockDriver extends AbstractLockDriver /** * (@inheritdoc) */ - public function releaseLock($key) + public function releaseLock($key, $force = false) { $cachekey = self::getLockKey($key); - $this->cache->compareDelete($cachekey, getmypid()); + if ($force) { + $this->cache->delete($key); + } else { + $this->cache->compareDelete($cachekey, getmypid()); + } $this->markRelease($key); } diff --git a/src/Core/Lock/DatabaseLockDriver.php b/src/Core/Lock/DatabaseLockDriver.php index 6f18fb5bec..73b97dc4b7 100644 --- a/src/Core/Lock/DatabaseLockDriver.php +++ b/src/Core/Lock/DatabaseLockDriver.php @@ -68,9 +68,15 @@ class DatabaseLockDriver extends AbstractLockDriver /** * (@inheritdoc) */ - public function releaseLock($key) + public function releaseLock($key, $force = false) { - DBA::delete('locks', ['name' => $key, 'pid' => $this->pid]); + if ($force) { + $where = ['name' => $key]; + } else { + $where = ['name' => $key, 'pid' => $this->pid]; + } + + DBA::delete('locks', $where); $this->markRelease($key); diff --git a/src/Core/Lock/ILockDriver.php b/src/Core/Lock/ILockDriver.php index a255f68345..2ee145980c 100644 --- a/src/Core/Lock/ILockDriver.php +++ b/src/Core/Lock/ILockDriver.php @@ -33,11 +33,12 @@ interface ILockDriver /** * Releases a lock if it was set by us * - * @param string $key The Name of the lock + * @param string $key The Name of the lock + * @param bool $force Force the lock to get released * * @return void */ - public function releaseLock($key); + public function releaseLock($key, $force = false); /** * Releases all lock that were set by us diff --git a/src/Core/Lock/SemaphoreLockDriver.php b/src/Core/Lock/SemaphoreLockDriver.php index cf1ce5a8d8..5ce03b2c39 100644 --- a/src/Core/Lock/SemaphoreLockDriver.php +++ b/src/Core/Lock/SemaphoreLockDriver.php @@ -50,7 +50,7 @@ class SemaphoreLockDriver extends AbstractLockDriver /** * (@inheritdoc) */ - public function releaseLock($key) + public function releaseLock($key, $force = false) { if (empty(self::$semaphore[$key])) { return false; diff --git a/src/Core/Update.php b/src/Core/Update.php index ed6c058726..7f825f384c 100644 --- a/src/Core/Update.php +++ b/src/Core/Update.php @@ -60,7 +60,7 @@ class Update // In force mode, we release the dbupdate lock first // Necessary in case of an stuck update if ($force) { - Lock::release('dbupdate'); + Lock::release('dbupdate', true); } $build = Config::get('system', 'build');