diff options
author | Mark Haines <mjark@negativecurvature.net> | 2016-06-29 15:21:58 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-29 15:21:58 +0100 |
commit | 6783534a0f9f34d6972a31af368ee2324e2033f3 (patch) | |
tree | 785a6e38e413594a74b89946af661566a72753a8 /synapse/storage | |
parent | Merge pull request #889 from matrix-org/markjh/synctl_workers (diff) | |
parent | Optionally make committing to postgres asynchronous. (diff) | |
download | synapse-6783534a0f9f34d6972a31af368ee2324e2033f3.tar.xz |
Merge pull request #886 from matrix-org/markjh/async_commit
Optionally make committing to postgres asynchronous.
Diffstat (limited to 'synapse/storage')
-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): |