changeset 1546:9c9ce9c71509 HEAD

Close index files before deleting the mailbox.
author Timo Sirainen <tss@iki.fi>
date Sat, 14 Jun 2003 20:38:06 +0300
parents 9ce3f3f950c5
children 54764a1cde30
files src/lib-storage/index/index-storage.c src/lib-storage/index/index-storage.h src/lib-storage/index/maildir/maildir-storage.c src/lib-storage/index/mbox/mbox-storage.c
diffstat 4 files changed, 41 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/index-storage.c	Sat Jun 14 20:22:02 2003 +0300
+++ b/src/lib-storage/index/index-storage.c	Sat Jun 14 20:38:06 2003 +0300
@@ -99,6 +99,23 @@
 	i_unreached();
 }
 
+void index_storage_destroy_unrefed(void)
+{
+	struct index_list **list, *rec;
+
+	for (list = &indexes; *list != NULL;) {
+		rec = *list;
+
+		if (rec->refcount == 0) {
+			rec->index->free(rec->index);
+			*list = rec->next;
+			i_free(rec);
+		} else {
+			list = &(*list)->next;
+		}
+	}
+}
+
 static enum mail_data_field get_data_fields(const char *fields)
 {
 	static const char *field_names[] = {
--- a/src/lib-storage/index/index-storage.h	Sat Jun 14 20:22:02 2003 +0300
+++ b/src/lib-storage/index/index-storage.h	Sat Jun 14 20:38:06 2003 +0300
@@ -44,6 +44,7 @@
 void index_storage_add(struct mail_index *index);
 struct mail_index *index_storage_lookup_ref(const char *path);
 void index_storage_unref(struct mail_index *index);
+void index_storage_destroy_unrefed(void);
 
 struct index_mailbox *
 index_storage_init(struct mail_storage *storage, struct mailbox *box,
--- a/src/lib-storage/index/maildir/maildir-storage.c	Sat Jun 14 20:22:02 2003 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sat Jun 14 20:38:06 2003 +0300
@@ -431,10 +431,14 @@
 	if (storage->index_dir != NULL && *name != '/' && *name != '~' &&
 	    strcmp(storage->index_dir, storage->dir) != 0) {
 		index_dir = t_strconcat(storage->index_dir, "/.", name, NULL);
-		if (unlink_directory(index_dir, TRUE) < 0) {
+		index_storage_destroy_unrefed();
+
+		/* it can fail with some NFS implementations if indexes are
+		   opened by another session.. can't really help it. */
+		if (unlink_directory(index_dir, TRUE) < 0 &&
+		    errno != ENOTEMPTY) {
 			mail_storage_set_critical(storage,
-						  "unlink_directory(%s) "
-						  "failed: %m", index_dir);
+				"unlink_directory(%s) failed: %m", index_dir);
 			return FALSE;
 		}
 	}
@@ -443,24 +447,22 @@
 	while (rename(src, dest) < 0 && count < 2) {
 		if (errno != EEXIST && errno != ENOTEMPTY) {
 			mail_storage_set_critical(storage,
-						  "rename(%s, %s) failed: %m",
-						  src, dest);
+				"rename(%s, %s) failed: %m", src, dest);
 			return FALSE;
 		}
 
 		/* ..dir already existed? delete it and try again */
 		if (unlink_directory(dest, TRUE) < 0) {
 			mail_storage_set_critical(storage,
-						  "unlink_directory(%s) "
-						  "failed: %m", dest);
+				"unlink_directory(%s) failed: %m", dest);
 			return FALSE;
 		}
 		count++;
 	}
 
-	if (unlink_directory(dest, TRUE) < 0) {
-		mail_storage_set_critical(storage, "unlink_directory(%s) "
-					  "failed: %m", dest);
+	if (unlink_directory(dest, TRUE) < 0 && errno != ENOTEMPTY) {
+		mail_storage_set_critical(storage,
+			"unlink_directory(%s) failed: %m", dest);
 
 		/* it's already renamed to ..dir, which means it's deleted
 		   as far as client is concerned. Report success. */
--- a/src/lib-storage/index/mbox/mbox-storage.c	Sat Jun 14 20:22:02 2003 +0300
+++ b/src/lib-storage/index/mbox/mbox-storage.c	Sat Jun 14 20:38:06 2003 +0300
@@ -529,12 +529,18 @@
 
 	/* next delete the index directory */
 	index_dir = mbox_get_index_dir(storage, name);
-	if (index_dir != NULL &&
-	    unlink_directory(index_dir, TRUE) < 0 && errno != ENOENT) {
-		mail_storage_set_critical(storage,
-			"unlink_directory(%s) failed: %m", index_dir);
-		/* mailbox itself is deleted, so return success anyway */
+	if (index_dir != NULL) {
+		index_storage_destroy_unrefed();
+
+		if (unlink_directory(index_dir, TRUE) < 0 && errno != ENOENT) {
+			mail_storage_set_critical(storage,
+				"unlink_directory(%s) failed: %m", index_dir);
+
+			/* mailbox itself is deleted, so return success
+			   anyway */
+		}
 	}
+
 	return TRUE;
 }