[dovecot-cvs] dovecot/src/lib-index mail-index-sync.c, 1.17,
1.18 mail-index-view-sync.c, 1.11,
1.12 mail-transaction-log-view.c, 1.12,
1.13 mail-transaction-log.h, 1.10, 1.11
cras at procontrol.fi
cras at procontrol.fi
Fri May 28 04:33:13 EEST 2004
- Previous message: [dovecot-cvs] dovecot/src/lib-index mail-index-private.h, 1.16,
1.17 mail-index.c, 1.126, 1.127 mail-transaction-log.c, 1.30, 1.31
- Next message: [dovecot-cvs] dovecot/src/auth auth-master-connection.c, 1.5,
1.6 auth-master-connection.h, 1.1, 1.2 main.c, 1.22,
1.23 mech.c, 1.19, 1.20
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv26522/lib-index
Modified Files:
mail-index-sync.c mail-index-view-sync.c
mail-transaction-log-view.c mail-transaction-log.h
Log Message:
Keep the transaction log view open all the time for index views (not just
while syncing) to avoid losing the log files.
Index: mail-index-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-sync.c,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- a/mail-index-sync.c 24 May 2004 01:50:16 -0000 1.17
+++ b/mail-index-sync.c 28 May 2004 01:33:11 -0000 1.18
@@ -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)
Index: mail-index-view-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-view-sync.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- a/mail-index-view-sync.c 24 May 2004 01:50:16 -0000 1.11
+++ b/mail-index-view-sync.c 28 May 2004 01:33:11 -0000 1.12
@@ -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);
Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- a/mail-transaction-log-view.c 24 May 2004 01:50:16 -0000 1.12
+++ b/mail-transaction-log-view.c 28 May 2004 01:33:11 -0000 1.13
@@ -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++) {
- 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 @@
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;
}
Index: mail-transaction-log.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- a/mail-transaction-log.h 24 May 2004 01:50:16 -0000 1.10
+++ b/mail-transaction-log.h 28 May 2004 01:33:11 -0000 1.11
@@ -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. */
- Previous message: [dovecot-cvs] dovecot/src/lib-index mail-index-private.h, 1.16,
1.17 mail-index.c, 1.126, 1.127 mail-transaction-log.c, 1.30, 1.31
- Next message: [dovecot-cvs] dovecot/src/auth auth-master-connection.c, 1.5,
1.6 auth-master-connection.h, 1.1, 1.2 main.c, 1.22,
1.23 mech.c, 1.19, 1.20
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the dovecot-cvs
mailing list