]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-index: mail_cache_compress() - Keep the .log file locked during compression
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Fri, 27 Mar 2020 10:53:32 +0000 (12:53 +0200)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 15 Apr 2020 09:41:42 +0000 (12:41 +0300)
src/lib-index/mail-cache-compress.c

index 064ecad2e8864352065f07f113ed6b2a2a3fd891..e260f636b413a579e8c8fda8b06d98b2efba0d77 100644 (file)
@@ -577,8 +577,20 @@ int mail_cache_compress(struct mail_cache *cache, uint32_t compress_file_seq)
        struct mail_index_view *view;
        struct mail_index_transaction *trans;
        struct mail_cache_compress_lock *lock;
+       bool lock_log;
        int ret;
 
+       lock_log = !cache->index->log_sync_locked;
+       if (lock_log) {
+               uint32_t file_seq;
+               uoff_t file_offset;
+
+               if (mail_transaction_log_sync_lock(cache->index->log,
+                                                  "mail cache compress",
+                                                  &file_seq, &file_offset) < 0)
+                       return -1;
+       }
+
        view = mail_index_view_open(cache->index);
        trans = mail_index_transaction_begin(view,
                MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL);
@@ -590,6 +602,10 @@ int mail_cache_compress(struct mail_cache *cache, uint32_t compress_file_seq)
                mail_cache_compress_unlock(&lock);
        }
        mail_index_view_close(&view);
+       if (lock_log) {
+               mail_transaction_log_sync_unlock(cache->index->log,
+                                                "mail cache compress");
+       }
        return ret;
 }