mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-29 06:04:11 +01:00
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.
This commit is contained in:
parent
19a89753ca
commit
cb6cc296e2
1 changed files with 27 additions and 17 deletions
|
@ -873,6 +873,7 @@ notmuch_database_compact (const char *path,
|
||||||
notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
|
notmuch_status_t ret = NOTMUCH_STATUS_SUCCESS;
|
||||||
notmuch_database_t *notmuch = NULL;
|
notmuch_database_t *notmuch = NULL;
|
||||||
struct stat statbuf;
|
struct stat statbuf;
|
||||||
|
notmuch_bool_t keep_backup;
|
||||||
|
|
||||||
local = talloc_new (NULL);
|
local = talloc_new (NULL);
|
||||||
if (! local)
|
if (! local)
|
||||||
|
@ -898,18 +899,28 @@ notmuch_database_compact (const char *path,
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (backup_path != NULL) {
|
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) {
|
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;
|
ret = NOTMUCH_STATUS_FILE_ERROR;
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
if (errno != ENOENT) {
|
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));
|
strerror (errno));
|
||||||
|
ret = NOTMUCH_STATUS_FILE_ERROR;
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
NotmuchCompactor compactor (status_cb, closure);
|
NotmuchCompactor compactor (status_cb, closure);
|
||||||
|
@ -924,15 +935,11 @@ notmuch_database_compact (const char *path,
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (backup_path) {
|
|
||||||
if (rename (xapian_path, backup_path)) {
|
if (rename (xapian_path, backup_path)) {
|
||||||
fprintf (stderr, "Error moving old database out of the way\n");
|
fprintf (stderr, "Error moving old database out of the way\n");
|
||||||
ret = NOTMUCH_STATUS_FILE_ERROR;
|
ret = NOTMUCH_STATUS_FILE_ERROR;
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
rmtree (xapian_path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rename (compact_xapian_path, xapian_path)) {
|
if (rename (compact_xapian_path, xapian_path)) {
|
||||||
fprintf (stderr, "Error moving compacted database\n");
|
fprintf (stderr, "Error moving compacted database\n");
|
||||||
|
@ -940,6 +947,9 @@ notmuch_database_compact (const char *path,
|
||||||
goto DONE;
|
goto DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (! keep_backup)
|
||||||
|
rmtree (backup_path);
|
||||||
|
|
||||||
DONE:
|
DONE:
|
||||||
if (notmuch)
|
if (notmuch)
|
||||||
notmuch_database_destroy (notmuch);
|
notmuch_database_destroy (notmuch);
|
||||||
|
|
Loading…
Reference in a new issue