Added to the most important places.
ctx->t = mailbox_transaction_begin(ctx->box,
MAILBOX_TRANSACTION_FLAG_EXTERNAL |
MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS);
+ imap_transaction_set_cmd_reason(ctx->t, cmd);
}
io_remove(&client->io);
}
}
-static int fetch_and_copy(struct client *client, bool move,
+static int fetch_and_copy(struct client_command_context *cmd, bool move,
struct mailbox_transaction_context *t,
struct mailbox_transaction_context **src_trans_r,
struct mail_search_args *search_args,
const char **src_uidset_r,
unsigned int *copy_count_r)
{
+ struct client *client = cmd->client;
struct mail_search_context *search_ctx;
struct mailbox_transaction_context *src_trans;
struct mail_save_context *save_ctx;
msgset_generator_init(&srcset_ctx, src_uidset);
src_trans = mailbox_transaction_begin(client->mailbox, 0);
+ imap_transaction_set_cmd_reason(src_trans, cmd);
search_ctx = mailbox_search_init(src_trans, search_args, NULL, 0, NULL);
ret = 1;
t = mailbox_transaction_begin(destbox,
MAILBOX_TRANSACTION_FLAG_EXTERNAL |
MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS);
- ret = fetch_and_copy(client, move, t, &src_trans, search_args,
+ imap_transaction_set_cmd_reason(t, cmd);
+ ret = fetch_and_copy(cmd, move, t, &src_trans, search_args,
&src_uidset, ©_count);
mail_search_args_unref(&search_args);
if (ret <= 0)
return ret < 0;
- ctx = imap_fetch_alloc(client, cmd->pool);
+ ctx = imap_fetch_alloc(client, cmd->pool,
+ t_strdup_printf("%s %s", cmd->name, cmd->args));
if (!fetch_parse_args(ctx, cmd, &args[1], &next_arg) ||
(imap_arg_get_list(next_arg, &list_arg) &&
return -1;
}
- fetch_ctx = imap_fetch_alloc(ctx->cmd->client, ctx->cmd->pool);
+ fetch_ctx = imap_fetch_alloc(ctx->cmd->client, ctx->cmd->pool,
+ t_strdup_printf("%s %s", ctx->cmd->name, ctx->cmd->args));
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_uid_init);
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_flags_init);
}
t = mailbox_transaction_begin(client->mailbox, flags);
+ imap_transaction_set_cmd_reason(t, cmd);
search_ctx = mailbox_search_init(t, search_args, NULL,
MAIL_FETCH_FLAGS, NULL);
mail_search_args_unref(&search_args);
pool = pool_alloconly_create("orderedsubject thread", 1024);
i_array_init(&threads, 128);
trans = mailbox_transaction_begin(cmd->client->mailbox, 0);
+ imap_transaction_set_cmd_reason(trans, cmd);
search_ctx = mailbox_search_init(trans, search_args, sort_program,
0, NULL);
while (mailbox_search_next(search_ctx, &mail)) {
return 0;
}
+void imap_transaction_set_cmd_reason(struct mailbox_transaction_context *trans,
+ struct client_command_context *cmd)
+{
+ mailbox_transaction_set_reason(trans, cmd->args[0] == '\0' ? cmd->name :
+ t_strdup_printf("%s %s", cmd->name, cmd->args));
+}
+
const char *
imap_get_error_string(struct client_command_context *cmd,
const char *error_string, enum mail_error error)
int client_open_save_dest_box(struct client_command_context *cmd,
const char *name, struct mailbox **destbox_r);
+/* Set transaction's reason to the IMAP command name and parameters. */
+void imap_transaction_set_cmd_reason(struct mailbox_transaction_context *trans,
+ struct client_command_context *cmd);
const char *
imap_get_error_string(struct client_command_context *cmd,
const char *error_string, enum mail_error error);
/* Refresh the flags so we'll expunge all messages marked as \Deleted
by any session. */
t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_REFRESH);
+ mailbox_transaction_set_reason(t, "EXPUNGE");
ctx = mailbox_search_init(t, search_args, NULL, 0, NULL);
mail_search_args_unref(&search_args);
const char *str;
i_zero(&init_ctx);
- init_ctx.fetch_ctx = imap_fetch_alloc(client, pool);
+ init_ctx.fetch_ctx = imap_fetch_alloc(client, pool, "NOTIFY");
init_ctx.pool = pool;
init_ctx.args = list;
}
struct imap_fetch_context *
-imap_fetch_alloc(struct client *client, pool_t pool)
+imap_fetch_alloc(struct client *client, pool_t pool, const char *reason)
{
struct imap_fetch_context *ctx;
ctx = p_new(pool, struct imap_fetch_context, 1);
ctx->client = client;
ctx->ctx_pool = pool;
+ ctx->reason = p_strdup(pool, reason);
pool_ref(pool);
p_array_init(&ctx->all_headers, pool, 64);
array_append_array(&search_args->args->value.seqset, uid_filter_arr);
trans = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(trans, "FETCH send VANISHED");
search_ctx = mailbox_search_init(trans, search_args, NULL, 0, NULL);
mail_search_args_unref(&search_args);
ctx->state.trans = mailbox_transaction_begin(box,
MAILBOX_TRANSACTION_FLAG_HIDE |
MAILBOX_TRANSACTION_FLAG_REFRESH);
+ mailbox_transaction_set_reason(ctx->state.trans, ctx->reason);
mail_search_args_init(search_args, box, TRUE,
&ctx->client->search_saved_uidset);
struct imap_fetch_context {
struct client *client;
pool_t ctx_pool;
+ const char *reason;
enum mail_fetch_field fetch_data;
ARRAY_TYPE(const_string) all_headers;
const char **error_r);
struct imap_fetch_context *
-imap_fetch_alloc(struct client *client, pool_t pool);
+imap_fetch_alloc(struct client *client, pool_t pool, const char *reason);
void imap_fetch_free(struct imap_fetch_context **ctx);
bool imap_fetch_init_handler(struct imap_fetch_init_context *init_ctx);
void imap_fetch_init_nofail_handler(struct imap_fetch_context *ctx,
ctx->box = cmd->client->mailbox;
ctx->trans = mailbox_transaction_begin(ctx->box, 0);
+ imap_transaction_set_cmd_reason(ctx->trans, cmd);
ctx->sargs = sargs;
ctx->search_ctx =
mailbox_search_init(ctx->trans, sargs, sort_program, 0, NULL);
mail_search_build_add_all(search_args);
trans = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(trans, "unhibernate");
search_ctx = mailbox_search_init(trans, search_args, NULL, 0, NULL);
mail_search_args_unref(&search_args);
mail_search_build_add_all(search_args);
trans = mailbox_transaction_begin(client->mailbox, 0);
+ mailbox_transaction_set_reason(trans, "unhibernate");
search_ctx = mailbox_search_init(trans, search_args, NULL, 0, NULL);
mail_search_args_unref(&search_args);
imap_search_add_changed_since(search_args, state->highest_modseq);
pool = pool_alloconly_create("imap state flag changes", 1024);
- fetch_ctx = imap_fetch_alloc(client, pool);
+ fetch_ctx = imap_fetch_alloc(client, pool, "unhibernate");
pool_unref(&pool);
imap_fetch_init_nofail_handler(fetch_ctx, imap_fetch_flags_init);
ctx->sync_ctx = mailbox_sync_init(box, flags);
ctx->t = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(ctx->t, "Mailbox sync");
ctx->mail = mail_alloc(ctx->t, MAIL_FETCH_FLAGS, NULL);
ctx->messages_count = client->messages_count;
i_array_init(&ctx->tmp_keywords, client->keywords.announce_count + 8);
seq = status.last_cached_seq + 1;
trans = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC);
+ mailbox_transaction_set_reason(trans, "indexing");
search_args = mail_search_build_init();
mail_search_build_add_seqset(search_args, seq, status.messages);
ctx = mailbox_search_init(trans, search_args, NULL,
mail_search_build_add_seqset(search_args, seq1, seq2);
trans = mailbox_transaction_begin(update->box, 0);
+ mailbox_transaction_set_reason(trans, "vsize update");
search_ctx = mailbox_search_init(trans, search_args, NULL,
MAIL_FETCH_VIRTUAL_SIZE, NULL);
if (!require_result)
return -1;
trans = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(trans, "mailbox physical size");
search_args = mail_search_build_init();
mail_search_build_add_all(search_args);
last_rename_stamp = *(const uint32_t*)data;
t = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(t, "autoexpunge");
mail = mail_alloc(t, 0, NULL);
hdr = mail_index_get_header(box->view);
if (box->tmp_sync_view != NULL)
box->view = box->tmp_sync_view;
qbox->expunge_trans = mailbox_transaction_begin(box, 0);
+ mailbox_transaction_set_reason(qbox->expunge_trans, "quota");
box->view = box_view;
qbox->expunge_qt->tmp_mail =
mail_alloc(qbox->expunge_trans,