unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
* [PATCH v3 3/5] compact: preserve backup database until compacted database is in place
       [not found] <id:1384362167-12740-1-git-send-email-tomi.ollila@iki.fi>
@ 2013-11-14 22:03 ` Tomi Ollila
  2013-11-14 22:03   ` [PATCH v3 4/5] compact: unconditionally remove old wip database compact directory Tomi Ollila
                     ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Tomi Ollila @ 2013-11-14 22:03 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

It is less error prone and window of failure opportunity is smaller
if the old (backup) database is always renamed (instead of sometimes
rmtree'd) before new (compacted) database is put into its place.
Finally rmtree() old database in case old database backup is not kept.
---

The patches 3-5 in this series are updated based on Jani's comments.

I've kept the fprintf(stderr,...)'s due to reasons explained in

id:m28uwquccd.fsf@guru.guru-group.fi

Diff v2-v3 for first (3/5) patch. Second (4/5) has just // -> /* .. */ change.

|--- a/lib/database.cc
|+++ b/lib/database.cc
|@@ -906,17 +906,19 @@ notmuch_database_compact (const char *path,
|        }
|        keep_backup = FALSE;
|     }
|-    else
|+    else {
|        keep_backup = TRUE;
|+    }
|
|     if (stat (backup_path, &statbuf) != -1) {
|-       fprintf (stderr, "Backup path already exists: %s\n", backup_path);
|+       fprintf (stderr, "Path already exists: %s\n", backup_path);
|        ret = NOTMUCH_STATUS_FILE_ERROR;
|        goto DONE;
|     }
|     if (errno != ENOENT) {
|-       fprintf (stderr, "Unknown error while stat()ing backup path: %s\n",
|+       fprintf (stderr, "Unknown error while stat()ing path: %s\n",
|                 strerror (errno));
|+       ret = NOTMUCH_STATUS_FILE_ERROR;
|        goto DONE;
|     }




 lib/database.cc | 44 +++++++++++++++++++++++++++-----------------
 1 file changed, 27 insertions(+), 17 deletions(-)

diff --git a/lib/database.cc b/lib/database.cc
index 3530cb6..d79cc30 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -873,6 +873,7 @@ notmuch_database_compact (const char *path,
     notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
     notmuch_database_t *notmuch = NULL;
     struct stat statbuf;
+    notmuch_bool_t keep_backup;
 
     local = talloc_new (NULL);
     if (! local)
@@ -898,17 +899,27 @@ notmuch_database_compact (const char *path,
 	goto DONE;
     }
 
-    if (backup_path != NULL) {
-	if (stat (backup_path, &statbuf) != -1) {
-	    fprintf (stderr, "Backup path already exists: %s\n", backup_path);
-	    ret = NOTMUCH_STATUS_FILE_ERROR;
-	    goto DONE;
-	}
-	if (errno != ENOENT) {
-	    fprintf (stderr, "Unknown error while stat()ing backup path: %s\n",
-		     strerror (errno));
+    if (backup_path == NULL) {
+	if (! (backup_path = talloc_asprintf (local, "%s.old", xapian_path))) {
+	    ret = NOTMUCH_STATUS_OUT_OF_MEMORY;
 	    goto DONE;
 	}
+	keep_backup = FALSE;
+    }
+    else {
+	keep_backup = TRUE;
+    }
+
+    if (stat (backup_path, &statbuf) != -1) {
+	fprintf (stderr, "Path already exists: %s\n", backup_path);
+	ret = NOTMUCH_STATUS_FILE_ERROR;
+	goto DONE;
+    }
+    if (errno != ENOENT) {
+	fprintf (stderr, "Unknown error while stat()ing path: %s\n",
+		 strerror (errno));
+	ret = NOTMUCH_STATUS_FILE_ERROR;
+	goto DONE;
     }
 
     try {
@@ -924,14 +935,10 @@ notmuch_database_compact (const char *path,
 	goto DONE;
     }
 
-    if (backup_path) {
-	if (rename (xapian_path, backup_path)) {
-	    fprintf (stderr, "Error moving old database out of the way\n");
-	    ret = NOTMUCH_STATUS_FILE_ERROR;
-	    goto DONE;
-	}
-    } else {
-	rmtree (xapian_path);
+    if (rename (xapian_path, backup_path)) {
+	fprintf (stderr, "Error moving old database out of the way\n");
+	ret = NOTMUCH_STATUS_FILE_ERROR;
+	goto DONE;
     }
 
     if (rename (compact_xapian_path, xapian_path)) {
@@ -940,6 +947,9 @@ notmuch_database_compact (const char *path,
 	goto DONE;
     }
 
+    if (! keep_backup)
+	rmtree (backup_path);
+
   DONE:
     if (notmuch)
 	notmuch_database_destroy (notmuch);
-- 
1.8.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH v3 4/5] compact: unconditionally remove old wip database compact directory
  2013-11-14 22:03 ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place Tomi Ollila
@ 2013-11-14 22:03   ` Tomi Ollila
  2013-11-14 22:03   ` [PATCH 5/5] compact: improve error messages on failures after compaction Tomi Ollila
  2013-11-20  0:59   ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place David Bremner
  2 siblings, 0 replies; 4+ messages in thread
From: Tomi Ollila @ 2013-11-14 22:03 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

In case previous notmuch compact has been interrupted there is old
work-in-progress database compact directory partially filled. Remove
it just before starting to fill the directory with new files.
---
 lib/database.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/lib/database.cc b/lib/database.cc
index d79cc30..d09ad99 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -922,6 +922,12 @@ notmuch_database_compact (const char *path,
 	goto DONE;
     }
 
+    /* Unconditionally attempt to remove old work-in-progress database (if
+     * any). This is "protected" by database lock. If this fails due to write
+     * errors (etc), the following code will fail and provide error message.
+     */
+    (void) rmtree (compact_xapian_path);
+
     try {
 	NotmuchCompactor compactor (status_cb, closure);
 
-- 
1.8.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 5/5] compact: improve error messages on failures after compaction
  2013-11-14 22:03 ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place Tomi Ollila
  2013-11-14 22:03   ` [PATCH v3 4/5] compact: unconditionally remove old wip database compact directory Tomi Ollila
@ 2013-11-14 22:03   ` Tomi Ollila
  2013-11-20  0:59   ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place David Bremner
  2 siblings, 0 replies; 4+ messages in thread
From: Tomi Ollila @ 2013-11-14 22:03 UTC (permalink / raw)
  To: notmuch; +Cc: tomi.ollila

The error messages written during the steps replacing old
database with new now includes relevant paths and strerror.
---
 lib/database.cc | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/lib/database.cc b/lib/database.cc
index d09ad99..f395061 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -942,19 +942,27 @@ notmuch_database_compact (const char *path,
     }
 
     if (rename (xapian_path, backup_path)) {
-	fprintf (stderr, "Error moving old database out of the way\n");
+	fprintf (stderr, "Error moving %s to %s: %s\n",
+		 xapian_path, backup_path, strerror (errno));
 	ret = NOTMUCH_STATUS_FILE_ERROR;
 	goto DONE;
     }
 
     if (rename (compact_xapian_path, xapian_path)) {
-	fprintf (stderr, "Error moving compacted database\n");
+	fprintf (stderr, "Error moving %s to %s: %s\n",
+		 compact_xapian_path, xapian_path, strerror (errno));
 	ret = NOTMUCH_STATUS_FILE_ERROR;
 	goto DONE;
     }
 
-    if (! keep_backup)
-	rmtree (backup_path);
+    if (! keep_backup) {
+	if (rmtree (backup_path)) {
+	    fprintf (stderr, "Error removing old database %s: %s\n",
+		     backup_path, strerror (errno));
+	    ret = NOTMUCH_STATUS_FILE_ERROR;
+	    goto DONE;
+	}
+    }
 
   DONE:
     if (notmuch)
-- 
1.8.0

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH v3 3/5] compact: preserve backup database until compacted database is in place
  2013-11-14 22:03 ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place Tomi Ollila
  2013-11-14 22:03   ` [PATCH v3 4/5] compact: unconditionally remove old wip database compact directory Tomi Ollila
  2013-11-14 22:03   ` [PATCH 5/5] compact: improve error messages on failures after compaction Tomi Ollila
@ 2013-11-20  0:59   ` David Bremner
  2 siblings, 0 replies; 4+ messages in thread
From: David Bremner @ 2013-11-20  0:59 UTC (permalink / raw)
  To: Tomi Ollila, notmuch; +Cc: tomi.ollila

Tomi Ollila <tomi.ollila@iki.fi> writes:

> It is less error prone and window of failure opportunity is smaller
> if the old (backup) database is always renamed (instead of sometimes
> rmtree'd) before new (compacted) database is put into its place.
> Finally rmtree() old database in case old database backup is not kept.

pushed, 

d

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2013-11-20  0:59 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <id:1384362167-12740-1-git-send-email-tomi.ollila@iki.fi>
2013-11-14 22:03 ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place Tomi Ollila
2013-11-14 22:03   ` [PATCH v3 4/5] compact: unconditionally remove old wip database compact directory Tomi Ollila
2013-11-14 22:03   ` [PATCH 5/5] compact: improve error messages on failures after compaction Tomi Ollila
2013-11-20  0:59   ` [PATCH v3 3/5] compact: preserve backup database until compacted database is in place David Bremner

Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).