From: Timo Sirainen Date: Sun, 2 Oct 2011 15:39:49 +0000 (+0300) Subject: lib-storage: Mailbox list index's ext_id shouldn't be cached in mail_storage. X-Git-Tag: 2.1.beta1~87 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=93ec3b0c4b911e2cc79a99f4a300e488d2d694d3;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: Mailbox list index's ext_id shouldn't be cached in mail_storage. It's mailbox_list-specific, not mail_storage-specific. The easiest fix was to just cache it into mailbox rather than create a new index_mailbox_list. --- diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index da9cd1cf0f..9b55c9e478 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -298,6 +298,7 @@ void index_storage_mailbox_alloc(struct mailbox *box, const char *vname, box->pool, sizeof(void *), 5); ibox = p_new(box->pool, struct index_mailbox_context, 1); + ibox->list_index_sync_ext_id = (uint32_t)-1; ibox->index_flags = MAIL_INDEX_OPEN_FLAG_CREATE | mail_storage_settings_to_index_flags(box->storage->set); ibox->next_lock_notify = time(NULL) + LOCK_NOTIFY_INTERVAL; diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index 800c058184..2e4a38eb16 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -42,6 +42,7 @@ struct index_mailbox_context { uint32_t vsize_hdr_ext_id; time_t sync_last_check; + uint32_t list_index_sync_ext_id; }; #define INDEX_STORAGE_CONTEXT(obj) \ diff --git a/src/lib-storage/index/index-sync.c b/src/lib-storage/index/index-sync.c index f2fb90c12c..254261f3ac 100644 --- a/src/lib-storage/index/index-sync.c +++ b/src/lib-storage/index/index-sync.c @@ -443,18 +443,19 @@ enum mailbox_sync_type index_sync_type_convert(enum mail_index_sync_type type) return ret; } -static unsigned int -index_storage_list_get_ext_id(struct mail_storage *storage, - struct mail_index_view *view) +static uint32_t +index_list_get_ext_id(struct mailbox *box, struct mail_index_view *view) { - if (storage->list_sync_ext_id == (uint32_t)-1) { - storage->list_sync_ext_id = + struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); + + if (ibox->list_index_sync_ext_id == (uint32_t)-1) { + ibox->list_index_sync_ext_id = mail_index_ext_register(mail_index_view_get_index(view), "index sync", 0, sizeof(struct index_storage_list_index_record), sizeof(uint32_t)); } - return storage->list_sync_ext_id; + return ibox->list_index_sync_ext_id; } int index_storage_list_index_has_changed(struct mailbox *box, @@ -471,7 +472,7 @@ int index_storage_list_index_has_changed(struct mailbox *box, if (mail_index_is_in_memory(mail_index_view_get_index(list_view))) return 1; - ext_id = index_storage_list_get_ext_id(box->storage, list_view); + ext_id = index_list_get_ext_id(box, list_view); mail_index_lookup_ext(list_view, seq, ext_id, &data, &expunged); rec = data; @@ -512,7 +513,7 @@ void index_storage_list_index_update_sync(struct mailbox *box, return; /* get the current record */ - ext_id = index_storage_list_get_ext_id(box->storage, list_view); + ext_id = index_list_get_ext_id(box, list_view); mail_index_lookup_ext(list_view, seq, ext_id, &data, &expunged); if (expunged) return; @@ -532,9 +533,6 @@ void index_storage_list_index_update_sync(struct mailbox *box, new_rec.mtime = st.st_mtime & 0xffffffffU; if (old_rec == NULL || - memcmp(old_rec, &new_rec, sizeof(*old_rec)) != 0) { - mail_index_update_ext(trans, seq, - box->storage->list_sync_ext_id, - &new_rec, NULL); - } + memcmp(old_rec, &new_rec, sizeof(*old_rec)) != 0) + mail_index_update_ext(trans, seq, ext_id, &new_rec, NULL); } diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index ae3fce339f..0dda84b475 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -52,7 +52,6 @@ maildir_storage_create(struct mail_storage *_storage, struct mail_namespace *ns, storage->set = mail_storage_get_driver_settings(_storage); - storage->maildir_list_ext_id = (uint32_t)-1; storage->temp_prefix = p_strdup(_storage->pool, mailbox_list_get_temp_prefix(list)); @@ -275,6 +274,7 @@ maildir_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list, mbox->box.storage = storage; mbox->box.list = list; mbox->box.mail_vfuncs = &maildir_mail_vfuncs; + mbox->maildir_list_index_ext_id = (uint32_t)-1; index_storage_mailbox_alloc(&mbox->box, vname, flags, MAILDIR_INDEX_PREFIX); diff --git a/src/lib-storage/index/maildir/maildir-storage.h b/src/lib-storage/index/maildir/maildir-storage.h index 817f7a0fe4..00946bb9f7 100644 --- a/src/lib-storage/index/maildir/maildir-storage.h +++ b/src/lib-storage/index/maildir/maildir-storage.h @@ -67,8 +67,6 @@ struct maildir_storage { const struct maildir_settings *set; const char *temp_prefix; - - uint32_t maildir_list_ext_id; }; struct maildir_mailbox { @@ -87,6 +85,7 @@ struct maildir_mailbox { struct maildir_index_header maildir_hdr; uint32_t maildir_ext_id; + uint32_t maildir_list_index_ext_id; unsigned int synced:1; unsigned int syncing_commit:1; diff --git a/src/lib-storage/index/maildir/maildir-sync-index.c b/src/lib-storage/index/maildir/maildir-sync-index.c index 213b2c251e..d38c67a24f 100644 --- a/src/lib-storage/index/maildir/maildir-sync-index.c +++ b/src/lib-storage/index/maildir/maildir-sync-index.c @@ -685,17 +685,18 @@ int maildir_sync_index(struct maildir_index_sync_context *ctx, return ret < 0 ? -1 : (full_rescan ? 0 : 1); } -static unsigned int maildir_list_get_ext_id(struct maildir_storage *storage, - struct mail_index_view *view) +static unsigned int +maildir_list_get_ext_id(struct maildir_mailbox *mbox, + struct mail_index_view *view) { - if (storage->maildir_list_ext_id == (uint32_t)-1) { - storage->maildir_list_ext_id = + if (mbox->maildir_list_index_ext_id == (uint32_t)-1) { + mbox->maildir_list_index_ext_id = mail_index_ext_register(mail_index_view_get_index(view), "maildir", 0, sizeof(struct maildir_list_index_record), sizeof(uint32_t)); } - return storage->maildir_list_ext_id; + return mbox->maildir_list_index_ext_id; } int maildir_list_index_has_changed(struct mailbox *box, @@ -713,7 +714,7 @@ int maildir_list_index_has_changed(struct mailbox *box, if (mbox->storage->set->maildir_very_dirty_syncs) return index_storage_list_index_has_changed(box, list_view, seq); - ext_id = maildir_list_get_ext_id(mbox->storage, list_view); + ext_id = maildir_list_get_ext_id(mbox, list_view); mail_index_lookup_ext(list_view, seq, ext_id, &data, &expunged); rec = data; @@ -768,7 +769,7 @@ void maildir_list_index_update_sync(struct mailbox *box, /* get the current record */ list_view = mail_index_transaction_get_view(trans); - ext_id = maildir_list_get_ext_id(mbox->storage, list_view); + ext_id = maildir_list_get_ext_id(mbox, list_view); mail_index_lookup_ext(list_view, seq, ext_id, &data, &expunged); if (expunged) return; @@ -784,9 +785,6 @@ void maildir_list_index_update_sync(struct mailbox *box, } if (old_rec == NULL || - memcmp(old_rec, &new_rec, sizeof(*old_rec)) != 0) { - mail_index_update_ext(trans, seq, - mbox->storage->maildir_list_ext_id, - &new_rec, NULL); - } + memcmp(old_rec, &new_rec, sizeof(*old_rec)) != 0) + mail_index_update_ext(trans, seq, ext_id, &new_rec, NULL); } diff --git a/src/lib-storage/mail-storage-private.h b/src/lib-storage/mail-storage-private.h index 9626bd14ed..6ac2906708 100644 --- a/src/lib-storage/mail-storage-private.h +++ b/src/lib-storage/mail-storage-private.h @@ -87,7 +87,6 @@ struct mail_storage { struct mail_user *user; const char *temp_path_prefix; const struct mail_storage_settings *set; - uint32_t list_sync_ext_id; enum mail_storage_flags flags;