From: Austin Clements Date: Sat, 29 Jan 2011 16:25:56 +0000 (-0500) Subject: new: Wrap adding and removing messages in atomic sections. X-Git-Tag: 0.9_rc1~11 X-Git-Url: http://git.tremily.us/?a=commitdiff_plain;h=bff30540d86c77aacbc2c133c83aa7ccee823b48;p=notmuch.git new: Wrap adding and removing messages in atomic sections. This addresses atomicity of tag synchronization, the last atomicity problems in notmuch new. Each message add or remove is wrapped in its own atomic section, so interrupting notmuch new doesn't lose progress. --- diff --git a/notmuch-new.c b/notmuch-new.c index 598a2083..e79593cd 100644 --- a/notmuch-new.c +++ b/notmuch-new.c @@ -450,6 +450,12 @@ add_files_recursive (notmuch_database_t *notmuch, fflush (stdout); } + status = notmuch_database_begin_atomic (notmuch); + if (status) { + ret = status; + goto DONE; + } + status = notmuch_database_add_message (notmuch, next, &message); switch (status) { /* success */ @@ -490,6 +496,12 @@ add_files_recursive (notmuch_database_t *notmuch, goto DONE; } + status = notmuch_database_end_atomic (notmuch); + if (status) { + ret = status; + goto DONE; + } + if (message) { notmuch_message_destroy (message); message = NULL; @@ -728,6 +740,9 @@ remove_filename (notmuch_database_t *notmuch, { notmuch_status_t status; notmuch_message_t *message; + status = notmuch_database_begin_atomic (notmuch); + if (status) + return status; message = notmuch_database_find_message_by_filename (notmuch, path); status = notmuch_database_remove_message (notmuch, path); if (status == NOTMUCH_STATUS_DUPLICATE_MESSAGE_ID) { @@ -737,6 +752,7 @@ remove_filename (notmuch_database_t *notmuch, } else add_files_state->removed_messages++; notmuch_message_destroy (message); + notmuch_database_end_atomic (notmuch); return status; } diff --git a/test/atomicity b/test/atomicity index 88b39587..eeff6be9 100755 --- a/test/atomicity +++ b/test/atomicity @@ -94,7 +94,6 @@ for ((i = 0; i < $outcount; i++)); do done test_begin_subtest '"notmuch new" is idempotent under arbitrary aborts' -test_subtest_known_broken test_expect_equal_file GDB searchall expectall test_expect_success GDB "detected $outcount>10 abort points" "test $outcount -gt 10"