[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-storage.c, 1.72, 1.73 maildir-sync.c, 1.20, 1.21 maildir-uidlist.c, 1.20, 1.21 maildir-uidlist.h, 1.6, 1.7

cras at procontrol.fi cras at procontrol.fi
Mon May 24 04:50:19 EEST 2004


Update of /home/cvs/dovecot/src/lib-storage/index/maildir
In directory talvi:/tmp/cvs-serv13926/lib-storage/index/maildir

Modified Files:
	maildir-storage.c maildir-sync.c maildir-uidlist.c 
	maildir-uidlist.h 
Log Message:
Index header changes now go through transaction log. Removed the kludgy
parameters for mail_index_sync_end(). Removed code duplication of syncing
index root mapping and view mapping. Some fixes to handling uidvalidity and
nextuid in syncing.



Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- a/maildir-storage.c	9 May 2004 23:32:44 -0000	1.72
+++ b/maildir-storage.c	24 May 2004 01:50:17 -0000	1.73
@@ -407,6 +407,7 @@
 {
 	struct index_mailbox *ibox;
 	struct mail_index *index;
+	const struct mail_index_header *hdr;
 	const char *path, *index_dir, *control_dir;
 	struct stat st;
 
@@ -421,12 +422,17 @@
 	if (ibox == NULL)
 		return NULL;
 
+	if (mail_index_get_header(ibox->view, &hdr) < 0) {
+		index_storage_mailbox_free(&ibox->box);
+		return NULL;
+	}
+
 	ibox->path = i_strdup(path);
 	ibox->control_dir = i_strdup(control_dir);
 
 	ibox->get_recent_count = maildir_get_recent_count;
 	ibox->mail_interface = &maildir_mail;
-	ibox->uidlist = maildir_uidlist_init(ibox);
+	ibox->uidlist = maildir_uidlist_init(ibox, hdr->uid_validity);
 
 	/* for shared mailboxes get the create mode from the
 	   permissions of dovecot-shared file */

Index: maildir-sync.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- a/maildir-sync.c	22 May 2004 22:36:46 -0000	1.20
+++ b/maildir-sync.c	24 May 2004 01:50:17 -0000	1.21
@@ -179,6 +179,7 @@
 #include "maildir-uidlist.h"
 
 #include <stdio.h>
+#include <stddef.h>
 #include <unistd.h>
 #include <dirent.h>
 #include <sys/stat.h>
@@ -357,7 +358,7 @@
 		}
 		if (mail_index_transaction_commit(ctx.trans, &seq, &offset) < 0)
 			ret = -1;
-		if (mail_index_sync_end(ctx.sync_ctx, 0, 0) < 0)
+		if (mail_index_sync_end(ctx.sync_ctx) < 0)
 			ret = -1;
 	}
 
@@ -575,7 +576,7 @@
 	const char *filename;
 	enum mail_flags flags;
 	keywords_mask_t keywords;
-	uint32_t sync_stamp;
+	uint32_t uid_validity, next_uid;
 	int ret;
 
 	memset(&sync_ctx, 0, sizeof(sync_ctx));
@@ -591,6 +592,18 @@
 	ret = mail_index_get_header(view, &hdr);
 	i_assert(ret == 0); /* view is locked, can't happen */
 
+	uid_validity = maildir_uidlist_get_uid_validity(ibox->uidlist);
+	if (uid_validity != hdr->uid_validity && hdr->next_uid != 1) {
+		/* uidvalidity changed and mailbox isn't being initialized,
+		   index must be rebuilt */
+		mail_storage_set_critical(ibox->box.storage,
+			"Maildir sync: UIDVALIDITY changed (%u -> %u)",
+			hdr->uid_validity, uid_validity);
+		mail_index_mark_corrupted(ibox->index);
+		(void)mail_index_sync_end(sync_ctx.sync_ctx);
+		return -1;
+	}
+
 	trans = mail_index_transaction_begin(view, FALSE);
 	sync_ctx.trans = trans;
 
@@ -633,7 +646,6 @@
 		}
 
 		if (mail_index_lookup(view, seq, &rec) < 0) {
-			mail_storage_set_index_error(ibox);
 			ret = -1;
 			break;
 		}
