diff options
author | Mark Haines <mark.haines@matrix.org> | 2016-06-20 17:53:38 +0100 |
---|---|---|
committer | Mark Haines <mark.haines@matrix.org> | 2016-06-20 17:53:38 +0100 |
commit | d5fb561709cf2181cd5b8fffd2cf70a3fb52e5ab (patch) | |
tree | a4b7a78c9c6b8ce7e1079fd8e681a6e0aab9e908 /synapse/storage/engines | |
parent | Merge pull request #878 from matrix-org/erikj/ujson (diff) | |
download | synapse-d5fb561709cf2181cd5b8fffd2cf70a3fb52e5ab.tar.xz |
Optionally make committing to postgres asynchronous.
Useful when running tests when you don't care whether the server will lose data that it claims that it has committed.
Diffstat (limited to 'synapse/storage/engines')
-rw-r--r-- | synapse/storage/engines/__init__.py | 2 | ||||
-rw-r--r-- | synapse/storage/engines/postgres.py | 13 | ||||
-rw-r--r-- | synapse/storage/engines/sqlite3.py | 2 |
3 files changed, 14 insertions, 3 deletions
diff --git a/synapse/storage/engines/__init__.py b/synapse/storage/engines/__init__.py index 7bb5de1fe7..338b495611 100644 --- a/synapse/storage/engines/__init__.py +++ b/synapse/storage/engines/__init__.py @@ -32,7 +32,7 @@ def create_engine(database_config): if engine_class: module = importlib.import_module(name) - return engine_class(module) + return engine_class(module, database_config) raise RuntimeError( "Unsupported database engine '%s'" % (name,) diff --git a/synapse/storage/engines/postgres.py b/synapse/storage/engines/postgres.py index c2290943b4..a6ae79dfad 100644 --- a/synapse/storage/engines/postgres.py +++ b/synapse/storage/engines/postgres.py @@ -19,9 +19,10 @@ from ._base import IncorrectDatabaseSetup class PostgresEngine(object): single_threaded = False - def __init__(self, database_module): + def __init__(self, database_module, database_config): self.module = database_module self.module.extensions.register_type(self.module.extensions.UNICODE) + self.synchronous_commit = database_config.get("synchronous_commit", True) def check_database(self, txn): txn.execute("SHOW SERVER_ENCODING") @@ -40,9 +41,19 @@ class PostgresEngine(object): db_conn.set_isolation_level( self.module.extensions.ISOLATION_LEVEL_REPEATABLE_READ ) + # Asynchronous commit, don't wait for the server to call fsync before + # ending the transaction. + # https://www.postgresql.org/docs/current/static/wal-async-commit.html + if not self.synchronous_commit: + cursor = db_conn.cursor() + cursor.execute("SET synchronous_commit TO OFF") + cursor.close() def is_deadlock(self, error): if isinstance(error, self.module.DatabaseError): + # https://www.postgresql.org/docs/current/static/errcodes-appendix.html + # "40001" serialization_failure + # "40P01" deadlock_detected return error.pgcode in ["40001", "40P01"] return False diff --git a/synapse/storage/engines/sqlite3.py b/synapse/storage/engines/sqlite3.py index 14203aa500..755c9a1f07 100644 --- a/synapse/storage/engines/sqlite3.py +++ b/synapse/storage/engines/sqlite3.py @@ -21,7 +21,7 @@ import struct class Sqlite3Engine(object): single_threaded = True - def __init__(self, database_module): + def __init__(self, database_module, database_config): self.module = database_module def check_database(self, txn): |