if (ret > 0) {
/* hide the disconnect log message, because the client didn't
actually log out */
+ if (client->user->mail_debug) {
+ i_debug("Successfully hibernated imap client in mailbox %s",
+ client->mailbox == NULL ? "<none>" :
+ mailbox_get_vname(client->mailbox));
+ }
client->disconnected = TRUE;
client->hibernated = TRUE;
client_destroy(client, NULL);
str_printfa(state->cur_str, "* %u FETCH (",
state->cur_mail->seq);
+ ctx->fetched_mails_count++;
state->cur_first = TRUE;
state->cur_str_prefix_size = str_len(state->cur_str);
i_assert(!state->line_partial);
struct imap_fetch_state state;
ARRAY_TYPE(seq_range) fetch_failed_uids;
+ unsigned int fetched_mails_count;
enum mail_error error;
const char *errstr;
#include "istream-unix.h"
#include "ostream.h"
#include "base64.h"
+#include "str.h"
#include "strescape.h"
+#include "str-sanitize.h"
#include "master-service.h"
#include "mail-storage-service.h"
#include "imap-client.h"
master_input.state_import_bad_idle_done;
imap_client->state_import_idle_continue =
master_input.state_import_idle_continue;
+ if (imap_client->user->mail_debug) {
+ if (imap_client->state_import_bad_idle_done)
+ i_debug("imap-master: Unhibernated because IDLE was stopped with BAD command");
+ else if (imap_client->state_import_idle_continue)
+ i_debug("imap-master: Unhibernated to send mailbox changes");
+ else
+ i_debug("imap-master: Unhibernated because IDLE was stopped with DONE");
+ }
+
ret = imap_state_import_internal(imap_client, master_input.state->data,
master_input.state->used, &error);
if (ret <= 0) {
/* make sure all pending input gets handled */
i_assert(imap_client->to_delayed_input == NULL);
if (master_input.client_input->used > 0) {
+ if (imap_client->user->mail_debug) {
+ i_debug("imap-master: Pending client input: '%s'",
+ str_sanitize(str_c(master_input.client_input), 128));
+ }
imap_client->to_delayed_input =
timeout_add(0, client_input, imap_client);
}
static int
import_send_flag_changes(struct client *client,
- const struct mailbox_import_state *state)
+ const struct mailbox_import_state *state,
+ unsigned int *flag_change_count_r)
{
struct imap_fetch_context *fetch_ctx;
struct mail_search_args *search_args;
pool_t pool;
int ret;
+ *flag_change_count_r = 0;
if (state->messages == 0)
return 0;
while (imap_fetch_more_no_lock_update(fetch_ctx) == 0) ;
ret = imap_fetch_end(fetch_ctx);
+ *flag_change_count_r = fetch_ctx->fetched_mails_count;
imap_fetch_free(&fetch_ctx);
return ret;
}
struct mailbox_status status;
const struct seq_range *range;
enum mailbox_flags flags = 0;
- unsigned int expunge_count;
+ unsigned int expunge_count, new_mails_count = 0, flag_change_count = 0;
uint32_t uid;
int ret = 0;
if (state->messages - expunge_count < client->messages_count) {
/* new messages arrived */
+ new_mails_count = client->messages_count -
+ (state->messages - expunge_count);
client_send_line(client,
t_strdup_printf("* %u EXISTS", client->messages_count));
client_send_line(client,
} else {
client_send_mailbox_flags(client, TRUE);
}
- if (import_send_flag_changes(client, state) < 0) {
+ if (import_send_flag_changes(client, state, &flag_change_count) < 0) {
*error_r = "Couldn't send flag changes";
return -1;
}
(unsigned long long)status.highest_modseq));
client->sync_last_full_modseq = status.highest_modseq;
}
+ i_debug("Unhibernation sync: %u expunges, %u new messages, %u flag changes, %"PRIu64" modseq changes",
+ expunge_count, new_mails_count, flag_change_count,
+ status.highest_modseq - state->highest_modseq);
return 0;
}