diff --git a/src/Core/Console/DatabaseStructure.php b/src/Core/Console/DatabaseStructure.php index 1ec108d2e6..dededa9b3a 100644 --- a/src/Core/Console/DatabaseStructure.php +++ b/src/Core/Console/DatabaseStructure.php @@ -31,9 +31,10 @@ Commands toinnodb Convert all tables from MyISAM to InnoDB Options - -h|--help|-? Show help information - -v Show more debug information. - -f|--force Force the command in case of "update" (Ignore failed updates/running updates) + -h|--help|-? Show help information + -v Show more debug information. + -f|--force Force the update command (Even if the database structure matches) + -o|--override Override running or stalling updates HELP; return $help; } @@ -68,8 +69,9 @@ HELP; $output = DBStructure::update($a->getBasePath(), true, false); break; case "update": - $force = $this->getOption(['f', 'force'], false); - $output = Update::run($a->getBasePath(), $force, true, false); + $force = $this->getOption(['f', 'force'], false); + $override = $this->getOption(['o', 'override'], false); + $output = Update::run($a->getBasePath(), $force, $override,true, false); break; case "dumpsql": ob_start(); @@ -89,5 +91,4 @@ HELP; return 0; } - } diff --git a/src/Core/Console/PostUpdate.php b/src/Core/Console/PostUpdate.php index 103d0fef7e..a903cd7dd4 100644 --- a/src/Core/Console/PostUpdate.php +++ b/src/Core/Console/PostUpdate.php @@ -56,7 +56,7 @@ HELP; } echo L10n::t('Check for pending update actions.') . "\n"; - Update::run($a->getBasePath(), true, true, false); + Update::run($a->getBasePath(), true, false, true, false); echo L10n::t('Done.') . "\n"; echo L10n::t('Execute pending post updates.') . "\n"; diff --git a/src/Core/Lock.php b/src/Core/Lock.php index e8c8a70416..8bc2c242d1 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 $override Overrides the lock to get releases * @return void */ - public static function release($key) + public static function release($key, $override = false) { - self::getDriver()->releaseLock($key); + self::getDriver()->releaseLock($key, $override); } /** diff --git a/src/Core/Lock/CacheLockDriver.php b/src/Core/Lock/CacheLockDriver.php index 18d441ffea..c1cd8ffb43 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, $override = false) { $cachekey = self::getLockKey($key); - $this->cache->compareDelete($cachekey, getmypid()); + if ($override) { + $this->cache->delete($cachekey); + } 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..a137ef12ed 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, $override = false) { - DBA::delete('locks', ['name' => $key, 'pid' => $this->pid]); + if ($override) { + $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..7cbaa4fc69 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 $override Overrides the lock to get released * * @return void */ - public function releaseLock($key); + public function releaseLock($key, $override = 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..781e110b17 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, $override = false) { if (empty(self::$semaphore[$key])) { return false; diff --git a/src/Core/Update.php b/src/Core/Update.php index b4626c27b3..0a0f365d1e 100644 --- a/src/Core/Update.php +++ b/src/Core/Update.php @@ -52,19 +52,20 @@ class Update * Automatic database updates * * @param string $basePath The base path of this application - * @param bool $force Force the Update-Check even if the lock is set + * @param bool $force Force the Update-Check even if the database version doesn't match + * @param bool $override Overrides any running/stuck updates * @param bool $verbose Run the Update-Check verbose * @param bool $sendMail Sends a Mail to the administrator in case of success/failure * * @return string Empty string if the update is successful, error messages otherwise * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public static function run($basePath, $force = false, $verbose = false, $sendMail = true) + public static function run($basePath, $force = false, $override = false, $verbose = false, $sendMail = true) { // In force mode, we release the dbupdate lock first // Necessary in case of an stuck update - if ($force) { - Lock::release('dbupdate'); + if ($override) { + Lock::release('dbupdate', true); } $build = Config::get('system', 'build'); @@ -74,12 +75,12 @@ class Update Config::set('system', 'build', $build); } - if ($build != DB_UPDATE_VERSION) { + if ($build != DB_UPDATE_VERSION || $force) { require_once 'update.php'; $stored = intval($build); $current = intval(DB_UPDATE_VERSION); - if ($stored < $current) { + if ($stored < $current || $force) { Config::load('database'); Logger::log('Update from \'' . $stored . '\' to \'' . $current . '\' - starting', Logger::DEBUG); @@ -130,8 +131,6 @@ class Update Lock::release('dbupdate'); } } - } elseif ($force) { - DBStructure::update($basePath, $verbose, true); } return '';