From: Timo Sirainen Date: Thu, 9 Sep 2021 13:45:23 +0000 (+0300) Subject: lib-storage: Add reason_code=mailbox:* X-Git-Tag: 2.3.18~327 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1279e1bd00ed3c46a64b43f56c48828630735c2b;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Add reason_code=mailbox:* Added: * mailbox:create * mailbox:update * mailbox:delete * mailbox:rename * mailbox:subscribe * mailbox:unsubscribe * mailbox:attributes_changed --- diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index 732e74a153..0a71426871 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -1730,6 +1730,8 @@ int mailbox_create(struct mailbox *box, const struct mailbox_update *update, if (mailbox_verify_create_name(box) < 0) return -1; + struct event_reason *reason = event_reason_begin("mailbox:create"); + /* Avoid race conditions by keeping mailbox list locked during changes. This especially fixes a race during INBOX creation with LAYOUT=index because it scans for missing mailboxes if INBOX doesn't exist. The @@ -1737,6 +1739,7 @@ int mailbox_create(struct mailbox *box, const struct mailbox_update *update, causing the first process to become confused. */ if (mailbox_list_lock(box->list) < 0) { mail_storage_copy_list_error(box->storage, box->list); + event_reason_end(&reason); return -1; } box->creating = TRUE; @@ -1758,6 +1761,7 @@ int mailbox_create(struct mailbox *box, const struct mailbox_update *update, mailbox_close(box); mail_storage_last_error_pop(box->storage); } + event_reason_end(&reason); return ret; } @@ -1771,9 +1775,12 @@ int mailbox_update(struct mailbox *box, const struct mailbox_update *update) if (mailbox_verify_existing_name(box) < 0) return -1; + + struct event_reason *reason = event_reason_begin("mailbox:update"); ret = box->v.update_box(box, update); if (!guid_128_is_empty(update->mailbox_guid)) box->list->guid_cache_invalidated = TRUE; + event_reason_end(&reason); return ret; } @@ -1845,11 +1852,15 @@ static int mailbox_delete_real(struct mailbox *box) return -1; } + struct event_reason *reason = event_reason_begin("mailbox:delete"); + box->deleting = TRUE; if (mailbox_open(box) < 0) { if (mailbox_get_last_mail_error(box) != MAIL_ERROR_NOTFOUND && - !box->mailbox_deleted) + !box->mailbox_deleted) { + event_reason_end(&reason); return -1; + } /* might be a \noselect mailbox, so continue deletion */ } @@ -1876,6 +1887,7 @@ static int mailbox_delete_real(struct mailbox *box) /* if mailbox is reopened, its path may be different with LAYOUT=index */ mailbox_close_reset_path(box); + event_reason_end(&reason); return ret; } @@ -2056,22 +2068,33 @@ int mailbox_rename(struct mailbox *src, struct mailbox *dest) { int ret; T_BEGIN { + struct event_reason *reason = + event_reason_begin("mailbox:rename"); ret = mailbox_rename_real(src, dest); + event_reason_end(&reason); } T_END; return ret; } int mailbox_set_subscribed(struct mailbox *box, bool set) { + int ret; + if (mailbox_verify_name(box) < 0) return -1; + + struct event_reason *reason = + event_reason_begin(set ? "mailbox:subscribe" : + "mailbox:unsubscribe"); if (mailbox_list_iter_subscriptions_refresh(box->list) < 0) { mail_storage_copy_list_error(box->storage, box->list); - return -1; - } - if (mailbox_is_subscribed(box) == set) - return 0; - return box->v.set_subscribed(box, set); + ret = -1; + } else if (mailbox_is_subscribed(box) == set) + ret = 0; + else + ret = box->v.set_subscribed(box, set); + event_reason_end(&reason); + return ret; } bool mailbox_is_subscribed(struct mailbox *box) @@ -2429,11 +2452,19 @@ int mailbox_transaction_commit_get_changes( struct mailbox_transaction_context *t = *_t; struct mailbox *box = t->box; unsigned int save_count = t->save_count; + struct event_reason *reason = NULL; int ret; changes_r->pool = NULL; *_t = NULL; + + if (t->itrans->attribute_updates != NULL && + t->itrans->attribute_updates->used > 0) { + /* attribute changes are also done directly via lib-index + by ACL and Sieve */ + reason = event_reason_begin("mailbox:attributes_changed"); + } T_BEGIN { ret = box->v.transaction_commit(t, changes_r); } T_END; @@ -2448,6 +2479,7 @@ int mailbox_transaction_commit_get_changes( don't see transaction_count=0 until the parent transaction is fully finished */ box->transaction_count--; + event_reason_end(&reason); if (ret < 0 && changes_r->pool != NULL) pool_unref(&changes_r->pool); return ret;