Beispiel #1
0
 def test_sync_replication_slots(self):
     config = ClusterConfig(1, {'slots': {'test_3': {'database': 'a', 'plugin': 'b'},
                                          'A': 0, 'ls': 0, 'b': {'type': 'logical', 'plugin': '1'}},
                                'ignore_slots': [{'name': 'blabla'}]}, 1)
     cluster = Cluster(True, config, self.leader, 0,
                       [self.me, self.other, self.leadermem], None, None, None, {'test_3': 10})
     with mock.patch('patroni.postgresql.Postgresql._query', Mock(side_effect=psycopg.OperationalError)):
         self.s.sync_replication_slots(cluster, False)
     self.p.set_role('standby_leader')
     self.s.sync_replication_slots(cluster, False)
     self.p.set_role('replica')
     with patch.object(Postgresql, 'is_leader', Mock(return_value=False)):
         self.s.sync_replication_slots(cluster, False)
     self.p.set_role('master')
     with mock.patch('patroni.postgresql.Postgresql.role', new_callable=PropertyMock(return_value='replica')):
         self.s.sync_replication_slots(cluster, False)
     with patch.object(SlotsHandler, 'drop_replication_slot', Mock(return_value=True)),\
             patch('patroni.dcs.logger.error', new_callable=Mock()) as errorlog_mock:
         alias1 = Member(0, 'test-3', 28, {'conn_url': 'postgres://*****:*****@127.0.0.1:5436/postgres'})
         alias2 = Member(0, 'test.3', 28, {'conn_url': 'postgres://*****:*****@127.0.0.1:5436/postgres'})
         cluster.members.extend([alias1, alias2])
         self.s.sync_replication_slots(cluster, False)
         self.assertEqual(errorlog_mock.call_count, 5)
         ca = errorlog_mock.call_args_list[0][0][1]
         self.assertTrue("test-3" in ca, "non matching {0}".format(ca))
         self.assertTrue("test.3" in ca, "non matching {0}".format(ca))
         with patch.object(Postgresql, 'major_version', PropertyMock(return_value=90618)):
             self.s.sync_replication_slots(cluster, False)
Beispiel #2
0
 def test__ensure_logical_slots_replica(self):
     self.p.set_role('replica')
     config = ClusterConfig(
         1, {'slots': {
             'ls': {
                 'database': 'a',
                 'plugin': 'b'
             }
         }}, 1)
     cluster = Cluster(True, config, self.leader, 0,
                       [self.me, self.other, self.leadermem], None, None,
                       None, {'ls': 12346})
     self.assertEqual(self.s.sync_replication_slots(cluster, False), [])
     self.s._schedule_load_slots = False
     with patch.object(MockCursor, 'execute',
                       Mock(side_effect=psycopg2.OperationalError)):
         self.assertEqual(self.s.sync_replication_slots(cluster, False), [])
     cluster.slots['ls'] = 'a'
     self.assertEqual(self.s.sync_replication_slots(cluster, False), [])
     with patch.object(MockCursor,
                       'rowcount',
                       PropertyMock(return_value=1),
                       create=True):
         self.assertEqual(self.s.sync_replication_slots(cluster, False),
                          ['ls'])
Beispiel #3
0
 def setUp(self):
     super(TestSlotsHandler, self).setUp()
     self.s = self.p.slots_handler
     self.p.start()
     config = ClusterConfig(1, {'slots': {'ls': {'database': 'a', 'plugin': 'b'}}}, 1)
     self.cluster = Cluster(True, config, self.leader, 0,
                            [self.me, self.other, self.leadermem], None, None, None, {'ls': 12345})
Beispiel #4
0
 def test_check_logical_slots_readiness(self):
     self.s.copy_logical_slots(self.leader, ['ls'])
     config = ClusterConfig(1, {'slots': {'ls': {'database': 'a', 'plugin': 'b'}}}, 1)
     cluster = Cluster(True, config, self.leader, 0,
                       [self.me, self.other, self.leadermem], None, None, None, {'ls': 12345})
     self.assertEqual(self.s.sync_replication_slots(cluster, False), [])
     with patch.object(MockCursor, 'rowcount', PropertyMock(return_value=1), create=True):
         self.s.check_logical_slots_readiness(cluster, False, None)
Beispiel #5
0
def get_standby_cluster_initialized_with_only_leader(failover=None, sync=None):
    return get_cluster_initialized_with_only_leader(
        cluster_config=ClusterConfig(1, {
            "standby_cluster": {
                "host": "localhost",
                "port": 5432,
                "primary_slot_name": "",
            }}, 1)
    )
Beispiel #6
0
    def test_process_permanent_slots(self):
        config = ClusterConfig(
            1, {
                'slots': {
                    'ls': {
                        'database': 'a',
                        'plugin': 'b'
                    }
                },
                'ignore_slots': [{
                    'name': 'blabla'
                }]
            }, 1)
        cluster = Cluster(True, config, self.leader, 0,
                          [self.me, self.other, self.leadermem], None, None,
                          None, None)

        self.s.sync_replication_slots(cluster, False)
        with patch.object(Postgresql, '_query') as mock_query:
            self.p.reset_cluster_info_state(None)
            mock_query.return_value.fetchone.return_value = (
                1, 0, 0, 0, 0, 0, 0, 0, 0, [{
                    "slot_name": "ls",
                    "type": "logical",
                    "datoid": 5,
                    "plugin": "b",
                    "confirmed_flush_lsn": 12345,
                    "catalog_xmin": 105
                }])
            self.assertEqual(self.p.slots(), {'ls': 12345})

            self.p.reset_cluster_info_state(None)
            mock_query.return_value.fetchone.return_value = (
                1, 0, 0, 0, 0, 0, 0, 0, 0, [{
                    "slot_name": "ls",
                    "type": "logical",
                    "datoid": 6,
                    "plugin": "b",
                    "confirmed_flush_lsn": 12345,
                    "catalog_xmin": 105
                }])
            self.assertEqual(self.p.slots(), {})
Beispiel #7
0
def get_cluster(initialize, leader, members, failover, sync):
    return Cluster(initialize, ClusterConfig(1, {1: 2}, 1), leader, 10,
                   members, failover, sync)
Beispiel #8
0
def get_cluster(initialize, leader, members, failover, sync):
    history = TimelineHistory(1, [(1, 67197376, 'no recovery target specified', datetime.datetime.now().isoformat())])
    return Cluster(initialize, ClusterConfig(1, {1: 2}, 1), leader, 10, members, failover, sync, history)
Beispiel #9
0
 def test_start_as_standby_leader(self, initialize):
     self.p.data_directory_empty = true
     self.ha.cluster = get_cluster_not_initialized_without_leader(cluster_config=ClusterConfig(0, {}, 0))
     self.ha.cluster.is_unlocked = true
     self.ha.patroni.config._dynamic_configuration = {"standby_cluster": {"port": 5432}}
     self.assertEqual(self.ha.run_cycle(), 'trying to bootstrap a new standby leader')