Merge pull request #6740 from nupplaphil/issue/6503-force_update

Fixing force-flag for lock-release
This commit is contained in:
Hypolite Petovan 2019-02-24 07:04:54 -05:00 committed by GitHub
commit 4e3f780621
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 37 additions and 25 deletions

View File

@ -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;
}
}

View File

@ -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";

View File

@ -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);
}
/**

View File

@ -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);
}

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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 '';