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.
This commit is contained in:
Austin Clements 2011-01-29 11:25:56 -05:00 committed by David Bremner
parent 8305f0aac7
commit bff30540d8
2 changed files with 16 additions and 1 deletions

View file

@ -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;
}

View file

@ -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"