Allow setting transaction limit for db connections (#10440)
Setting the value will help PostgreSQL free up memory by recycling
the connections in the connection pool.
Signed-off-by: Toni Spets <toni.spets@iki.fi>
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/storage/test_txn_limit.py b/tests/storage/test_txn_limit.py
new file mode 100644
index 0000000000..9be51f9ebd
--- /dev/null
+++ b/tests/storage/test_txn_limit.py
@@ -0,0 +1,36 @@
+# Copyright 2014-2021 The Matrix.org Foundation C.I.C.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from tests import unittest
+
+
+class SQLTransactionLimitTestCase(unittest.HomeserverTestCase):
+ """Test SQL transaction limit doesn't break transactions."""
+
+ def make_homeserver(self, reactor, clock):
+ return self.setup_test_homeserver(db_txn_limit=1000)
+
+ def test_config(self):
+ db_config = self.hs.config.get_single_database()
+ self.assertEqual(db_config.config["txn_limit"], 1000)
+
+ def test_select(self):
+ def do_select(txn):
+ txn.execute("SELECT 1")
+
+ db_pool = self.hs.get_datastores().databases[0]
+
+ # force txn limit to roll over at least once
+ for i in range(0, 1001):
+ self.get_success_or_raise(db_pool.runInteraction("test_select", do_select))
diff --git a/tests/utils.py b/tests/utils.py
index 6bd008dcfe..f3458ca88d 100644
--- a/tests/utils.py
+++ b/tests/utils.py
@@ -239,6 +239,9 @@ def setup_test_homeserver(
"args": {"database": ":memory:", "cp_min": 1, "cp_max": 1},
}
+ if "db_txn_limit" in kwargs:
+ database_config["txn_limit"] = kwargs["db_txn_limit"]
+
database = DatabaseConnectionConfig("master", database_config)
config.database.databases = [database]
|