aboutsummaryrefslogtreecommitdiff
path: root/lib/database.cc
diff options
context:
space:
mode:
authorDavid Bremner <david@tethera.net>2021-05-17 23:06:01 -0300
committerDavid Bremner <david@tethera.net>2021-06-27 14:03:00 -0300
commite2a3e5fa51122efb0f5ac836e536881d97deef1a (patch)
tree1445b342be81e30408f9690698f237c3dd06a1fd /lib/database.cc
parent8aabddb043d6bf5bd8a19884b3c456ba9d4634cb (diff)
lib: autocommit after some number of completed transactions
This change addresses two known issues with large sets of changes to the database. The first is that as reported by Steven Allen [1], notmuch commits are not "flushed" when they complete, which means that if there is an open transaction when the database closes (or e.g. the program crashes) then all changes since the last commit will be discarded (nothing is irrecoverably lost for "notmuch new", as the indexing process just restarts next time it is run). This does not really "fix" the issue reported in [1]; that seems rather difficult given how transactions work in Xapian. On the other hand, with the default settings, this should mean one only loses less than a minutes worth of work. The second issue is the occasionally reported "storm" of disk writes when notmuch finishes. I don't yet have a test for this, but I think committing as we go should reduce the amount of work when finalizing the database. [1]: id:20151025210215.GA3754@stebalien.com
Diffstat (limited to 'lib/database.cc')
-rw-r--r--lib/database.cc16
1 files changed, 12 insertions, 4 deletions
diff --git a/lib/database.cc b/lib/database.cc
index aed05388..31794900 100644
--- a/lib/database.cc
+++ b/lib/database.cc
@@ -1134,13 +1134,21 @@ notmuch_database_end_atomic (notmuch_database_t *notmuch)
db = notmuch->writable_xapian_db;
try {
db->commit_transaction ();
+ notmuch->transaction_count++;
- /* This is a hack for testing. Xapian never flushes on a
- * non-flushed commit, even if the flush threshold is 1.
- * However, we rely on flushing to test atomicity. */
+ /* Xapian never flushes on a non-flushed commit, even if the
+ * flush threshold is 1. However, we rely on flushing to test
+ * atomicity. On the other hand, we can't straight replace
+ * XAPIAN_FLUSH_THRESHOLD with our autocommit counter, because
+ * the former also applies outside notmuch atomic
+ * commits. Hence the follow complicated test */
const char *thresh = getenv ("XAPIAN_FLUSH_THRESHOLD");
- if (thresh && atoi (thresh) == 1)
+ if ((notmuch->transaction_threshold > 0 &&
+ notmuch->transaction_count >= notmuch->transaction_threshold) ||
+ (thresh && atoi (thresh) == 1)) {
db->commit ();
+ notmuch->transaction_count = 0;
+ }
} catch (const Xapian::Error &error) {
_notmuch_database_log (notmuch, "A Xapian exception occurred committing transaction: %s.\n",
error.get_msg ().c_str ());