forked from MirrorHub/synapse
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.
This commit is contained in:
parent
9ba2bf1570
commit
d5fb561709
3 changed files with 14 additions and 3 deletions
|
@ -32,7 +32,7 @@ def create_engine(database_config):
|
||||||
|
|
||||||
if engine_class:
|
if engine_class:
|
||||||
module = importlib.import_module(name)
|
module = importlib.import_module(name)
|
||||||
return engine_class(module)
|
return engine_class(module, database_config)
|
||||||
|
|
||||||
raise RuntimeError(
|
raise RuntimeError(
|
||||||
"Unsupported database engine '%s'" % (name,)
|
"Unsupported database engine '%s'" % (name,)
|
||||||
|
|
|
@ -19,9 +19,10 @@ from ._base import IncorrectDatabaseSetup
|
||||||
class PostgresEngine(object):
|
class PostgresEngine(object):
|
||||||
single_threaded = False
|
single_threaded = False
|
||||||
|
|
||||||
def __init__(self, database_module):
|
def __init__(self, database_module, database_config):
|
||||||
self.module = database_module
|
self.module = database_module
|
||||||
self.module.extensions.register_type(self.module.extensions.UNICODE)
|
self.module.extensions.register_type(self.module.extensions.UNICODE)
|
||||||
|
self.synchronous_commit = database_config.get("synchronous_commit", True)
|
||||||
|
|
||||||
def check_database(self, txn):
|
def check_database(self, txn):
|
||||||
txn.execute("SHOW SERVER_ENCODING")
|
txn.execute("SHOW SERVER_ENCODING")
|
||||||
|
@ -40,9 +41,19 @@ class PostgresEngine(object):
|
||||||
db_conn.set_isolation_level(
|
db_conn.set_isolation_level(
|
||||||
self.module.extensions.ISOLATION_LEVEL_REPEATABLE_READ
|
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):
|
def is_deadlock(self, error):
|
||||||
if isinstance(error, self.module.DatabaseError):
|
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 error.pgcode in ["40001", "40P01"]
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@ import struct
|
||||||
class Sqlite3Engine(object):
|
class Sqlite3Engine(object):
|
||||||
single_threaded = True
|
single_threaded = True
|
||||||
|
|
||||||
def __init__(self, database_module):
|
def __init__(self, database_module, database_config):
|
||||||
self.module = database_module
|
self.module = database_module
|
||||||
|
|
||||||
def check_database(self, txn):
|
def check_database(self, txn):
|
||||||
|
|
Loading…
Reference in a new issue