Issue 8635: Avoid concurrent database updates

Possibly helps with #8635
This commit is contained in:
Michael 2020-05-16 08:15:51 +00:00
parent d9e98ea984
commit 4e1b1c0811

View file

@ -291,6 +291,12 @@ class DBStructure
*/ */
public static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null) public static function update($basePath, $verbose, $action, $install = false, array $tables = null, array $definition = null)
{ {
if (!$install) {
if (self::isUpdating()) {
return DI::l10n()->t('Another database update is currently running.');
}
}
if ($action && !$install) { if ($action && !$install) {
DI::config()->set('system', 'maintenance', 1); DI::config()->set('system', 'maintenance', 1);
DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: Database update', DateTimeFormat::utcNow() . ' ' . date('e'))); DI::config()->set('system', 'maintenance_reason', DI::l10n()->t('%s: Database update', DateTimeFormat::utcNow() . ' ' . date('e')));
@ -1060,4 +1066,31 @@ class DBStructure
DBA::close($tokens); DBA::close($tokens);
} }
} }
/**
* Checks if a database update is currently running
*
* @return boolean
*/
private static function isUpdating()
{
$processes = DBA::select(['information_schema' => 'processlist'],
['command', 'info'], ['db' => DBA::databaseName()]);
$isUpdate = false;
while ($process = DBA::fetch($processes)) {
if (empty($process['info'])) {
continue;
}
$parts = explode(' ', $process['info']);
$command = strtolower(array_shift($parts));
if ($command == 'alter') {
$isUpdate = true;
}
}
DBA::close($processes);
return $isUpdate;
}
} }