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=()):