summary refs log tree commit diff
path: root/tests/storage/test_database.py
diff options
context:
space:
mode:
authorDavid Robertson <davidr@element.io>2023-12-05 16:07:42 +0000
committerDavid Robertson <davidr@element.io>2023-12-05 16:10:48 +0000
commit44377f5ac05ff4e95f440f5704805b87a37e3327 (patch)
tree4bceb3f51cf2ea6ad9420b4ff1457384ef0724fc /tests/storage/test_database.py
parentAmend changelog typo (diff)
downloadsynapse-44377f5ac05ff4e95f440f5704805b87a37e3327.tar.xz
Revert postgres logical replication deltaas v1.98.0rc1
This reverts two commits:

    0bb8e418a41c6f583ca9d705b400e37e2308a534
    "Fix postgres schema after dropping old tables (#16730)"

and

    51e4e35653f98c3f61222fbdbdb1dcb8864f7fca
    "Add a Postgres `REPLICA IDENTITY` to tables that do not have an implicit one. This should allow use of Postgres logical replication. (take  2, now with no added deadlocks!) (#16658)"

and also amends the changelog.
Diffstat (limited to '')
-rw-r--r--tests/storage/test_database.py85
1 files changed, 1 insertions, 84 deletions
diff --git a/tests/storage/test_database.py b/tests/storage/test_database.py
index aa8c76f187..4d0ebb550d 100644
--- a/tests/storage/test_database.py
+++ b/tests/storage/test_database.py
@@ -12,7 +12,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from typing import Callable, List, Tuple
+from typing import Callable, Tuple
 from unittest.mock import Mock, call
 
 from twisted.internet import defer
@@ -29,7 +29,6 @@ from synapse.storage.database import (
 from synapse.util import Clock
 
 from tests import unittest
-from tests.utils import USE_POSTGRES_FOR_TESTS
 
 
 class TupleComparisonClauseTestCase(unittest.TestCase):
@@ -280,85 +279,3 @@ class CancellationTestCase(unittest.HomeserverTestCase):
             ]
         )
         self.assertEqual(exception_callback.call_count, 6)  # no additional calls
-
-
-class PostgresReplicaIdentityTestCase(unittest.HomeserverTestCase):
-    if not USE_POSTGRES_FOR_TESTS:
-        skip = "Requires Postgres"
-
-    def prepare(
-        self, reactor: MemoryReactor, clock: Clock, homeserver: HomeServer
-    ) -> None:
-        self.db_pools = homeserver.get_datastores().databases
-
-    def test_all_tables_have_postgres_replica_identity(self) -> None:
-        """
-        Tests that all tables have a Postgres REPLICA IDENTITY.
-        (See https://github.com/matrix-org/synapse/issues/16224).
-
-        Tables with a PRIMARY KEY have an implied REPLICA IDENTITY and are fine.
-        Other tables need them to be set with `ALTER TABLE`.
-
-        A REPLICA IDENTITY is required for Postgres logical replication to work
-        properly without blocking updates and deletes.
-        """
-
-        sql = """
-            -- Select tables that have no primary key and use the default replica identity rule
-            -- (the default is to use the primary key)
-            WITH tables_no_pkey AS (
-                SELECT tbl.table_schema, tbl.table_name
-                FROM information_schema.tables tbl
-                WHERE table_type = 'BASE TABLE'
-                    AND table_schema not in ('pg_catalog', 'information_schema')
-                    AND NOT EXISTS (
-                        SELECT 1
-                        FROM information_schema.table_constraints tc
-                        WHERE tc.constraint_type = 'PRIMARY KEY'
-                            AND tc.table_schema = tbl.table_schema
-                            AND tc.table_name = tbl.table_name
-                    )
-            )
-            SELECT pg_class.oid::regclass FROM tables_no_pkey INNER JOIN pg_class ON pg_class.oid::regclass = table_name::regclass
-            WHERE relreplident = 'd'
-
-            UNION
-
-            -- Also select tables that use an index as a replica identity
-            -- but where the index doesn't exist
-            -- (e.g. it could have been deleted)
-            SELECT pg_class.oid::regclass
-                FROM information_schema.tables tbl
-                INNER JOIN pg_class ON pg_class.oid::regclass = table_name::regclass
-                WHERE table_type = 'BASE TABLE'
-                    AND table_schema not in ('pg_catalog', 'information_schema')
-
-                    -- 'i' means an index is used as the replica identity
-                    AND relreplident = 'i'
-
-                    -- look for indices that are marked as the replica identity
-                    AND NOT EXISTS (
-                        SELECT indexrelid::regclass
-                        FROM pg_index
-                        WHERE indrelid = pg_class.oid::regclass AND indisreplident
-                    )
-        """
-
-        def _list_tables_with_missing_replica_identities_txn(
-            txn: LoggingTransaction,
-        ) -> List[str]:
-            txn.execute(sql)
-            return [table_name for table_name, in txn]
-
-        for pool in self.db_pools:
-            missing = self.get_success(
-                pool.runInteraction(
-                    "test_list_missing_replica_identities",
-                    _list_tables_with_missing_replica_identities_txn,
-                )
-            )
-            self.assertEqual(
-                len(missing),
-                0,
-                f"The following tables in the {pool.name()!r} database are missing REPLICA IDENTITIES: {missing!r}.",
-            )