From 12aebdfa5a81abaf4b7864c561e23c4a5b4945ca Mon Sep 17 00:00:00 2001 From: Richard van der Hoff <1389908+richvdh@users.noreply.github.com> Date: Wed, 19 Aug 2020 20:41:53 +0100 Subject: [PATCH] Close the database connection we create during startup (#8131) ... otherwise it gets leaked. --- changelog.d/8131.bugfix | 1 + synapse/storage/databases/__init__.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 changelog.d/8131.bugfix diff --git a/changelog.d/8131.bugfix b/changelog.d/8131.bugfix new file mode 100644 index 000000000000..5110f235d15f --- /dev/null +++ b/changelog.d/8131.bugfix @@ -0,0 +1 @@ +Fix a bug which could cause a leaked postgres connection if synapse was set to daemonize. diff --git a/synapse/storage/databases/__init__.py b/synapse/storage/databases/__init__.py index 4406e5827341..0ac854aee2df 100644 --- a/synapse/storage/databases/__init__.py +++ b/synapse/storage/databases/__init__.py @@ -87,12 +87,21 @@ def __init__(self, main_store_class, hs): logger.info("Database %r prepared", db_name) + # Closing the context manager doesn't close the connection. + # psycopg will close the connection when the object gets GCed, but *only* + # if the PID is the same as when the connection was opened [1], and + # it may not be if we fork in the meantime. + # + # [1]: https://github.com/psycopg/psycopg2/blob/2_8_5/psycopg/connection_type.c#L1378 + + db_conn.close() + # Sanity check that we have actually configured all the required stores. if not main: raise Exception("No 'main' data store configured") if not state: - raise Exception("No 'main' data store configured") + raise Exception("No 'state' data store configured") # We use local variables here to ensure that the databases do not have # optional types.