]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: mail_index_sync_map() - Don't try to-resync extension updates
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 29 Apr 2018 09:31:23 +0000 (12:31 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 30 Apr 2018 12:46:57 +0000 (15:46 +0300)
This was done to call extension record sync handlers, but the previous
commit removes them. Fixes a problem where obsolete cache offsets were
used in some situations:

 - Some cache updates are from external transactions and some are from
non-external transactions. This is because cache offset updates are being
added by whatever the parent index transaction is.

 - When mail_index_sync_map() is mapping MAIL_INDEX_SYNC_HANDLER_FILE, it
has already synced the map. But it's calling mail_index_sync_record()
for non-external transactions to call expunge handlers and extension
update handlers. It's calling the regular mail_index_sync_record() to do
this work.

 - But mail_index_sync_record() is actually still updating the map. So now
mail_index_sync_record() is called for all non-external cache updates,
but not for external cache updates! And since these are somewhat
randomly either external or non-external, the end result is that the
cache offset may be obsolete.

src/lib-index/mail-index-sync-update.c

index 5744bb64a8d787112dfbc08db1e1d9663d0b2c58..3779308f143dda46f018b6bf18fc44a147874896 100644 (file)
@@ -1028,14 +1028,9 @@ int mail_index_sync_map(struct mail_index_map **_map,
                if (LOG_IS_BEFORE(prev_seq, prev_offset,
                                  view->map->hdr.log_file_seq,
                                  view->map->hdr.log_file_head_offset)) {
-                       /* this has been synced already. we're here only to call
-                          expunge handlers and extension update handlers. */
+                       /* this has been synced already. */
                        i_assert(type == MAIL_INDEX_SYNC_HANDLER_FILE);
-
-                       if ((thdr->type & MAIL_TRANSACTION_EXTERNAL) != 0)
-                               continue;
-                       if ((thdr->type & MAIL_TRANSACTION_EXT_MASK) == 0)
-                               continue;
+                       continue;
                }
 
                /* we'll just skip over broken entries */