SqliteRevMap: wait indefinitely for database lock

Python sqlite has 5 seconds timeout by default, which means if a writer holds
the lock, and the second writer will error out after 5 seconds.

In our use-case, it makes sense to just wait. However, sqlite does not support
waiting forever (see sqlite3_busy_timeout). Therefore use a while loop to
workaround.
This commit is contained in:
Jun Wu 2016-07-19 20:34:11 +01:00
parent 5851f26e18
commit 345ef20c2f

View File

@ -662,7 +662,14 @@ class SqliteRevMap(collections.MutableMapping):
if self._db is None:
self._opendb()
with self._db as db:
db.execute('BEGIN %s' % mode)
# wait indefinitely for database lock
while True:
try:
db.execute('BEGIN %s' % mode)
break
except sqlite3.OperationalError as ex:
if str(ex) != 'database is locked':
raise
yield db
def _query(self, sql, params=()):