Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2074:cb5269c052e0 HEAD
Keep the transaction log view open all the time for index views (not just
while syncing) to avoid losing the log files.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 28 May 2004 04:33:11 +0300 |
parents | a58c51c8f37b |
children | 5138b14889a6 |
files | 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 |
diffstat | 4 files changed, 50 insertions(+), 54 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-index-sync.c Fri May 28 04:04:01 2004 +0300 +++ b/src/lib-index/mail-index-sync.c Fri May 28 04:33:11 2004 +0300 @@ -326,7 +326,6 @@ 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 @@ 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)
--- a/src/lib-index/mail-index-view-sync.c Fri May 28 04:04:01 2004 +0300 +++ b/src/lib-index/mail-index-view-sync.c Fri May 28 04:33:11 2004 +0300 @@ -68,7 +68,6 @@ buffer_set_used_size(*expunges_r, 0); } - mail_transaction_log_view_unset(view->log_view); return ret; } @@ -323,7 +322,12 @@ 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);
--- a/src/lib-index/mail-transaction-log-view.c Fri May 28 04:04:01 2004 +0300 +++ b/src/lib-index/mail-transaction-log-view.c Fri May 28 04:33:11 2004 +0300 @@ -16,8 +16,8 @@ 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 @@ 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 @@ 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 @@ } } - 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 @@ 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 @@ 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++) { + /* 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++; - file = file->next; - } + 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 @@ 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 @@ { va_list va; - if (!view->broken) - mail_transaction_log_view_unset(view); - view->broken = TRUE; va_start(va, fmt); @@ -225,42 +221,42 @@ 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 @@ 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 @@ "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; }
--- a/src/lib-index/mail-transaction-log.h Fri May 28 04:04:01 2004 +0300 +++ b/src/lib-index/mail-transaction-log.h Fri May 28 04:33:11 2004 +0300 @@ -74,8 +74,6 @@ 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. */