Handle deadlocks centrally

This commit is contained in:
Michael 2017-06-13 05:52:59 +00:00
parent 228993596a
commit 97be344a4a
2 changed files with 44 additions and 20 deletions

View file

@ -625,8 +625,21 @@ class dba {
}
if (self::$dbo->errorno != 0) {
logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".
$a->callstack(8))."\n".self::replace_parameters($sql, $args);
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1);
$called_from = array_shift($trace);
// We are having an own error logging in the function "p"
if ($called_from['function'] != 'p') {
// We have to preserve the error code, somewhere in the logging it get lost
$error = self::$dbo->error;
$errorno = self::$dbo->errorno;
logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".
$a->callstack(8))."\n".self::replace_parameters($sql, $args);
self::$dbo->error = $error;
self::$dbo->errorno = $errorno;
}
}
$a->save_timestamp($stamp1, 'database');
@ -662,18 +675,36 @@ class dba {
$args = func_get_args();
$stmt = call_user_func_array('self::p', $args);
// In a case of a deadlock we are repeating the query 10 times
$timeout = 10;
if (is_bool($stmt)) {
$retval = $stmt;
} elseif (is_object($stmt)) {
$retval = true;
} else {
$retval = false;
do {
$stmt = call_user_func_array('self::p', $args);
if (is_bool($stmt)) {
$retval = $stmt;
} elseif (is_object($stmt)) {
$retval = true;
} else {
$retval = false;
}
self::close($stmt);
} while ((self::$dbo->errorno = 1213) && (--$timeout > 0));
if (self::$dbo->errorno != 0) {
// We have to preserve the error code, somewhere in the logging it get lost
$error = self::$dbo->error;
$errorno = self::$dbo->errorno;
logger('DB Error '.self::$dbo->errorno.': '.self::$dbo->error."\n".
$a->callstack(8))."\n".self::replace_parameters($sql, $args);
self::$dbo->error = $error;
self::$dbo->errorno = $errorno;
}
self::close($stmt);
$a->save_timestamp($stamp, "database_write");
return $retval;

View file

@ -194,10 +194,7 @@ function poller_execute($queue) {
if (!validate_include($include)) {
logger("Include file ".$argv[0]." is not valid!");
$timeout = 10;
while (!dba::delete('workerqueue', array('id' => $queue["id"])) && (--$timeout > 0)) {
sleep(1);
}
dba::delete('workerqueue', array('id' => $queue["id"]));
return true;
}
@ -207,11 +204,7 @@ function poller_execute($queue) {
if (function_exists($funcname)) {
poller_exec_function($queue, $funcname, $argv);
$timeout = 10;
while (!dba::delete('workerqueue', array('id' => $queue["id"])) && (--$timeout > 0)) {
logger('Delete ID '.$queue["id"], LOGGER_DEBUG);
sleep(1);
}
dba::delete('workerqueue', array('id' => $queue["id"]));
} else {
logger("Function ".$funcname." does not exist");
}