int cydir_sync_begin(struct cydir_mailbox *mbox, struct cydir_sync_context **ctx_r, bool force) { struct cydir_sync_context *ctx; enum mail_index_sync_flags sync_flags; int ret; ctx = i_new(struct cydir_sync_context, 1); ctx->mbox = mbox; sync_flags = index_storage_get_sync_flags(&mbox->box) | MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY; if (!force) sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; ret = index_storage_expunged_sync_begin(&mbox->box, &ctx->index_sync_ctx, &ctx->sync_view, &ctx->trans, sync_flags); if (ret <= 0) { i_free(ctx); *ctx_r = NULL; return ret; } cydir_sync_index(ctx); index_storage_expunging_deinit(&mbox->box); *ctx_r = ctx; return 0; }
static int raw_sync(struct raw_mailbox *mbox) { struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *sync_view; struct mail_index_transaction *trans; uint32_t seq, uid_validity = ioloop_time; enum mail_index_sync_flags sync_flags; int ret; i_assert(!mbox->synced); sync_flags = index_storage_get_sync_flags(&mbox->box) | MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; ret = mail_index_sync_begin(mbox->box.index, &index_sync_ctx, &sync_view, &trans, sync_flags); if (ret <= 0) { if (ret < 0) mailbox_set_index_error(&mbox->box); return ret; } /* set our uidvalidity */ mail_index_update_header(trans, offsetof(struct mail_index_header, uid_validity), &uid_validity, sizeof(uid_validity), TRUE); /* add our one and only message */ mail_index_append(trans, 1, &seq); index_mailbox_set_recent_uid(&mbox->box, 1); if (mail_index_sync_commit(&index_sync_ctx) < 0) { mailbox_set_index_error(&mbox->box); return -1; } mbox->synced = TRUE; return 0; }
int maildir_sync_index_begin(struct maildir_mailbox *mbox, struct maildir_sync_context *maildir_sync_ctx, struct maildir_index_sync_context **ctx_r) { struct mailbox *_box = &mbox->box; struct maildir_index_sync_context *ctx; struct mail_index_sync_ctx *sync_ctx; struct mail_index_view *view; struct mail_index_transaction *trans; enum mail_index_sync_flags sync_flags; sync_flags = index_storage_get_sync_flags(&mbox->box); /* don't drop recent messages if we're saving messages */ if (maildir_sync_ctx == NULL) sync_flags &= ~MAIL_INDEX_SYNC_FLAG_DROP_RECENT; if (mail_index_sync_begin(_box->index, &sync_ctx, &view, &trans, sync_flags) < 0) { mailbox_set_index_error(_box); return -1; } ctx = i_new(struct maildir_index_sync_context, 1); ctx->mbox = mbox; ctx->maildir_sync_ctx = maildir_sync_ctx; ctx->sync_ctx = sync_ctx; ctx->view = view; ctx->trans = trans; ctx->keywords_sync_ctx = maildir_keywords_sync_init(mbox->keywords, _box->index); ctx->sync_changes = index_sync_changes_init(ctx->sync_ctx, ctx->view, ctx->trans, maildir_is_backend_readonly(mbox)); ctx->start_time = time(NULL); *ctx_r = ctx; return 0; }
int mdbox_sync_begin(struct mdbox_mailbox *mbox, enum mdbox_sync_flags flags, struct mdbox_map_atomic_context *atomic, struct mdbox_sync_context **ctx_r) { struct mail_storage *storage = mbox->box.storage; struct mdbox_sync_context *ctx; enum mail_index_sync_flags sync_flags; int ret; bool rebuild, storage_rebuilt = FALSE; *ctx_r = NULL; /* avoid race conditions with mailbox creation, don't check for dbox headers until syncing has locked the mailbox */ rebuild = mbox->storage->corrupted || (flags & MDBOX_SYNC_FLAG_FORCE_REBUILD) != 0; if (rebuild && (flags & MDBOX_SYNC_FLAG_NO_REBUILD) == 0) { if (mdbox_storage_rebuild_in_context(mbox->storage, atomic) < 0) return -1; index_mailbox_reset_uidvalidity(&mbox->box); storage_rebuilt = TRUE; } ctx = i_new(struct mdbox_sync_context, 1); ctx->mbox = mbox; ctx->flags = flags; ctx->atomic = atomic; sync_flags = index_storage_get_sync_flags(&mbox->box); if (!rebuild && (flags & MDBOX_SYNC_FLAG_FORCE) == 0) sync_flags |= MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; if ((flags & MDBOX_SYNC_FLAG_FSYNC) != 0) sync_flags |= MAIL_INDEX_SYNC_FLAG_FSYNC; /* don't write unnecessary dirty flag updates */ sync_flags |= MAIL_INDEX_SYNC_FLAG_AVOID_FLAG_UPDATES; ret = mdbox_sync_try_begin(ctx, sync_flags); if (ret <= 0) { /* failed / nothing to do */ i_free(ctx); return ret; } if ((ret = mdbox_sync_index(ctx)) <= 0) { mail_index_sync_rollback(&ctx->index_sync_ctx); i_free_and_null(ctx); if (ret < 0) return -1; /* corrupted */ if (storage_rebuilt) { mail_storage_set_critical(storage, "mdbox %s: Storage keeps breaking", mailbox_get_path(&mbox->box)); return -1; } /* we'll need to rebuild storage. try again from the beginning. */ mdbox_storage_set_corrupted(mbox->storage); if ((flags & MDBOX_SYNC_FLAG_NO_REBUILD) != 0) { mail_storage_set_critical(storage, "mdbox %s: Can't rebuild storage", mailbox_get_path(&mbox->box)); return -1; } return mdbox_sync_begin(mbox, flags, atomic, ctx_r); } *ctx_r = ctx; return 0; }