[dovecot-cvs] dovecot/src/lib-index mail-index-fsck.c, 1.16, 1.17 mail-index-lock.c, 1.5, 1.6 mail-index-private.h, 1.3, 1.4 mail-index-sync-update.c, 1.3, 1.4 mail-index-sync.c, 1.2, 1.3 mail-index-view.c, 1.2, 1.3 mail-transaction-log-view.c, 1.2, 1.3 mail-transaction-log.c, 1.4, 1.5 mail-transaction-util.c, 1.1, 1.2

cras at procontrol.fi cras at procontrol.fi
Wed Apr 28 05:39:05 EEST 2004


Update of /home/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv7924

Modified Files:
	mail-index-fsck.c mail-index-lock.c mail-index-private.h 
	mail-index-sync-update.c mail-index-sync.c mail-index-view.c 
	mail-transaction-log-view.c mail-transaction-log.c 
	mail-transaction-util.c 
Log Message:
Locking changes. bugfixes.



Index: mail-index-fsck.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-fsck.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- mail-index-fsck.c	27 Apr 2004 20:25:53 -0000	1.16
+++ mail-index-fsck.c	28 Apr 2004 02:39:03 -0000	1.17
@@ -112,7 +112,7 @@
 	if (mail_transaction_log_sync_lock(index->log, &file_seq,
 					   &file_offset) < 0)
 		return -1;
-	if (mail_index_lock_exclusive(index, 0, 0, &lock_id) < 0) {
+	if (mail_index_lock_exclusive(index, &lock_id) < 0) {
                 mail_transaction_log_sync_unlock(index->log);
 		return -1;
 	}

Index: mail-index-lock.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-lock.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- mail-index-lock.c	28 Apr 2004 02:01:54 -0000	1.5
+++ mail-index-lock.c	28 Apr 2004 02:39:03 -0000	1.6
@@ -108,8 +108,13 @@
 		   locks then, though */
 		if (lock_type == F_WRLCK)
 			return 0;
+		if (update_index && index->lock_type == F_UNLCK) {
+			if (mail_index_has_changed(index) < 0)
+				return -1;
+		}
 		if (mail_index_lock_mprotect(index, lock_type) < 0)
 			return -1;
+		index->lock_type = lock_type;
 		return 1;
 	}
 
@@ -227,23 +232,6 @@
 	return fd;
 }
 
-static int mail_index_need_lock(struct mail_index *index,
-				uint32_t log_file_seq, uoff_t log_file_offset)
-{
-	if (mail_index_map(index, FALSE) <= 0)
-		return 1;
-
-	if (log_file_seq != 0 &&
-	    (index->hdr->log_file_seq > log_file_seq ||
-	     (index->hdr->log_file_seq == log_file_seq &&
-	      index->hdr->log_file_offset >= log_file_offset))) {
-		/* already synced */
-		return 0;
-	}
-
-	return 1;
-}
-
 static int mail_index_lock_exclusive_copy(struct mail_index *index)
 {
 	int fd;
@@ -252,7 +240,7 @@
 
 	if (index->copy_lock_path != NULL) {
 		index->excl_lock_count++;
-		return 1;
+		return 0;
 	}
 
 	/* copy the index to index.tmp and use it. when */
@@ -280,14 +268,12 @@
 	}
 
         i_assert(index->excl_lock_count == 1);
