[dovecot-cvs] dovecot/src/lib-index mail-index-lock.c, 1.2, 1.3 mail-index-sync-update.c, 1.2, 1.3 mail-index.c, 1.107, 1.108 mail-transaction-log-view.c, 1.1, 1.2 mail-transaction-log.c, 1.2, 1.3

cras at procontrol.fi cras at procontrol.fi
Wed Apr 28 04:21:45 EEST 2004


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

Modified Files:
	mail-index-lock.c mail-index-sync-update.c mail-index.c 
	mail-transaction-log-view.c mail-transaction-log.c 
Log Message:
locking fixes, mmap_disable=yes fixes



Index: mail-index-lock.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-lock.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-lock.c	28 Apr 2004 00:21:00 -0000	1.2
+++ mail-index-lock.c	28 Apr 2004 01:21:42 -0000	1.3
@@ -241,6 +241,8 @@
         index->excl_lock_count++;
 
 	if (mail_index_reopen(index, fd) < 0) {
+		/* FIXME: do this without another reopen which drops locks
+		   and causes potential crashes */
 		i_assert(index->excl_lock_count == 1);
 		i_free(index->copy_lock_path);
 		index->copy_lock_path = NULL;
@@ -304,6 +306,17 @@
 
 static int mail_index_copy_lock_finish(struct mail_index *index)
 {
+	if (index->shared_lock_count > 0) {
+		/* leave ourself shared locked. */
+		if (file_try_lock(index->fd, F_RDLCK) <= 0) {
+			mail_index_file_set_syscall_error(index,
+							  index->copy_lock_path,
+							  "file_try_lock()");
+			return -1;
+		}
+		index->lock_id--;
+	}
+
 	if (fsync(index->fd) < 0) {
 		mail_index_file_set_syscall_error(index, index->copy_lock_path,
 						  "fsync()");
@@ -318,40 +331,34 @@
 
 	i_free(index->copy_lock_path);
 	index->copy_lock_path = NULL;
-
-	index->shared_lock_count = 0;
-	index->lock_id += 2;
-	index->lock_type = F_UNLCK;
 	return 0;
 }
 
-void mail_index_unlock(struct mail_index *index, unsigned int lock_id)
+static void mail_index_excl_unlock_finish(struct mail_index *index)
 {
-	if (index->copy_lock_path != NULL ||
-	    (index->map != NULL && index->map->write_to_disk)) {
+	if (index->map != NULL && index->map->write_to_disk) {
 		i_assert(index->log_locked);
-		i_assert(index->excl_lock_count > 0);
-		i_assert(lock_id == index->lock_id+1);
 
-		if (--index->excl_lock_count == 0) {
-			if (index->map != NULL && index->map->write_to_disk) {
-				if (index->copy_lock_path != NULL) {
-					/* new mapping replaces the old */
-					(void)unlink(index->copy_lock_path);
-                                        i_free(index->copy_lock_path);
-                                        index->copy_lock_path = NULL;
-				}
-				if (mail_index_copy(index) < 0) {
-					mail_index_set_inconsistent(index);
-					return;
-				}
-			}
-			if (mail_index_copy_lock_finish(index) < 0)
-				mail_index_set_inconsistent(index);
+		if (index->copy_lock_path != NULL) {
+			/* new mapping replaces the old */
+			(void)unlink(index->copy_lock_path);
+			i_free(index->copy_lock_path);
+			index->copy_lock_path = NULL;
 		}
-		return;
+		if (mail_index_copy(index) < 0)
+			mail_index_set_inconsistent(index);
 	}
 
+	if (index->copy_lock_path != NULL) {
+		i_assert(index->log_locked);
+
+		if (mail_index_copy_lock_finish(index) < 0)
+			mail_index_set_inconsistent(index);
+	}
+}
+
+void mail_index_unlock(struct mail_index *index, unsigned int lock_id)
+{
 	if ((lock_id & 1) == 0) {
 		/* shared lock */
 		if (mail_index_is_locked(index, lock_id)) {
@@ -362,13 +369,15 @@
 		/* exclusive lock */
 		i_assert(lock_id == index->lock_id+1);
 		i_assert(index->excl_lock_count > 0);
-		index->excl_lock_count--;
+		if (--index->excl_lock_count == 0)
+			mail_index_excl_unlock_finish(index);
 	}
 
 	if (index->shared_lock_count == 0 && index->excl_lock_count == 0) {
 		index->lock_id += 2;
 		index->lock_type = F_UNLCK;
-		if (index->map != NULL) {
+		if (index->map != NULL &&
+		    !MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
 			if (mprotect(index->map->mmap_base,
 				     index->map->file_size, PROT_NONE) < 0)
 				mail_index_set_syscall_error(index,

Index: mail-index-sync-update.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index-sync-update.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-index-sync-update.c	28 Apr 2004 00:21:00 -0000	1.2
+++ mail-index-sync-update.c	28 Apr 2004 01:21:42 -0000	1.3
@@ -263,6 +263,9 @@
 		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()");
+	} else {
+		map->hdr_copy = ctx.hdr;
+		map->hdr = &map->hdr_copy;
 	}
 
 	return ret;

Index: mail-index.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -d -r1.107 -r1.108
--- mail-index.c	28 Apr 2004 00:21:00 -0000	1.107
+++ mail-index.c	28 Apr 2004 01:21:42 -0000	1.108
@@ -313,7 +313,7 @@
 	map->log_file_seq = map->hdr->log_file_seq;
 	map->log_file_offset = map->hdr->log_file_offset;
 
-	index->hdr = map->mmap_base;
+	index->hdr = map->hdr;
 	index->map = map;
 	return 1;
 }

Index: mail-transaction-log-view.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log-view.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- mail-transaction-log-view.c	27 Apr 2004 20:25:53 -0000	1.1
+++ mail-transaction-log-view.c	28 Apr 2004 01:21:42 -0000	1.2
@@ -151,13 +151,11 @@
 {
 	va_list va;
 
-	i_assert(view->file != NULL);
-
 	view->broken = TRUE;
 
 	va_start(va, fmt);
 	t_push();
-	mail_transaction_log_file_set_corrupted(view->file, "%s",
+	mail_transaction_log_file_set_corrupted(view->log->head, "%s",
 						t_strdup_vprintf(fmt, va));
 	t_pop();
 	va_end(va);

Index: mail-transaction-log.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-index/mail-transaction-log.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-transaction-log.c	28 Apr 2004 00:21:00 -0000	1.2
+++ mail-transaction-log.c	28 Apr 2004 01:21:42 -0000	1.3
@@ -102,7 +102,8 @@
 	    log->head->hdr.file_seq != index->hdr->log_file_seq) {
 		/* head log file isn't same as head index file -
 		   shouldn't happen except in race conditions. lock them and
-		   check again - FIXME: missing error handling */
+		   check again - FIXME: missing error handling.
+		   FIXME: index->hdr check crashes if we created the log */
 		(void)mail_transaction_log_check_file_seq(log);
 	}
 	return log;
@@ -178,6 +179,7 @@
 	}
 
 	if (ret < 0) {
+		// FIXME: handle ESTALE
 		mail_index_file_set_syscall_error(file->log->index,
 						  file->filepath, "pread()");
 		return -1;
@@ -542,6 +544,9 @@
 	}
 
 	size = file->hdr.used_size - file->buffer_offset - size;
+	if (size == 0)
+		return 1;
+
 	data = buffer_append_space_unsafe(file->buffer, size);
 
 	ret = pread(file->fd, data, size, offset);



More information about the dovecot-cvs mailing list