From 6706decc1c36317190134d9028995fa0684319a2 Mon Sep 17 00:00:00 2001 From: Alexander Kukushkin Date: Wed, 16 Sep 2020 14:03:40 +0200 Subject: [PATCH] Fix hanging patronictl when RAFT is being used (#1697) Close #1694 --- patroni/dcs/raft.py | 26 +++++++++++++++----------- tests/test_raft.py | 2 +- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/patroni/dcs/raft.py b/patroni/dcs/raft.py index 66359d14..97ddb3d4 100644 --- a/patroni/dcs/raft.py +++ b/patroni/dcs/raft.py @@ -87,15 +87,14 @@ class DynMemberSyncObj(SyncObj): def __init__(self, selfAddress, partnerAddrs, conf): add_self = False - if selfAddress: - utility = SyncObjUtility(partnerAddrs, conf) - for node in utility._SyncObj__otherNodes: - utility.setPartnerNode(node) - response = utility.sendMessage(['members']) - if response: - partnerAddrs = [member['addr'] for member in response if member['addr'] != selfAddress] - add_self = len(partnerAddrs) == len(response) - break + utility = SyncObjUtility(partnerAddrs, conf) + for node in utility._SyncObj__otherNodes: + utility.setPartnerNode(node) + response = utility.sendMessage(['members']) + if response: + partnerAddrs = [member['addr'] for member in response if member['addr'] != selfAddress] + add_self = selfAddress and len(partnerAddrs) == len(response) + break super(DynMemberSyncObj, self).__init__(selfAddress, partnerAddrs, conf, transportClass=MyTCPTransport) if add_self: @@ -269,14 +268,19 @@ class Raft(AbstractDCS): super(Raft, self).__init__(config) self._ttl = int(config.get('ttl') or 30) - self_addr = None if self._ctl else config.get('self_addr') + self_addr = config.get('self_addr') + partner_addrs = config.get('partner_addrs', []) + if self._ctl: + if self_addr: + partner_addrs.append(self_addr) + self_addr = None template = os.path.join(config.get('data_dir', ''), self_addr or '') files = {'journalFile': template + '.journal', 'fullDumpFile': template + '.dump'} if self_addr else {} ready_event = threading.Event() conf = SyncObjConf(commandsWaitLeader=False, appendEntriesUseBatch=False, onReady=ready_event.set, dynamicMembershipChange=True, **files) - self._sync_obj = KVStoreTTL(self_addr, config.get('partner_addrs', []), conf, self._on_set, self._on_delete) + self._sync_obj = KVStoreTTL(self_addr, partner_addrs, conf, self._on_set, self._on_delete) while True: ready_event.wait(5) if ready_event.isSet() or self._sync_obj.applied_local_log: diff --git a/tests/test_raft.py b/tests/test_raft.py index 58427037..cd79bfc4 100644 --- a/tests/test_raft.py +++ b/tests/test_raft.py @@ -152,4 +152,4 @@ class TestRaft(unittest.TestCase): def test_init(self, mock_event, mock_kvstore): mock_kvstore.return_value.applied_local_log = False mock_event.return_value.isSet.side_effect = [False, True] - self.assertIsNotNone(Raft({'ttl': 30, 'scope': 'test', 'name': 'pg', 'patronictl': True})) + self.assertIsNotNone(Raft({'ttl': 30, 'scope': 'test', 'name': 'pg', 'patronictl': True, 'self_addr': '1'}))