Mercurial > hgsubversion
changeset 1490:bc73b80baf98
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.
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 19 Jul 2016 20:34:11 +0100 |
parents | 9a6bb3657861 |
children | 8937f19586fe |
files | hgsubversion/maps.py |
diffstat | 1 files changed, 8 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/hgsubversion/maps.py +++ b/hgsubversion/maps.py @@ -662,7 +662,14 @@ class SqliteRevMap(collections.MutableMa 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=()):