Using Locks for Updating and writing last success to config

This commit is contained in:
Philipp Holzer 2018-10-06 20:38:35 +02:00
parent e876adef8f
commit f2ca3e5be4
No known key found for this signature in database
GPG Key ID: 517BE60E2CE5C8A5
1 changed files with 53 additions and 51 deletions

View File

@ -27,39 +27,38 @@ class Update
Config::load('database'); Config::load('database');
// Compare the current structure with the defined structure // Compare the current structure with the defined structure
$t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); if (Lock::acquire('dbupdate')) {
if (!is_null($t)) {
return;
}
// run the pre_update_nnnn functions in update.php // run the pre_update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) { for ($x = $stored + 1; $x <= $current; $x++) {
$r = self::runUpdateFunction($x, 'pre_update'); $r = self::runUpdateFunction($x, 'pre_update');
if (!$r) { if (!$r) {
break; break;
}
} }
}
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); // update the structure in one call
$retval = DBStructure::update(false, true);
// update the structure in one call if ($retval) {
$retval = DBStructure::update(false, true); DBStructure::updateFail(
if ($retval) { DB_UPDATE_VERSION,
DBStructure::updateFail( $retval
DB_UPDATE_VERSION, );
$retval Lock::release('dbupdate');
); return;
return; } else {
} else { Config::set('database', 'last_successful_update', time());
Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success');
}
// run the update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
$r = self::runUpdateFunction($x, 'update');
if (!$r) {
break;
} }
// run the update_nnnn functions in update.php
for ($x = $stored + 1; $x <= $current; $x++) {
$r = self::runUpdateFunction($x, 'update');
if (!$r) {
break;
}
}
Lock::release('dbupdate');
} }
} }
} }
@ -85,33 +84,36 @@ class Update
// If the update fails or times-out completely you may need to // If the update fails or times-out completely you may need to
// delete the config entry to try again. // delete the config entry to try again.
$t = Config::get('database', $funcname); if (Lock::acquire('dbupdate_function')) {
if (!is_null($t)) {
return false;
}
Config::set('database', $funcname, time());
// call the specific update // call the specific update
$retval = $funcname(); $retval = $funcname();
if ($retval) { if ($retval) {
//send the administrator an e-mail //send the administrator an e-mail
DBStructure::updateFail( DBStructure::updateFail(
$x, $x,
L10n::t('Update %s failed. See error logs.', $x) L10n::t('Update %s failed. See error logs.', $x)
); );
return false; Lock::release('dbupdate_function');
} else { return false;
Config::set('database', $funcname, 'success'); } else {
Config::set('database', 'last_successful_update_function', $funcname);
Config::set('database', 'last_successful_update_function_time', time());
if ($prefix == 'update') { if ($prefix == 'update') {
Config::set('system', 'build', $x); Config::set('system', 'build', $x);
}
Lock::release('dbupdate_function');
return true;
} }
return true;
} }
} else { } else {
Config::set('database', $funcname, 'success'); logger('Skipping \'' . $funcname . '\' without executing', LOGGER_DEBUG);
Config::set('database', 'last_successful_update_function', $funcname);
Config::set('database', 'last_successful_update_function_time', time());
if ($prefix == 'update') { if ($prefix == 'update') {
Config::set('system', 'build', $x); Config::set('system', 'build', $x);
@ -120,4 +122,4 @@ class Update
return true; return true;
} }
} }
} }