Subject: bug#30644: Cuirass runs out of build users

From: Danny Milosavljevic <[email-masked]>
Date: Sat, 24 Mar 2018 14:15:47 +0100

Hi Ludo,

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.

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.