From f2ca3e5be44192c486e8e3af2a993e065ad40a7d Mon Sep 17 00:00:00 2001 From: Philipp Holzer Date: Sat, 6 Oct 2018 20:38:35 +0200 Subject: [PATCH] Using Locks for Updating and writing last success to config --- src/Core/Update.php | 110 ++++++++++++++++++++++---------------------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/src/Core/Update.php b/src/Core/Update.php index 350c2572e2..8b11d8dcff 100644 --- a/src/Core/Update.php +++ b/src/Core/Update.php @@ -27,39 +27,38 @@ class Update Config::load('database'); // Compare the current structure with the defined structure - $t = Config::get('database', 'dbupdate_' . DB_UPDATE_VERSION); - if (!is_null($t)) { - return; - } - - // run the pre_update_nnnn functions in update.php - for ($x = $stored + 1; $x <= $current; $x++) { - $r = self::runUpdateFunction($x, 'pre_update'); - if (!$r) { - break; + if (Lock::acquire('dbupdate')) { + + // run the pre_update_nnnn functions in update.php + for ($x = $stored + 1; $x <= $current; $x++) { + $r = self::runUpdateFunction($x, 'pre_update'); + if (!$r) { + break; + } } - } - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, time()); - - // update the structure in one call - $retval = DBStructure::update(false, true); - if ($retval) { - DBStructure::updateFail( - DB_UPDATE_VERSION, - $retval - ); - return; - } else { - Config::set('database', 'dbupdate_' . DB_UPDATE_VERSION, 'success'); - } + // update the structure in one call + $retval = DBStructure::update(false, true); + if ($retval) { + DBStructure::updateFail( + DB_UPDATE_VERSION, + $retval + ); + Lock::release('dbupdate'); + return; + } else { + Config::set('database', 'last_successful_update', time()); + } - // 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 // delete the config entry to try again. - $t = Config::get('database', $funcname); - if (!is_null($t)) { - return false; - } - Config::set('database', $funcname, time()); - - // call the specific update - $retval = $funcname(); - - if ($retval) { - //send the administrator an e-mail - DBStructure::updateFail( - $x, - L10n::t('Update %s failed. See error logs.', $x) - ); - return false; - } else { - Config::set('database', $funcname, 'success'); - - if ($prefix == 'update') { - Config::set('system', 'build', $x); - } + if (Lock::acquire('dbupdate_function')) { + + // call the specific update + $retval = $funcname(); - return true; + if ($retval) { + //send the administrator an e-mail + DBStructure::updateFail( + $x, + L10n::t('Update %s failed. See error logs.', $x) + ); + Lock::release('dbupdate_function'); + return false; + } else { + Config::set('database', 'last_successful_update_function', $funcname); + Config::set('database', 'last_successful_update_function_time', time()); + + if ($prefix == 'update') { + Config::set('system', 'build', $x); + } + + Lock::release('dbupdate_function'); + return true; + } } } 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') { Config::set('system', 'build', $x); @@ -120,4 +122,4 @@ class Update return true; } } -} \ No newline at end of file +} -- 2.39.5