Fix hanging patronictl when RAFT is being used (#1697)

Close #1694
This commit is contained in:
Alexander Kukushkin
2020-09-16 14:03:40 +02:00
committed by GitHub
parent 83f9a031b8
commit 6706decc1c
2 changed files with 16 additions and 12 deletions
+15 -11
View File
@@ -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:
+1 -1
View File
@@ -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'}))