[dovecot-cvs] dovecot/src/lib-storage/index/dbox dbox-sync-expunge.c, 1.12, 1.13 dbox-sync.c, 1.11, 1.12 dbox-uidlist.c, 1.22, 1.23

cras at dovecot.org cras at dovecot.org
Thu Apr 20 19:12:31 EEST 2006


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

Modified Files:
	dbox-sync-expunge.c dbox-sync.c dbox-uidlist.c 
Log Message:
Fixes



Index: dbox-sync-expunge.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-sync-expunge.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- dbox-sync-expunge.c	12 Apr 2006 17:08:56 -0000	1.12
+++ dbox-sync-expunge.c	20 Apr 2006 16:12:29 -0000	1.13
@@ -109,8 +109,9 @@
 	if (ret <= 0) {
 		if (ret == 0) {
 			mail_storage_set_critical(STORAGE(mbox->storage),
-				"%s: Expunging lost UID %u from file",
-				mbox->path, first_nonexpunged_uid);
+				"%s: Expunging lost UID %u from file %u",
+				mbox->path, first_nonexpunged_uid,
+				orig_entry->file_seq);
 		}
 		return ret;
 	}
@@ -428,13 +429,45 @@
 	return 0;
 }
 
+static int
+uidlist_entry_remove_uids(struct dbox_sync_context *ctx,
+			  const struct dbox_sync_file_entry *sync_entry)
+{
+	struct dbox_uidlist_entry *entry;
+	const struct dbox_sync_rec *recs;
+	uint32_t uid;
+	unsigned int i, count, seq;
+
+	entry = dbox_uidlist_entry_lookup(ctx->mbox->uidlist,
+					  sync_entry->file_seq);
+	if (entry == NULL)
+		return 0;
+
+	recs = array_get(&sync_entry->sync_recs, &count);
+	for (i = 0; i < count; i++) {
+		for (seq = recs[i].seq1; seq <= recs[i].seq2; seq++) {
+			if (mail_index_lookup_uid(ctx->sync_view,
+						  seq, &uid) < 0) {
+				mail_storage_set_index_error(&ctx->mbox->ibox);
+				return -1;
+			}
+			seq_range_array_remove(&entry->uid_list, uid);
+		}
+	}
+	if (array_count(&entry->uid_list) == 0) {
+		dbox_uidlist_sync_unlink(ctx->uidlist_sync_ctx,
+					 entry->file_seq);
+	}
+	dbox_uidlist_sync_set_modified(ctx->uidlist_sync_ctx);
+	return 0;
+}
+
 int dbox_sync_expunge(struct dbox_sync_context *ctx,
 		      const struct dbox_sync_file_entry *sync_entry,
 		      unsigned int sync_idx)
 {
 	struct dbox_mailbox *mbox = ctx->mbox;
 	const struct dbox_sync_rec *sync_rec;
-	struct dbox_uidlist_entry *entry;
 	struct dotlock *dotlock;
 	const char *path;
 	int ret;
@@ -485,22 +518,5 @@
 	}
 
 	/* remove UIDs from the uidlist entry */
-	entry = dbox_uidlist_entry_lookup(mbox->uidlist, sync_entry->file_seq);
-	if (entry != NULL) {
-		const struct dbox_sync_rec *recs;
-		unsigned int i, count, seq;
-
-		recs = array_get(&sync_entry->sync_recs, &count);
-		for (i = 0; i < count; i++) {
-			for (seq = recs[i].seq1; seq <= recs[i].seq2; seq++)
-				seq_range_array_remove(&entry->uid_list, seq);
-		}
-		if (array_count(&entry->uid_list) == 0) {
-			dbox_uidlist_sync_unlink(ctx->uidlist_sync_ctx,
-						 entry->file_seq);
-		}
-		dbox_uidlist_sync_set_modified(ctx->uidlist_sync_ctx);
-	}
-
-	return 0;
+	return uidlist_entry_remove_uids(ctx, sync_entry);
 }

