[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


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. */



More information about the dovecot-cvs mailing list