From 648796ef1de4335f26b464ef24f14fd8dd550e31 Mon Sep 17 00:00:00 2001 From: "Paul \"LeoNerd\" Evans" Date: Wed, 20 Aug 2014 16:40:51 +0100 Subject: Neater database setup at application startup time; only .connect() it once, not once per schema file; don't build the db_pool twice --- synapse/app/homeserver.py | 36 +++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index f210d26629..d63afd1b4a 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -43,6 +43,17 @@ import re logger = logging.getLogger(__name__) +SCHEMAS = [ + "transactions", + "pdu", + "users", + "profiles", + "presence", + "im", + "room_aliases", +] + + class SynapseHomeServer(HomeServer): def build_http_client(self): @@ -65,24 +76,11 @@ class SynapseHomeServer(HomeServer): don't have to worry about overwriting existing content. """ logging.info("Preparing database: %s...", self.db_name) - pool = adbapi.ConnectionPool( - 'sqlite3', self.db_name, check_same_thread=False, - cp_min=1, cp_max=1) - schemas = [ - "transactions", - "pdu", - "users", - "profiles", - "presence", - "im", - "room_aliases", - ] + with sqlite3.connect(self.db_name) as db_conn: + for sql_loc in SCHEMAS: + sql_script = read_schema(sql_loc) - for sql_loc in schemas: - sql_script = read_schema(sql_loc) - - with sqlite3.connect(self.db_name) as db_conn: c = db_conn.cursor() c.executescript(sql_script) c.close() @@ -90,6 +88,10 @@ class SynapseHomeServer(HomeServer): logging.info("Database prepared in %s.", self.db_name) + pool = adbapi.ConnectionPool( + 'sqlite3', self.db_name, check_same_thread=False, + cp_min=1, cp_max=1) + return pool def create_resource_tree(self, web_client, redirect_root_to_web_client): @@ -282,7 +284,7 @@ def setup(): redirect_root_to_web_client=True) hs.start_listening(args.port) - hs.build_db_pool() + hs.get_db_pool() if args.manhole: f = twisted.manhole.telnet.ShellFactory() -- cgit 1.4.1 From e677a3114e0395a328b4d5f775f60532bad4e7eb Mon Sep 17 00:00:00 2001 From: "Paul \"LeoNerd\" Evans" Date: Wed, 20 Aug 2014 16:49:54 +0100 Subject: Use SQLite's PRAGMA user_version to check if the database file really matches the schema we have in mind --- synapse/app/homeserver.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index d63afd1b4a..d0a4880da3 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -54,6 +54,11 @@ SCHEMAS = [ ] +# Remember to update this number every time an incompatible change is made to +# database schema files, so the users will be informed on server restarts. +SCHEMA_VERSION = 1 + + class SynapseHomeServer(HomeServer): def build_http_client(self): @@ -78,13 +83,30 @@ class SynapseHomeServer(HomeServer): logging.info("Preparing database: %s...", self.db_name) with sqlite3.connect(self.db_name) as db_conn: - for sql_loc in SCHEMAS: - sql_script = read_schema(sql_loc) + c = db_conn.cursor() + c.execute("PRAGMA user_version") + row = c.fetchone() + + if row and row[0]: + user_version = row[0] + + if user_version < SCHEMA_VERSION: + # TODO(paul): add some kind of intelligent fixup here + raise ValueError("Cannot use this database as the " + + "schema version (%d) does not match (%d)" % + (user_version, SCHEMA_VERSION) + ) + + else: + for sql_loc in SCHEMAS: + sql_script = read_schema(sql_loc) + + c.executescript(sql_script) + db_conn.commit() + + c.execute("PRAGMA user_version = %d" % SCHEMA_VERSION) - c = db_conn.cursor() - c.executescript(sql_script) - c.close() - db_conn.commit() + c.close() logging.info("Database prepared in %s.", self.db_name) -- cgit 1.4.1 From 05fa81fee43c02aa370b576c5cdfb7940f8c2e99 Mon Sep 17 00:00:00 2001 From: "Paul \"LeoNerd\" Evans" Date: Wed, 27 Aug 2014 13:07:25 +0100 Subject: A reliable logger.info() message /after/ the TCP port has been opened and is listening; this is essential for avoiding races in wrapper scripts e.g. integration testing --- synapse/app/homeserver.py | 1 + 1 file changed, 1 insertion(+) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index d0a4880da3..a89770ed7b 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -208,6 +208,7 @@ class SynapseHomeServer(HomeServer): def start_listening(self, port): reactor.listenTCP(port, Site(self.root_resource)) + logger.info("Synapse now listening on port %d", port) def setup_logging(verbosity=0, filename=None, config_path=None): -- cgit 1.4.1