Hallo! Stepping away from the current code base -- what is notmuch's original idea of concurrency? That is, all of us probably know that one: A Xapian exception occurred opening database: Unable to get write lock on /home/thomas/Mail-schwinge.name-thomas/.notmuch/xapian: already locked I recently saw that one while using the Emacs UI (that one tried to remove a unread tag or similar), and in parallel a delivery to the notmuch DB was going on. Apparently the DB we're using doesn't allow for simultaneous writing (even though it can't even possibly have been dangerous in this case). Which is the original idea here? Is it that... * each and every client should catch these kinds of errors, and retry, or eventually give up at some point, and report the status to the user; or is it that... * notmuch internally should catch these concurrency cases, and retry, or eventually give up at some point (``notmuch --maximum-wait=30s tag [...]''), and fail as seen above? This one is an obvious temporary error due to a concurrency situation. Wouldn't the latter suggestion be preferable here? I guess that in most cases the DB isn't locked for long periods of time, and thus the concurrency situation would decline quickly. One difficulty I see is judging which errors are temporary and which are permanent -- which is obvious in a lot of cases (concurrent DB access, memory starved or any other OS resource), but may not be, for example in case of I/O errors (is ``disk full'' a permanent error?). And then, for some of these cases, waiting does make sense (concurrent DB access, as suggested above), and for other (temporary?) errors it doesn't make (a lot of) sense (out of memory: only sensible thing is to abort, and have the caller re-try, or disk full: waiting for some free space may be worth it, or it may be not). Grüße, Thomas