Hi Danny, Danny Milosavljevic <dan...@scratchpost.org> skribis:
> I've checked it some more. The shared cache uses unlock_notify, and the > actual > database uses sqlite3_busy_handler (sqlite3_busy_timeout) when BUSY is > returned. > > The 5 in > > ice-9/eval.scm:619:8: Throw to key `sqlite-error' with args `(#f 5 "database > is locked")'. > ^^ > > means SQLITE_BUSY, so that's the actual database. > > So the easiest way to work around it would be to call > > sqlite3_busy_timeout(db, 10); // ms > > which would automatically repeatedly retry on busy until 10 ms have > accumulated, > and only then give up. Indeed, that’s actually what nix/libstore does. > There's also sqlite3_busy_handler which can be used to install a busy handler, > and of course in the future we could also handle SQLITE_BUSY ourselves and > yield. > > See also https://notabug.org/civodul/guile-sqlite3/pulls/4 for the former. Awesome. I’ve merged these guile-sqlite3 bits and added a “PRAGMA busy_timeout” in Cuirass (the pragma allows us to set the timeout even when using an older guile-sqlite3.) I’ve updated the ‘cuirass’ package and will test soonish on berlin. Thank you! Ludo’.