aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Tomi Ollila <tomi.ollila@iki.fi>2013-11-15 00:03:25 +0200
committerGravatar David Bremner <david@tethera.net>2013-11-19 20:13:25 -0400
commitcb6cc296e27fdab85faa4bdd670eda2e0c53b8c2 (patch)
tree3071c6690727608d16722dfa52c969a71e51494f
parent19a89753ca20b269a131e747238925cce254c627 (diff)
compact: preserve backup database until compacted database is in place
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.
-rw-r--r--lib/database.cc44
1 files changed, 27 insertions, 17 deletions
diff --git a/lib/database.cc b/lib/database.cc
index 3530cb65..d79cc300 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);