forked from leftypol/leftypol
anti-bot.php: retry transaction upon deadlock
This commit is contained in:
parent
21155cbb06
commit
b03130fcb4
1 changed files with 38 additions and 31 deletions
|
@ -196,49 +196,56 @@ function _create_antibot($pdo, $board, $thread) {
|
|||
$antibot = new AntiBot(array($board, $thread));
|
||||
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
retry_on_deadlock(3, function() use ($config, $pdo, $thread, $board, $antibot) {
|
||||
try {
|
||||
$pdo->beginTransaction();
|
||||
|
||||
// Delete old expired antispam, skipping those with NULL expiration timestamps (infinite lifetime).
|
||||
if (!isset($purged_old_antispam) && $config['auto_maintenance']) {
|
||||
$purged_old_antispam = true;
|
||||
purge_old_antispam();
|
||||
}
|
||||
// Delete old expired antispam, skipping those with NULL expiration timestamps (infinite lifetime).
|
||||
if (!isset($purged_old_antispam) && $config['auto_maintenance']) {
|
||||
$purged_old_antispam = true;
|
||||
purge_old_antispam();
|
||||
}
|
||||
|
||||
// Keep the now invalid timestamps around for a bit to enable users to post if they're still on an old version of
|
||||
// the HTML page.
|
||||
// By virtue of existing, we know that we're making a new version of the page, and the user from now on may just reload.
|
||||
if ($thread) {
|
||||
$query = prepare('UPDATE ``antispam`` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL');
|
||||
} else {
|
||||
$query = prepare('UPDATE ``antispam`` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` IS NULL AND `expires` IS NULL');
|
||||
}
|
||||
// Keep the now invalid timestamps around for a bit to enable users to post if they're still on an old version of
|
||||
// the HTML page.
|
||||
// By virtue of existing, we know that we're making a new version of the page, and the user from now on may just reload.
|
||||
if ($thread) {
|
||||
$query = prepare('UPDATE ``antispam`` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` = :thread AND `expires` IS NULL');
|
||||
} else {
|
||||
$query = prepare('UPDATE ``antispam`` SET `expires` = UNIX_TIMESTAMP() + :expires WHERE `board` = :board AND `thread` IS NULL AND `expires` IS NULL');
|
||||
}
|
||||
|
||||
$query->bindValue(':board', $board);
|
||||
if ($thread) {
|
||||
$query->bindValue(':thread', $thread);
|
||||
}
|
||||
$query->bindValue(':expires', $config['spam']['hidden_inputs_expire']);
|
||||
// Throws on error.
|
||||
$query->execute();
|
||||
$query->bindValue(':board', $board);
|
||||
if ($thread) {
|
||||
$query->bindValue(':thread', $thread);
|
||||
}
|
||||
$query->bindValue(':expires', $config['spam']['hidden_inputs_expire']);
|
||||
// Throws on error.
|
||||
$query->execute();
|
||||
|
||||
|
||||
$hash = $antibot->hash();
|
||||
$hash = $antibot->hash();
|
||||
|
||||
// Insert an antispam with infinite life as the HTML page of a thread might last well beyond the expiry date.
|
||||
$query = prepare('INSERT INTO ``antispam`` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)');
|
||||
$query->bindValue(':board', $board);
|
||||
$query->bindValue(':thread', $thread);
|
||||
$query->bindValue(':hash', $hash);
|
||||
// Throws on error.
|
||||
$query->execute();
|
||||
// Insert an antispam with infinite life as the HTML page of a thread might last well beyond the expiry date.
|
||||
$query = prepare('INSERT INTO ``antispam`` VALUES (:board, :thread, :hash, UNIX_TIMESTAMP(), NULL, 0)');
|
||||
$query->bindValue(':board', $board);
|
||||
$query->bindValue(':thread', $thread);
|
||||
$query->bindValue(':hash', $hash);
|
||||
// Throws on error.
|
||||
$query->execute();
|
||||
|
||||
$pdo->commit();
|
||||
$pdo->commit();
|
||||
} catch (\Exception $e) {
|
||||
$pdo->rollBack();
|
||||
throw $e;
|
||||
}
|
||||
});
|
||||
} catch (\PDOException $e) {
|
||||
$pdo->rollBack();
|
||||
if ($e->errorInfo === null || $e->errorInfo[1] != MYSQL_ER_LOCK_DEADLOCK) {
|
||||
throw $e;
|
||||
} else {
|
||||
error_log('Deadlock on _create_antibot while inserting, skipping');
|
||||
\error_log('5 or more deadlocks on _create_antibot while inserting, skipping');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue