[dovecot-cvs] dovecot/src/lib-storage/index/maildir maildir-save.c, 1.54, 1.55 maildir-storage.h, 1.40, 1.41 maildir-sync.c, 1.61, 1.62 maildir-uidlist.c, 1.38, 1.39

cras at dovecot.org cras at dovecot.org
Tue Jul 12 15:45:08 EEST 2005


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

Modified Files:
	maildir-save.c maildir-storage.h maildir-sync.c 
	maildir-uidlist.c 
Log Message:
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Fixed saving message into empty and non-synced mailboxes.



Index: maildir-save.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-save.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- maildir-save.c	4 Jul 2005 11:32:26 -0000	1.54
+++ maildir-save.c	12 Jul 2005 12:45:06 -0000	1.55
@@ -46,6 +46,7 @@
 	time_t received_date;
 	uint32_t seq;
 
+	unsigned int synced:1;
 	unsigned int failed:1;
 };
 
@@ -105,6 +106,8 @@
 	ctx->newdir = p_strconcat(pool, mbox->path, "/new", NULL);
 	ctx->curdir = p_strconcat(pool, mbox->path, "/cur", NULL);
 
+	ctx->synced = maildir_sync_is_synced(mbox) > 0;
+
 	ctx->keywords_buffer = buffer_create_const_data(pool, NULL, 0);
 	array_create_from_buffer(&ctx->keywords_array, ctx->keywords_buffer,
 				 sizeof(unsigned int));
@@ -116,7 +119,7 @@
 		  enum mail_flags flags, struct mail_keywords *keywords,
 		  time_t received_date, int timezone_offset __attr_unused__,
 		  const char *from_envelope __attr_unused__,
-		  struct istream *input, int want_mail __attr_unused__)
+		  struct istream *input, int want_mail)
 {
 	struct maildir_transaction_context *t =
 		(struct maildir_transaction_context *)_t;
@@ -182,12 +185,22 @@
 		       sizeof(unsigned int) * keywords->count);
 	}
 
-	/* insert into index */
-	mail_index_append(ctx->trans, 0, &ctx->seq);
-	mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE, flags);
-	if (keywords != NULL) {
-		mail_index_update_keywords(ctx->trans, ctx->seq,
-					   MODIFY_REPLACE, keywords);
+	if (!ctx->synced && want_mail) {
+		if (maildir_storage_sync_force(mbox) < 0)
+			ctx->failed = TRUE;
+		else
+			ctx->synced = TRUE;
+	}
+
+	if (ctx->synced) {
+		/* insert into index */
+		mail_index_append(ctx->trans, 0, &ctx->seq);
+		mail_index_update_flags(ctx->trans, ctx->seq,
+					MODIFY_REPLACE, flags);
+		if (keywords != NULL) {
+			mail_index_update_keywords(ctx->trans, ctx->seq,
+						   MODIFY_REPLACE, keywords);
+		}
 	}
 	t_pop();
 
@@ -358,8 +371,10 @@
 		return -1;
 	}
 
-	first_uid = maildir_uidlist_get_next_uid(ctx->mbox->uidlist);
-	mail_index_append_assign_uids(ctx->trans, first_uid, &last_uid);
+	if (ctx->synced) {
+		first_uid = maildir_uidlist_get_next_uid(ctx->mbox->uidlist);
+		mail_index_append_assign_uids(ctx->trans, first_uid, &last_uid);
+	}
 
 	flags = MAILDIR_UIDLIST_REC_FLAG_NEW_DIR |
 		MAILDIR_UIDLIST_REC_FLAG_RECENT;

Index: maildir-storage.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-storage.h,v
retrieving revision 1.40
retrieving revision 1.41
diff -u -d -r1.40 -r1.41
--- maildir-storage.h	30 Jun 2005 20:28:20 -0000	1.40
+++ maildir-storage.h	12 Jul 2005 12:45:06 -0000	1.41
@@ -92,6 +92,8 @@
 struct mailbox_list *
 maildir_mailbox_list_next(struct mailbox_list_context *ctx);
 
+int maildir_sync_is_synced(struct maildir_mailbox *mbox);
+
 struct mailbox_sync_context *
 maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags);
 int maildir_storage_sync_force(struct maildir_mailbox *mbox);

Index: maildir-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-sync.c,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- maildir-sync.c	4 Jul 2005 11:32:27 -0000	1.61
+++ maildir-sync.c	12 Jul 2005 12:45:06 -0000	1.62
@@ -732,42 +732,59 @@
 	return ret < 0 ? -1 : (moves <= MAILDIR_RENAME_RESCAN_COUNT ? 0 : 1);
 }
 
