[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-storage.c, 1.73, 1.74 maildir-sync.c, 1.21, 1.22 maildir-uidlist.c, 1.21, 1.22 maildir-uidlist.h, 1.7, 1.8

cras at procontrol.fi cras at procontrol.fi
Mon May 24 05:29:45 EEST 2004


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

Modified Files:
	maildir-storage.c maildir-sync.c maildir-uidlist.c 
	maildir-uidlist.h 
Log Message:
Some more UIDVALIDITY issues fixed.



Index: maildir-storage.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.c,v
retrieving revision 1.73
retrieving revision 1.74
diff -u -d -r1.73 -r1.74
--- a/maildir-storage.c	24 May 2004 01:50:17 -0000	1.73
+++ b/maildir-storage.c	24 May 2004 02:29:43 -0000	1.74
@@ -407,7 +407,6 @@
 {
 	struct index_mailbox *ibox;
 	struct mail_index *index;
-	const struct mail_index_header *hdr;
 	const char *path, *index_dir, *control_dir;
 	struct stat st;
 
@@ -422,17 +421,12 @@
 	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, hdr->uid_validity);
+	ibox->uidlist = maildir_uidlist_init(ibox);
 
 	/* 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.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- a/maildir-sync.c	24 May 2004 01:50:17 -0000	1.21
+++ b/maildir-sync.c	24 May 2004 02:29:43 -0000	1.22
@@ -593,7 +593,8 @@
 	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) {
+	if (uid_validity != hdr->uid_validity &&
+	    uid_validity != 0 && hdr->uid_validity != 0) {
 		/* uidvalidity changed and mailbox isn't being initialized,
 		   index must be rebuilt */
 		mail_storage_set_critical(ibox->box.storage,
@@ -737,7 +738,22 @@
 			&sync_stamp, sizeof(sync_stamp));
 	}
 
-	if (uid_validity != hdr->uid_validity) {
+	if (hdr->uid_validity == 0) {
+		/* get the initial uidvalidity */
+		if (maildir_uidlist_update(ibox->uidlist) < 0)
+			ret = -1;
+		uid_validity = maildir_uidlist_get_uid_validity(ibox->uidlist);
+		if (uid_validity == 0) {
+			uid_validity = ioloop_time;
+			maildir_uidlist_set_uid_validity(ibox->uidlist,
+							 uid_validity);
+		}
+	} else if (uid_validity == 0) {
+		maildir_uidlist_set_uid_validity(ibox->uidlist,
+						 hdr->uid_validity);
+	}
+
+	if (uid_validity != hdr->uid_validity && uid_validity != 0) {
 		mail_index_update_header(trans,
 			offsetof(struct mail_index_header, uid_validity),
 			&uid_validity, sizeof(uid_validity));

Index: maildir-uidlist.c
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- a/maildir-uidlist.c	24 May 2004 01:50:17 -0000	1.21
+++ b/maildir-uidlist.c	24 May 2004 02:29:43 -0000	1.22
@@ -45,6 +45,7 @@
 
 	unsigned int initial_read:1;
 	unsigned int initial_sync:1;
+	unsigned int file_missing:1;
 };
 
 struct maildir_uidlist_sync_ctx {
@@ -109,8 +110,7 @@
 	uidlist->lock_fd = -1;
 }
 
-struct maildir_uidlist *
-maildir_uidlist_init(struct index_mailbox *ibox, uint32_t uid_validity)
+struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox)
 {
 	struct maildir_uidlist *uidlist;
 
@@ -124,7 +124,6 @@
 	uidlist->files = hash_create(default_pool, default_pool, 4096,
 				     maildir_hash, maildir_cmp);
 
-	uidlist->uid_validity = uid_validity;
 	uidlist->next_uid = 1;
 
 	return uidlist;
@@ -258,9 +257,11 @@
 				"open(%s) failed: %m", uidlist->fname);
 			return -1;
 		}
+		uidlist->file_missing = TRUE;
 		uidlist->initial_read = TRUE;
 		return 0;
 	}
+	uidlist->file_missing = FALSE;
 
 	if (fstat(fd, &st) < 0) {
 		mail_storage_set_critical(storage,
@@ -422,6 +423,12 @@
 	return uidlist->uid_validity;
 }
 
+void maildir_uidlist_set_uid_validity(struct maildir_uidlist *uidlist,
+				      uint32_t uid_validity)
+{
+	uidlist->uid_validity = uid_validity;
+}
+
 uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist)
 {
 	return !uidlist->initial_read ? 0 : uidlist->next_uid;
@@ -439,7 +446,10 @@
 	const char *filename, *flags_str;
 	int ret = 0;
 
-        uidlist->version = 2;
+	uidlist->version = 2;
+
+	if (uidlist->uid_validity == 0)
+		uidlist->uid_validity = ioloop_time;
 
 	str = t_str_new(4096);
 	str_printfa(str, "%u %u %u\n", uidlist->version,
@@ -516,6 +526,8 @@
 			mail_storage_set_critical(ibox->box.storage,
 				"file_dotlock_replace(%s) failed: %m", db_path);
 			ret = -1;
+		} else {
+			uidlist->file_missing = FALSE;
 		}
 	} else {
 		(void)close(uidlist->lock_fd);
@@ -624,6 +636,12 @@
 		}
 		ctx->new_files_count++;
 
+		if (uidlist->record_pool == NULL) {
+			uidlist->record_pool =
+				pool_alloconly_create("uidlist record_pool",
+						      1024);
+		}
+
 		rec = p_new(uidlist->record_pool,
 			    struct maildir_uidlist_rec, 1);
 		rec->uid = (uint32_t)-1;

Index: maildir-uidlist.h
===================================================================
RCS file: /home/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- a/maildir-uidlist.h	24 May 2004 01:50:17 -0000	1.7
+++ b/maildir-uidlist.h	24 May 2004 02:29:43 -0000	1.8
@@ -13,8 +13,7 @@
 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, uint32_t uid_validity);
+struct maildir_uidlist *maildir_uidlist_init(struct index_mailbox *ibox);
 void maildir_uidlist_deinit(struct maildir_uidlist *uidlist);
 
 /* Returns -1 if error, 0 if file is broken or lost, 1 if ok. */
@@ -32,6 +31,9 @@
 uint32_t maildir_uidlist_get_uid_validity(struct maildir_uidlist *uidlist);
 uint32_t maildir_uidlist_get_next_uid(struct maildir_uidlist *uidlist);
 
+void maildir_uidlist_set_uid_validity(struct maildir_uidlist *uidlist,
+				      uint32_t uid_validity);
+
 /* 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