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
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;
mailbox_close(box);
mail_storage_last_error_pop(box->storage);
}
+ event_reason_end(&reason);
return ret;
}
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;
}
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 */
}
/* if mailbox is reopened, its path may be different with
LAYOUT=index */
mailbox_close_reset_path(box);
+ event_reason_end(&reason);
return ret;
}
{
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)
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;
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;