-	return 1;
+	return 0;
 }
 
 int mail_index_lock_exclusive(struct mail_index *index,
-			      uint32_t log_file_seq, uoff_t log_file_offset,
 			      unsigned int *lock_id_r)
 {
-	unsigned int lock_id;
 	int ret;
 
 	/* exclusive transaction log lock protects exclusive locking
@@ -296,33 +282,11 @@
 
 	/* wait two seconds for exclusive lock */
 	ret = mail_index_lock(index, F_WRLCK, 2, TRUE, lock_id_r);
-	if (ret > 0) {
-		if (mail_index_need_lock(index, log_file_seq, log_file_offset))
-			return 1;
-
-		mail_index_unlock(index, *lock_id_r);
+	if (ret > 0)
 		return 0;
-	}
 	if (ret < 0)
 		return -1;
 
-	/* Grab shared lock to make sure it's not already being
-	   exclusively locked */
-	if (mail_index_lock_shared(index, TRUE, &lock_id) < 0)
-		return -1;
-
-	if (log_file_seq != 0) {
-		/* check first if we really need to recreate it */
-		ret = mail_index_need_lock(index, log_file_seq,
-					   log_file_offset);
-		if (ret == 0) {
-			mail_index_unlock(index, lock_id);
-			return 0;
-		}
-	}
-
-	mail_index_unlock(index, lock_id);
-
 	*lock_id_r = index->lock_id + 1;
 	return mail_index_lock_exclusive_copy(index);
 }

Index: mail-index-private.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mail-index-private.h	28 Apr 2004 02:00:39 -0000	1.3
+++ mail-index-private.h	28 Apr 2004 02:39:03 -0000	1.4
@@ -99,9 +99,8 @@
    races, unless transaction log is exclusively locked). */
 int mail_index_lock_shared(struct mail_index *index, int update_index,
 			   unsigned int *lock_id_r);
-/* Returns 1 = ok, 0 = already synced up to given log_file_offset, -1 = error */
+/* Returns 0 = ok, -1 = error. */
 int mail_index_lock_exclusive(struct mail_index *index,
-			      uint32_t log_file_seq, uoff_t log_file_offset,
 			      unsigned int *lock_id_r);
 void mail_index_unlock(struct mail_index *index, unsigned int lock_id);
 /* Returns 1 if given lock_id is valid, 0 if not. */

Index: mail-index-sync-update.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-sync-update.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- mail-index-sync-update.c	28 Apr 2004 01:21:42 -0000	1.3
+++ mail-index-sync-update.c	28 Apr 2004 02:39:03 -0000	1.4
@@ -176,6 +176,7 @@
 	unsigned int append_count;
 	uint32_t count, file_seq, src_idx, dest_idx;
 	uoff_t file_offset;
+	unsigned int lock_id;
 	int ret;
 
 	/* rewind */
@@ -188,6 +189,9 @@
 		return 0;
 	}
 
+	if (mail_index_lock_exclusive(index, &lock_id) < 0)
+		return -1;
+
 	if (MAIL_INDEX_MAP_IS_IN_MEMORY(map))
 		map->write_to_disk = TRUE;
 
@@ -261,12 +265,15 @@
 
 	if (!MAIL_INDEX_MAP_IS_IN_MEMORY(map)) {
 		memcpy(map->mmap_base, &ctx.hdr, sizeof(ctx.hdr));
-		if (msync(map->mmap_base, map->file_used_size, MS_SYNC) < 0)
-			return mail_index_set_syscall_error(index, "msync()");
+		if (msync(map->mmap_base, map->file_used_size, MS_SYNC) < 0) {
+			mail_index_set_syscall_error(index, "msync()");
+			ret = -1;
+		}
 	} else {
 		map->hdr_copy = ctx.hdr;
 		map->hdr = &map->hdr_copy;
 	}
 
+	mail_index_unlock(index, lock_id);
 	return ret;
 }

Index: mail-index-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-sync.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-sync.c	28 Apr 2004 00:21:00 -0000	1.2
+++ mail-index-sync.c	28 Apr 2004 02:39:03 -0000	1.3
@@ -115,6 +115,19 @@
 	return ret;
 }
 