Index: dbox-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-sync.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- dbox-sync.c	31 Mar 2006 21:21:20 -0000	1.11
+++ dbox-sync.c	20 Apr 2006 16:12:29 -0000	1.12
@@ -328,7 +328,9 @@
 	for (i = 0; i < count; i++) {
 		switch (sync_recs[i].type) {
 		case MAIL_INDEX_SYNC_TYPE_EXPUNGE:
+			t_push();
 			ret = dbox_sync_expunge(ctx, entry, i);
+			t_pop();
 			if (ret > 0) {
 				/* handled expunging by copying the file.
 				   while at it, also wrote all the other sync

Index: dbox-uidlist.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-storage/index/dbox/dbox-uidlist.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -d -r1.22 -r1.23
--- dbox-uidlist.c	12 Apr 2006 19:24:59 -0000	1.22
+++ dbox-uidlist.c	20 Apr 2006 16:12:29 -0000	1.23
@@ -221,6 +221,7 @@
 {
 	struct dbox_uidlist_entry *entry;
 	struct seq_range range;
+	const char *error = NULL;
 	uint32_t digit;
 	int ret;
 
@@ -239,7 +240,9 @@
 			if (range.seq1 == 0) {
 				if (digit <= range.seq2) {
 					/* broken */
-					array_clear(&entry->uid_list);
+					error = t_strdup_printf("UID %u <= %u",
+								digit,
+								range.seq2);
 					break;
 				}
 				range.seq1 = digit;
@@ -247,7 +250,9 @@
 			if (*line == ',' || *line == ' ') {
 				if (range.seq1 > digit) {
 					/* broken */
-					array_clear(&entry->uid_list);
+					error = t_strdup_printf("UID %u > %u",
+								range.seq1,
+								digit);
 					break;
 				}
 				range.seq2 = digit;
@@ -266,9 +271,17 @@
 		}
 	}
 
-	if (*line != ' ' || array_count(&entry->uid_list) == 0) {
+	if (error == NULL) {
+		if (*line != ' ') {
+			error = *line == '\0' ? "File sequence missing" :
+				"Expecting space after UID list";
+		} else if (array_count(&entry->uid_list) == 0)
+			error = "UID list missing";
+	}
+
+	if (error != NULL) {
 		mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
-					  "%s: Corrupted entry", uidlist->path);
+			"%s: Corrupted entry: %s", uidlist->path, error);
 		t_pop();
 		return FALSE;
 	}
@@ -285,7 +298,8 @@
 
 	if (*line != ' ') {
 		mail_storage_set_critical(STORAGE(uidlist->mbox->storage),
-					  "%s: Corrupted entry", uidlist->path);
+			"%s: Corrupted entry: Expecting space after timestamp",
+			uidlist->path);
 
 		t_pop();
 		return FALSE;
@@ -860,7 +874,7 @@
 static int
 dbox_file_append(struct dbox_uidlist_append_ctx *ctx,
 		 const char *path, struct dbox_uidlist_entry *entry,
-		 struct stat *st, struct dbox_file **file_r)
+		 struct stat *st, struct dbox_file **file_r, bool existing)
 {
 	struct dbox_mailbox *mbox = ctx->uidlist->mbox;
 	struct dbox_file *file;
@@ -868,8 +882,14 @@
 
 	*file_r = NULL;
 
-	fd = open(path, O_CREAT | O_RDWR, 0600);
+	fd = open(path, O_RDWR | (existing ? 0 : O_CREAT), 0600);
 	if (fd == -1) {
+		if (errno == ENOENT && existing) {
+			/* the file was unlinked just now, update its size
+			   so that we don't get back here. */
+			entry->file_size = (uoff_t)-1;
+			return 0;
+		}
 		mail_storage_set_critical(STORAGE(mbox->storage),
 					  "open(%s) failed: %m", path);
 		return -1;
@@ -919,7 +939,7 @@
 static int
 dbox_file_append_lock(struct dbox_uidlist_append_ctx *ctx, string_t *path,
 		      uint32_t *file_seq_r, struct dbox_uidlist_entry **entry_r,
-		      struct dotlock **dotlock_r)
+		      struct dotlock **dotlock_r, bool *existing_r)
 {
 	struct dbox_mailbox *mbox = ctx->uidlist->mbox;
 	struct dbox_uidlist_entry *const *entries;
@@ -930,11 +950,13 @@
 	entries = array_get(&ctx->uidlist->entries, &count);
 	for (i = 0;; i++) {
 		file_seq = 0;
+		*existing_r = FALSE;
 		for (; i < count; i++) {
 			if (DBOX_CAN_APPEND(ctx, entries[i]->create_time,
 					    entries[i]->file_size) &&
 			    !dbox_uidlist_files_lookup(ctx,
 						       entries[i]->file_seq)) {
+				*existing_r = TRUE;
 				file_seq = entries[i]->file_seq;
 				break;
 			}
@@ -983,6 +1005,7 @@
 	unsigned int i, count;
 	struct stat st;
 	uint32_t file_seq;
+	bool existing;
 	int ret;
 
 	/* check first from already opened files */
@@ -1006,10 +1029,10 @@
 		if (dotlock != NULL)
 			file_dotlock_delete(&dotlock);
 		if (dbox_file_append_lock(ctx, path, &file_seq,
-					  &entry, &dotlock) < 0)
+					  &entry, &dotlock, &existing) < 0)
 			return -1;
 	} while ((ret = dbox_file_append(ctx, str_c(path), entry,
-					 &st, &file)) == 0);
+					 &st, &file, existing)) == 0);
 
 	if (ret < 0) {
 		file_dotlock_delete(&dotlock);



More information about the dovecot-cvs mailing list