From: Stephan Bosch Date: Tue, 13 Jul 2021 02:15:14 +0000 (+0200) Subject: lib-storage: mail-duplicate - Implement separate error code for deadlock. X-Git-Tag: 2.3.17~49 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2d32ee8b548eb36ccf5c26962e754d38dbf7a5a6;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail-duplicate - Implement separate error code for deadlock. --- diff --git a/src/lib-storage/mail-duplicate.c b/src/lib-storage/mail-duplicate.c index 7eb1123ee4..6940ede19c 100644 --- a/src/lib-storage/mail-duplicate.c +++ b/src/lib-storage/mail-duplicate.c @@ -34,6 +34,7 @@ enum mail_duplicate_lock_result { MAIL_DUPLICATE_LOCK_IO_ERROR, MAIL_DUPLICATE_LOCK_TIMEOUT, MAIL_DUPLICATE_LOCK_TOO_MANY, + MAIL_DUPLICATE_LOCK_DEADLOCK, }; struct mail_duplicate_lock { @@ -131,7 +132,10 @@ duplicate_lock_failed(struct mail_duplicate_transaction *trans, i_assert(lock->fd == -1); i_assert(lock->lock == NULL); - if (errno != EAGAIN) { + if (errno == EDEADLK) { + /* deadlock */ + result = MAIL_DUPLICATE_LOCK_DEADLOCK; + } else if (errno != EAGAIN) { /* not a lock timeout */ result = MAIL_DUPLICATE_LOCK_IO_ERROR; } else { @@ -541,6 +545,10 @@ mail_duplicate_check(struct mail_duplicate_transaction *trans, e_debug(trans->event, "Check ID: too many IDs locked"); return MAIL_DUPLICATE_CHECK_RESULT_TOO_MANY_LOCKS; + case MAIL_DUPLICATE_LOCK_DEADLOCK: + e_debug(trans->event, + "Check ID: deadlock detected while locking"); + return MAIL_DUPLICATE_CHECK_RESULT_DEADLOCK; } mail_duplicate_update(trans); diff --git a/src/lib-storage/mail-duplicate.h b/src/lib-storage/mail-duplicate.h index 4bbeaaba28..c414893385 100644 --- a/src/lib-storage/mail-duplicate.h +++ b/src/lib-storage/mail-duplicate.h @@ -14,6 +14,10 @@ enum mail_duplicate_check_result { MAIL_DUPLICATE_CHECK_RESULT_LOCK_TIMEOUT, /* Too many locks held. */ MAIL_DUPLICATE_CHECK_RESULT_TOO_MANY_LOCKS, + /* Locking detected a deadlock. The caller should rollback the + transaction to release all locks, do a short random sleep, retry + and hope that the next attempt succeeds. */ + MAIL_DUPLICATE_CHECK_RESULT_DEADLOCK, }; #define MAIL_DUPLICATE_DEFAULT_KEEP (3600 * 24)