+static int mail_index_need_lock(struct mail_index *index,
+				uint32_t log_file_seq, uoff_t log_file_offset)
+{
+	if (index->hdr->log_file_seq > log_file_seq ||
+	     (index->hdr->log_file_seq == log_file_seq &&
+	      index->hdr->log_file_offset >= log_file_offset)) {
+		/* already synced */
+		return 0;
+	}
+
+	return 1;
+}
+
 int mail_index_sync_begin(struct mail_index *index,
                           struct mail_index_sync_ctx **ctx_r,
 			  struct mail_index_view **view_r,
@@ -125,25 +138,27 @@
 	uoff_t offset;
 	size_t size;
 	unsigned int lock_id;
-	int ret;
 
 	if (mail_transaction_log_sync_lock(index->log, &seq, &offset) < 0)
 		return -1;
 
-	/* FIXME: really needed yet? If there are readers, the index file
-	   is copied even if there are no changes.. */
-	ret = mail_index_lock_exclusive(index, log_file_seq,
-					log_file_offset, &lock_id);
-	if (ret <= 0) {
+	if (mail_index_lock_shared(index, TRUE, &lock_id) < 0) {
 		mail_transaction_log_sync_unlock(index->log);
-		return ret;
+		return -1;
 	}
 
 	if (mail_index_map(index, FALSE) <= 0) {
 		mail_transaction_log_sync_unlock(index->log);
+		mail_index_unlock(index, lock_id);
 		return -1;
 	}
 
+	if (!mail_index_need_lock(index, log_file_seq, log_file_offset)) {
+		mail_index_unlock(index, lock_id);
+		mail_transaction_log_sync_unlock(index->log);
+		return 0;
+	}
+
 	ctx = i_new(struct mail_index_sync_ctx, 1);
 	ctx->index = index;
 	ctx->lock_id = lock_id;

Index: mail-index-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-view.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-view.c	28 Apr 2004 00:21:00 -0000	1.2
+++ mail-index-view.c	28 Apr 2004 02:39:03 -0000	1.3
@@ -50,6 +50,8 @@
 			view->inconsistent = TRUE;
 			return -1;
 		}
+	} else if (update_index) {
+		// FIXME: check if we need to reopen it!
 	}
 
 	return 0;

Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-transaction-log-view.c	28 Apr 2004 01:21:42 -0000	1.2
+++ mail-transaction-log-view.c	28 Apr 2004 02:39:03 -0000	1.3
@@ -371,9 +371,15 @@
 					view->expunges_buf);
 		ret = mail_transaction_map(hdr, data, &seqfix_funcs, view);
 		mail_transaction_expunge_traverse_deinit(view->exp_ctx);
-		i_assert(buffer_get_used_size(view->data_buf) == hdr->size);
 
-		*data_r = buffer_get_data(view->data_buf, NULL);
+		if (ret > 0) {
+			/* modified */
+			i_assert(buffer_get_used_size(view->data_buf) ==
+				 hdr->size);
+			*data_r = buffer_get_data(view->data_buf, NULL);
+		} else {
+			i_assert(buffer_get_used_size(view->data_buf) == 0);
+		}
 	}
 
 	if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) != 0) {

Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- mail-transaction-log.c	28 Apr 2004 02:00:39 -0000	1.4
+++ mail-transaction-log.c	28 Apr 2004 02:39:03 -0000	1.5
@@ -327,7 +327,7 @@
 
 	if (index->fd != -1) {
 		index->log_locked = TRUE; /* kludging around assert.. */
-		if (mail_index_lock_exclusive(index, 0, 0, &lock_id) < 0) {
+		if (mail_index_lock_exclusive(index, &lock_id) < 0) {
 			(void)file_dotlock_delete(path, fd);
 			index->log_locked = FALSE;
 			return -1;

Index: mail-transaction-util.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-util.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mail-transaction-util.c	27 Apr 2004 20:25:53 -0000	1.1
+++ mail-transaction-util.c	28 Apr 2004 02:39:03 -0000	1.2
@@ -72,7 +72,8 @@
 		}
 		break;
 	}
-	case MAIL_TRANSACTION_EXPUNGE: {
+	case MAIL_TRANSACTION_EXPUNGE:
+	case MAIL_TRANSACTION_EXPUNGE|MAIL_TRANSACTION_EXPUNGE_PROT: {
 		const struct mail_transaction_expunge *rec, *end;
 
 		if (map->expunge == NULL)



More information about the dovecot-cvs mailing list