]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Keep the transaction log view open all the time for index views (not just
authorTimo Sirainen <tss@iki.fi>
Fri, 28 May 2004 01:33:11 +0000 (04:33 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 28 May 2004 01:33:11 +0000 (04:33 +0300)
while syncing) to avoid losing the log files.

--HG--
branch : HEAD

src/lib-index/mail-index-sync.c
src/lib-index/mail-index-view-sync.c
src/lib-index/mail-transaction-log-view.c
src/lib-index/mail-transaction-log.h

index e02015d3b1cb9a7db1d8167d9b8aedc25a6c5d4f..9bebeb7e74b9fe5f5fc45b81711aae734b5d0c58 100644 (file)
@@ -326,7 +326,6 @@ int mail_index_sync_end(struct mail_index_sync_ctx *ctx)
 
        if (ret == 0) {
                hdr = ctx->index->hdr;
-               mail_transaction_log_view_unset(ctx->view->log_view);
                if (mail_transaction_log_view_set(ctx->view->log_view,
                                hdr->log_file_seq, hdr->log_file_offset,
                                seq, offset, MAIL_TRANSACTION_TYPE_MASK) < 0)
@@ -336,7 +335,6 @@ int mail_index_sync_end(struct mail_index_sync_ctx *ctx)
        if (ret == 0) {
                mail_index_sync_read_and_sort(ctx, TRUE);
 
-               mail_transaction_log_view_unset(ctx->view->log_view);
                if (mail_transaction_log_view_set(ctx->view->log_view,
                                hdr->log_file_seq, hdr->log_file_offset,
                                seq, offset, MAIL_TRANSACTION_TYPE_MASK) < 0)
index f9cfc8cf4f266639b9cbc3eca0c4b91af8d6cbb9..2fe0cc16552b815b0b09af98bb8b0d7041729f7d 100644 (file)
@@ -68,7 +68,6 @@ view_sync_get_expunges(struct mail_index_view *view, buffer_t **expunges_r)
                buffer_set_used_size(*expunges_r, 0);
        }
 
-       mail_transaction_log_view_unset(view->log_view);
        return ret;
 }
 
@@ -323,7 +322,12 @@ void mail_index_view_sync_end(struct mail_index_view_sync_ctx *ctx)
        if ((ctx->sync_mask & MAIL_INDEX_SYNC_TYPE_APPEND) != 0)
                view->messages_count = view->map->records_count;
 
-        mail_transaction_log_view_unset(view->log_view);
+       (void)mail_transaction_log_view_set(view->log_view,
+                                           view->log_file_seq,
+                                           view->log_file_offset,
+                                           view->log_file_seq,
+                                           view->log_file_offset,
+                                           MAIL_TRANSACTION_TYPE_MASK);
 
        if (ctx->expunges != NULL)
                buffer_free(ctx->expunges);
index 20af932757f00492dac5329b74150ddf87671cbb..5aae3da585b7da1b640d719c0536d726cabdd8a0 100644 (file)
@@ -16,8 +16,8 @@ struct mail_transaction_log_view {
        enum mail_transaction_type type_mask;
        struct mail_transaction_header tmp_hdr;
 
-        struct mail_transaction_log_file *file;
-       uoff_t file_offset;
+        struct mail_transaction_log_file *cur, *head, *tail;
+       uoff_t cur_offset;
 
        uint32_t prev_file_seq;
        uoff_t prev_file_offset;
@@ -34,6 +34,9 @@ mail_transaction_log_view_open(struct mail_transaction_log *log)
        view->log = log;
        view->broken = TRUE;
 
+       view->head = view->tail = view->log->head;
+       view->head->refcount++;
+
        view->next = log->views;
        log->views = view;
        return view;
@@ -42,6 +45,7 @@ mail_transaction_log_view_open(struct mail_transaction_log *log)
 void mail_transaction_log_view_close(struct mail_transaction_log_view *view)
 {
        struct mail_transaction_log_view **p;
+       struct mail_transaction_log_file *file;
 
        for (p = &view->log->views; *p != NULL; p = &(*p)->next) {
                if (*p == view) {
@@ -50,7 +54,11 @@ void mail_transaction_log_view_close(struct mail_transaction_log_view *view)
                }
        }
 
-       mail_transaction_log_view_unset(view);
+       for (file = view->tail; file != view->head; file = file->next)
+               file->refcount--;
+       view->head->refcount--;
+
+       mail_transaction_logs_clean(view->log);
        i_free(view);
 }
 
@@ -75,7 +83,6 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view,
        uoff_t end_offset;
        int ret;
 
-       i_assert(view->broken);
        i_assert(min_file_seq <= max_file_seq);
 
        if (view->log == NULL)
@@ -140,17 +147,27 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view,
 
        i_assert(max_file_offset <= file->hdr.used_size);
 
-       /* we have it all, refcount the files */
-       for (file = first, seq = min_file_seq; seq <= max_file_seq; seq++) {
-               file->refcount++;
-               file = file->next;
+       /* we have all of them. update refcounts. */
+       if (view->tail->hdr.file_seq < first->hdr.file_seq) {
+               /* unref old files */
+               for (file = view->tail; file != first; file = file->next)
+                       file->refcount--;
+               view->tail = first;
+       } else {
+               /* we shouldn't go backwards in log */
+               i_assert(first == view->tail);
        }
 
+       /* reference all new files */
+       for (file = view->head->next; file != NULL; file = file->next)
+               file->refcount++;
+       view->head = view->log->head;
+
        view->prev_file_seq = 0;
        view->prev_file_offset = 0;
 
-       view->file = first;
-       view->file_offset = min_file_offset;
+       view->cur = first;
+       view->cur_offset = min_file_offset;
 
        view->min_file_seq = min_file_seq;
        view->min_file_offset = min_file_offset;
@@ -161,24 +178,6 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view,
        return 0;
 }
 
-void mail_transaction_log_view_unset(struct mail_transaction_log_view *view)
-{
-       struct mail_transaction_log_file *file;
-
-       if (view->broken)
-               return;
-
-       view->broken = TRUE;
-       for (file = view->log->tail; file != NULL; file = file->next) {
-               if (file->hdr.file_seq > view->max_file_seq)
-                       break;
-               if (file->hdr.file_seq >= view->min_file_seq)
-                       file->refcount--;
-       }
-
-       mail_transaction_logs_clean(view->log);
-}
-
 void
 mail_transaction_log_view_get_prev_pos(struct mail_transaction_log_view *view,
                                       uint32_t *file_seq_r,
@@ -194,9 +193,6 @@ mail_transaction_log_view_set_corrupted(struct mail_transaction_log_view *view,
 {
        va_list va;
 
-       if (!view->broken)
-               mail_transaction_log_view_unset(view);
-
        view->broken = TRUE;
 
        va_start(va, fmt);
@@ -225,42 +221,42 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
        size_t file_size;
 
        for (;;) {
-               file = view->file;
+               file = view->cur;
 
                view->prev_file_seq = file->hdr.file_seq;
-               view->prev_file_offset = view->file_offset;
+               view->prev_file_offset = view->cur_offset;
 
-               if (view->file_offset != file->hdr.used_size)
+               if (view->cur_offset != file->hdr.used_size)
                        break;
 
-               view->file = file->next;
-               view->file_offset = sizeof(struct mail_transaction_log_header);
+               view->cur = file->next;
+               view->cur_offset = sizeof(struct mail_transaction_log_header);
 
-               if (view->file == NULL)
+               if (view->cur == NULL)
                        return 0;
        }
 
        data = buffer_get_data(file->buffer, &file_size);
        file_size += file->buffer_offset;
 
-       if (view->file_offset + sizeof(*hdr) > file_size) {
+       if (view->cur_offset + sizeof(*hdr) > file_size) {
                mail_transaction_log_file_set_corrupted(file,
                        "offset points outside file "
                        "(%"PRIuUOFF_T" + %"PRIuSIZE_T" > %"PRIuSIZE_T")",
-                       view->file_offset, sizeof(*hdr), file_size);
+                       view->cur_offset, sizeof(*hdr), file_size);
                return -1;
        }
 
-       hdr = CONST_PTR_OFFSET(data, view->file_offset - file->buffer_offset);
-       view->file_offset += sizeof(*hdr);
+       hdr = CONST_PTR_OFFSET(data, view->cur_offset - file->buffer_offset);
+       view->cur_offset += sizeof(*hdr);
 
-       if (file_size - view->file_offset < hdr->size) {
+       if (file_size - view->cur_offset < hdr->size) {
                mail_transaction_log_file_set_corrupted(file,
                        "record size too large (type=0x%x, offset=%"PRIuUOFF_T
                        ", size=%u, end=%"PRIuSIZE_T")",
                        hdr->type & MAIL_TRANSACTION_TYPE_MASK,
-                       view->file_offset, hdr->size, file_size);
-                view->file_offset = file_size;
+                       view->cur_offset, hdr->size, file_size);
+                view->cur_offset = file_size;
                return -1;
        }
 
@@ -271,7 +267,7 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
                mail_transaction_log_file_set_corrupted(file,
                        "unknown record type 0x%x",
                        hdr->type & MAIL_TRANSACTION_TYPE_MASK);
-                view->file_offset = file->hdr.used_size;
+                view->cur_offset = file->hdr.used_size;
                return -1;
        }
 
@@ -294,14 +290,14 @@ static int log_view_get_next(struct mail_transaction_log_view *view,
                        "record size wrong (type 0x%x, %u %% %u != 0)",
                        hdr->type & MAIL_TRANSACTION_TYPE_MASK,
                        hdr->size, record_size);
-                view->file_offset = file->hdr.used_size;
+                view->cur_offset = file->hdr.used_size;
                return -1;
        }
 
        *hdr_r = hdr;
-       *data_r = CONST_PTR_OFFSET(data, view->file_offset -
+       *data_r = CONST_PTR_OFFSET(data, view->cur_offset -
                                   file->buffer_offset);
-       view->file_offset += hdr->size;
+       view->cur_offset += hdr->size;
        return 1;
 }
 
index 8055f38292e707348f00b981e17110fe9c705260..14ce27a055bdbc5799913568ca19989c8645344a 100644 (file)
@@ -74,8 +74,6 @@ mail_transaction_log_view_set(struct mail_transaction_log_view *view,
                              uint32_t min_file_seq, uoff_t min_file_offset,
                              uint32_t max_file_seq, uoff_t max_file_offset,
                              enum mail_transaction_type type_mask);
-/* Unset view, freeing all it's used resources. */
-void mail_transaction_log_view_unset(struct mail_transaction_log_view *view);
 
 /* Read next transaction record from current position. The position is updated.
    Returns -1 if error, 0 if we're at end of the view, 1 if ok. */