sqlcache: also catch malformed database error stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Mon, 27 Aug 2018 12:40:47 +0200
branchstable
changeset 4027 130a60a51fff
parent 4026 b375398074b0
child 4028 e8ce05aa9138
sqlcache: also catch malformed database error This is apparently another way for sqlite to fail at concurrency.
hgext3rd/evolve/obsdiscovery.py
hgext3rd/evolve/stablerangecache.py
--- a/hgext3rd/evolve/obsdiscovery.py	Mon Aug 27 12:40:41 2018 +0200
+++ b/hgext3rd/evolve/obsdiscovery.py	Mon Aug 27 12:40:47 2018 +0200
@@ -437,7 +437,7 @@
                 if obshash is not None:
                     value = obshash[0]
                 self._data[rangeid] = value
-            except sqlite3.OperationalError:
+            except (sqlite3.DatabaseError, sqlite3.OperationalError):
                 # something is wrong with the sqlite db
                 # Since this is a cache, we ignore it.
                 if '_con' in vars(self):
@@ -489,7 +489,7 @@
                             con.executemany(_delete, ranges)
                             for r in ranges:
                                 self._data.pop(r, None)
-                    except sqlite3.OperationalError as exc:
+                    except (sqlite3.DatabaseError, sqlite3.OperationalError) as exc:
                         repo.ui.log('evoext-cache', 'error while updating obshashrange cache: %s' % exc)
                         del self._updating
                         return
@@ -584,7 +584,7 @@
             return
         try:
             return self._trysave(repo)
-        except (sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
+        except (sqlite3.DatabaseError, sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
             # Catch error that may arise under stress
             #
             # operational error catch read-only and locked database
--- a/hgext3rd/evolve/stablerangecache.py	Mon Aug 27 12:40:41 2018 +0200
+++ b/hgext3rd/evolve/stablerangecache.py	Mon Aug 27 12:40:47 2018 +0200
@@ -184,7 +184,7 @@
                     value = self._con.execute(_querysubranges, rangeid).fetchall()
                 # in memory caching of the value
                 cache[rangeid] = value
-            except sqlite3.OperationalError:
+            except (sqlite3.DatabaseError, sqlite3.OperationalError):
                 # something is wrong with the sqlite db
                 # Since this is a cache, we ignore it.
                 if '_con' in vars(self):
@@ -236,7 +236,7 @@
             return
         try:
             return self._trysave(repo)
-        except (sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
+        except (sqlite3.DatabaseError, sqlite3.OperationalError, sqlite3.IntegrityError) as exc:
             # Catch error that may arise under stress
             #
             # operational error catch read-only and locked database