diff --git a/include/dba.php b/include/dba.php index e4846899dc..e1330d4424 100644 --- a/include/dba.php +++ b/include/dba.php @@ -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; diff --git a/include/poller.php b/include/poller.php index 9da8dddf75..e0b83dd73c 100644 --- a/include/poller.php +++ b/include/poller.php @@ -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"); }