@@ -717,6 +729,27 @@
 		}
 	}
 
+	if (ibox->dirty_cur_time == 0) {
+		uint32_t sync_stamp = ibox->last_cur_mtime;
+
+		mail_index_update_header(trans,
+			offsetof(struct mail_index_header, sync_stamp),
+			&sync_stamp, sizeof(sync_stamp));
+	}
+
+	if (uid_validity != hdr->uid_validity) {
+		mail_index_update_header(trans,
+			offsetof(struct mail_index_header, uid_validity),
+			&uid_validity, sizeof(uid_validity));
+	}
+
+	next_uid = maildir_uidlist_get_next_uid(ibox->uidlist);
+	if (next_uid != 0 && hdr->next_uid != next_uid) {
+		mail_index_update_header(trans,
+			offsetof(struct mail_index_header, next_uid),
+			&next_uid, sizeof(next_uid));
+	}
+
 	if (ret < 0)
 		mail_index_transaction_rollback(trans);
 	else {
@@ -724,15 +757,14 @@
 		uoff_t offset;
 
 		if (mail_index_transaction_commit(trans, &seq, &offset) < 0)
-			mail_storage_set_index_error(ibox);
+			ret = -1;
 		else if (seq != 0) {
 			ibox->commit_log_file_seq = seq;
 			ibox->commit_log_file_offset = offset;
 		}
 	}
 
-	sync_stamp = ibox->dirty_cur_time != 0 ? 0 : ibox->last_cur_mtime;
-	if (mail_index_sync_end(sync_ctx.sync_ctx, sync_stamp, 0) < 0)
+	if (mail_index_sync_end(sync_ctx.sync_ctx) < 0)
 		ret = -1;
 
 	if (ret == 0) {

Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- a/maildir-uidlist.c	22 May 2004 22:36:46 -0000	1.20
+++ b/maildir-uidlist.c	24 May 2004 01:50:17 -0000	1.21
@@ -109,7 +109,8 @@
 	uidlist->lock_fd = -1;
 }
 
-struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox)
+struct maildir_uidlist *
+maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity)
 {
 	struct maildir_uidlist *uidlist;
 
@@ -123,7 +124,7 @@
 	uidlist->files = hash_create(default_pool, default_pool, 4096,
 				     maildir_hash, maildir_cmp);
 
-	uidlist->uid_validity = ioloop_time;
+	uidlist->uid_validity = uid_validity;
 	uidlist->next_uid = 1;
 
 	return uidlist;
@@ -416,6 +417,16 @@
 	return count;
 }
 
+uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist)
+{
+	return uidlist->uid_validity;
+}
+
+uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist)
+{
+	return !uidlist->initial_read ? 0 : uidlist->next_uid;
+}
+
 static int maildir_uidlist_rewrite_fd(struct maildir_uidlist *uidlist,
 				      const char *temp_path)
 {

Index: maildir-uidlist.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- a/maildir-uidlist.h	9 May 2004 23:52:13 -0000	1.6
+++ b/maildir-uidlist.h	24 May 2004 01:50:17 -0000	1.7
@@ -13,7 +13,8 @@
 int maildir_uidlist_try_lock(struct maildir_uidlist *uidlist);
 void maildir_uidlist_unlock(struct maildir_uidlist *uidlist);
 
-struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox);
+struct maildir_uidlist *
+maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity);
 void maildir_uidlist_deinit(struct maildir_uidlist *uidlist);
 
 /* Returns -1 if error, 0 if file is broken or lost, 1 if ok. */
@@ -28,6 +29,9 @@
 /* Returns number of recent messages. */
 uint32_t maildir_uidlist_get_recent_count(struct maildir_uidlist *uidlist);
 
+uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist);
+uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist);
+
 /* Sync uidlist with what's actually on maildir. */
 struct maildir_uidlist_sync_ctx *
 maildir_uidlist_sync_init(struct maildir_uidlist *uidlist, int partial);



More information about the dovecot-cvs mailing list