-static int maildir_sync_quick_check(struct maildir_sync_context *ctx,
-				    int *new_changed_r, int *cur_changed_r)
+static void
+maildir_sync_update_from_header(struct maildir_mailbox *mbox)
+{
+	uint64_t value;
+
+	/* FIXME: ugly, replace with extension header */
+	value = mail_index_get_header(mbox->ibox.view)->sync_size;
+	mbox->last_new_mtime = value & 0xffffffff;
+	mbox->last_new_sync_time = value >> 32;
+
+	mbox->last_cur_mtime =
+		mail_index_get_header(mbox->ibox.view)->sync_stamp;
+}
+
+static int
+maildir_sync_quick_check(struct maildir_mailbox *mbox,
+			 const char *new_dir, const char *cur_dir,
+			 int *new_changed_r, int *cur_changed_r)
 {
-	struct maildir_mailbox *mbox = ctx->mbox;
 	struct stat st;
 	time_t new_mtime, cur_mtime;
 
 	*new_changed_r = *cur_changed_r = FALSE;
 
-	if (stat(ctx->new_dir, &st) < 0) {
+	if (stat(new_dir, &st) < 0) {
 		mail_storage_set_critical(STORAGE(mbox->storage),
-					  "stat(%s) failed: %m", ctx->new_dir);
+					  "stat(%s) failed: %m", new_dir);
 		return -1;
 	}
 	new_mtime = st.st_mtime;
 
-	if (stat(ctx->cur_dir, &st) < 0) {
+	if (stat(cur_dir, &st) < 0) {
 		mail_storage_set_critical(STORAGE(mbox->storage),
-					  "stat(%s) failed: %m", ctx->cur_dir);
+					  "stat(%s) failed: %m", cur_dir);
 		return -1;
 	}
 	cur_mtime = st.st_mtime;
 
 	/* cur stamp is kept in index, we don't have to sync if
-	   someone else has done it and updated the index. */
-	mbox->last_cur_mtime =
-		mail_index_get_header(mbox->ibox.view)->sync_stamp;
-	if (mbox->dirty_cur_time == 0 && cur_mtime != mbox->last_cur_mtime) {
+	   someone else has done it and updated the index.
+
+	   FIXME: For now we're using sync_size field as the new/ dir's stamp.
+	   Pretty ugly.. */
+        maildir_sync_update_from_header(mbox);
+	if ((mbox->dirty_cur_time == 0 && cur_mtime != mbox->last_cur_mtime) ||
+	    (new_mtime != mbox->last_new_mtime)) {
 		/* check if the index has been updated.. */
 		if (mail_index_refresh(mbox->ibox.index) < 0) {
 			mail_storage_set_index_error(&mbox->ibox);
 			return -1;
 		}
 
-		mbox->last_cur_mtime =
-			mail_index_get_header(mbox->ibox.view)->sync_stamp;
+		maildir_sync_update_from_header(mbox);
 	}
 
 	if (new_mtime != mbox->last_new_mtime ||
@@ -836,6 +853,8 @@
 	array_t ARRAY_DEFINE(keywords, unsigned int);
 	array_t ARRAY_DEFINE(idx_keywords, unsigned int);
 	uint32_t uid_validity, next_uid;
+	uint64_t value;
+	time_t old_new_sync_time;
 	int ret = 0, full_rescan = FALSE;
 
 	i_assert(maildir_uidlist_is_locked(sync_ctx->mbox->uidlist));
@@ -1057,6 +1076,23 @@
 			&sync_stamp, sizeof(sync_stamp), TRUE);
 	}
 
+	/* FIXME: use a header extension instead of sync_size.. */
+	value = mbox->last_new_mtime;
+	old_new_sync_time = hdr->sync_size >> 32;
+	if (mbox->last_new_mtime >= old_new_sync_time - MAILDIR_SYNC_SECS) {
+		value |= (uint64_t)mbox->last_new_sync_time << 32;
+	} else {
+		value |= (uint64_t)old_new_sync_time << 32;
+	}
+	if (value != hdr->sync_size) {
+		uint64_t sync_stamp = mbox->last_new_mtime |
+			((uint64_t)mbox->last_new_sync_time << 32);
+
+		mail_index_update_header(trans,
+			offsetof(struct mail_index_header, sync_size),
+			&sync_stamp, sizeof(sync_stamp), TRUE);
+	}
+
 	if (hdr->uid_validity == 0) {
 		/* get the initial uidvalidity */
 		if (maildir_uidlist_update(mbox->uidlist) < 0)
@@ -1124,7 +1160,9 @@
 	if (sync_last_commit) {
 		new_changed = cur_changed = FALSE;
 	} else if (!forced) {
-		if (maildir_sync_quick_check(ctx, &new_changed, &cur_changed) < 0)
+		if (maildir_sync_quick_check(ctx->mbox,
+					     ctx->new_dir, ctx->cur_dir,
+					     &new_changed, &cur_changed) < 0)
 			return -1;
 
 		if (!new_changed && !cur_changed)
@@ -1286,3 +1324,18 @@
 
 	return index_mailbox_sync_init(box, flags, ret < 0);
 }
+
+int maildir_sync_is_synced(struct maildir_mailbox *mbox)
+{
+	const char *new_dir, *cur_dir;
+	int ret, new_changed, cur_changed;
+
+	t_push();
+	new_dir = t_strconcat(mbox->path, "/new", NULL);
+	cur_dir = t_strconcat(mbox->path, "/cur", NULL);
+
+	ret = maildir_sync_quick_check(mbox, new_dir, cur_dir,
+				       &new_changed, &cur_changed);
+	t_pop();
+	return ret < 0 ? -1 : (!new_changed && !cur_changed);
+}

Index: maildir-uidlist.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/maildir/maildir-uidlist.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- maildir-uidlist.c	30 Jun 2005 20:28:20 -0000	1.38
+++ maildir-uidlist.c	12 Jul 2005 12:45:06 -0000	1.39
@@ -466,9 +466,13 @@
 
 	uidlist->version = 1;
 
-	if (uidlist->uid_validity == 0)
-		uidlist->uid_validity = ioloop_time;
+	if (uidlist->uid_validity == 0) {
+		/* Get UIDVALIDITY from index */
+		const struct mail_index_header *hdr;
 
+		hdr = mail_index_get_header(uidlist->mbox->ibox.view);
+		uidlist->uid_validity = hdr->uid_validity;
+	}
 	str = t_str_new(4096);
 	str_printfa(str, "%u %u %u\n", uidlist->version,
 		    uidlist->uid_validity, uidlist->next_uid);



More information about the dovecot-cvs mailing list