summary refs log tree commit diff
diff options
context:
space:
mode:
authorRichard van der Hoff <richard@matrix.org>2020-01-09 17:46:52 +0000
committerRichard van der Hoff <richard@matrix.org>2020-01-09 18:11:04 +0000
commitbf468211805900e767b6b07a2bfa6046f70efb7a (patch)
treed6dacf0d5eeb1218889f5bb8919869a25131fab0
parentCheck postgres version in check_database (diff)
downloadsynapse-bf468211805900e767b6b07a2bfa6046f70efb7a.tar.xz
Refuse to start if sqlite is older than 3.11.0
-rwxr-xr-xscripts/synapse_port_db16
-rw-r--r--synapse/storage/engines/postgres.py4
-rw-r--r--synapse/storage/engines/sqlite.py7
3 files changed, 19 insertions, 8 deletions
diff --git a/scripts/synapse_port_db b/scripts/synapse_port_db
index a3dafaffc9..f135c8bc54 100755
--- a/scripts/synapse_port_db
+++ b/scripts/synapse_port_db
@@ -447,11 +447,15 @@ class Porter(object):
             else:
                 return
 
-    def build_db_store(self, db_config: DatabaseConnectionConfig):
+    def build_db_store(
+        self, db_config: DatabaseConnectionConfig, allow_outdated_version: bool = False,
+    ):
         """Builds and returns a database store using the provided configuration.
 
         Args:
-            config: The database configuration
+            db_config: The database configuration
+            allow_outdated_version: True to suppress errors about the database server
+                version being too old to run a complete synapse
 
         Returns:
             The built Store object.
@@ -463,7 +467,9 @@ class Porter(object):
         hs = MockHomeserver(self.hs_config)
 
         with make_conn(db_config, engine) as db_conn:
-            engine.check_database(db_conn)
+            engine.check_database(
+                db_conn, allow_outdated_version=allow_outdated_version
+            )
             prepare_database(db_conn, engine, config=None)
             store = Store(Database(hs, db_config, engine), db_conn, hs)
             db_conn.commit()
@@ -491,8 +497,10 @@ class Porter(object):
     @defer.inlineCallbacks
     def run(self):
         try:
+            # we allow people to port away from outdated versions of sqlite.
             self.sqlite_store = self.build_db_store(
-                DatabaseConnectionConfig("master-sqlite", self.sqlite_config)
+                DatabaseConnectionConfig("master-sqlite", self.sqlite_config),
+                allow_outdated_version=True,
             )
 
             # Check if all background updates are done, abort if not.
diff --git a/synapse/storage/engines/postgres.py b/synapse/storage/engines/postgres.py
index 2a285e018c..c84cb452b0 100644
--- a/synapse/storage/engines/postgres.py
+++ b/synapse/storage/engines/postgres.py
@@ -32,7 +32,7 @@ class PostgresEngine(object):
         self.synchronous_commit = database_config.get("synchronous_commit", True)
         self._version = None  # unknown as yet
 
-    def check_database(self, db_conn):
+    def check_database(self, db_conn, allow_outdated_version: bool = False):
         # Get the version of PostgreSQL that we're using. As per the psycopg2
         # docs: The number is formed by converting the major, minor, and
         # revision numbers into two-decimal-digit numbers and appending them
@@ -40,7 +40,7 @@ class PostgresEngine(object):
         self._version = db_conn.server_version
 
         # Are we on a supported PostgreSQL version?
-        if self._version < 90500:
+        if not allow_outdated_version and self._version < 90500:
             raise RuntimeError("Synapse requires PostgreSQL 9.5+ or above.")
 
         with db_conn.cursor() as txn:
diff --git a/synapse/storage/engines/sqlite.py b/synapse/storage/engines/sqlite.py
index 3b3c13360b..cbf52f5191 100644
--- a/synapse/storage/engines/sqlite.py
+++ b/synapse/storage/engines/sqlite.py
@@ -53,8 +53,11 @@ class Sqlite3Engine(object):
         """
         return False
 
-    def check_database(self, db_conn):
-        pass
+    def check_database(self, db_conn, allow_outdated_version: bool = False):
+        if not allow_outdated_version:
+            version = self.module.sqlite_version_info
+            if version < (3, 11, 0):
+                raise RuntimeError("Synapse requires sqlite 3.11 or above.")
 
     def convert_param_style(self, sql):
         return sql