def test_get_max_index_term(): rl = log.RaftLog(None) le = log.logentry(2, 'abcd', {}) rl.add(le) assert rl.get_max_index_term() == (1, 2) le = log.logentry(6, 'abcdefg', {}) rl.add(le) assert rl.get_max_index_term() == (2, 6)
def test_get_term(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(4, 'abcde', {}) rl.add(le1) rl.add(le2) assert rl.get_term_of(0) == 0 assert rl.get_term_of(1) == 2 assert rl.get_term_of(2) == 4
def test_logs_after_index(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) assert rl.logs_after_index(1) == {2: le2, 3: le3}
def test_remove(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(4, 'abcde', {}) rl.add(le1) rl.add(le2) rl.remove(1) assert rl.get_by_uuid('abcd') == None assert rl.get_by_index(1) == None
def test_get(): rl = log.RaftLog(None) assert rl.get(2) == None le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) rl.add(le1) rl.add(le2) assert rl.get(2) == le2 assert rl.get_by_uuid('abcd') == le1 assert rl.get_by_index(1) == le1
def test_committed_logs_after_index(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) rl.commit(2, 2) assert rl.committed_logs_after_index(1) == {2: le2}
def test_exists(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) assert rl.exists(0, 0) == True assert rl.exists(1, 2) == True assert rl.exists(1, 1) == False assert rl.exists(3, 4) == True
def test_committed_by_uuid(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) rl.commit(2, 2) assert rl.is_committed_by_uuid('abcd') == True assert rl.is_committed_by_uuid('abcdef') == False assert rl.is_committed_by_uuid('abcde') == True assert rl.is_committed_by_uuid('xyz') == False
def test_is_committed(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) rl.commit(2, 2) assert rl.is_committed(1, 2) == True assert rl.is_committed(2, 2) == True assert rl.is_committed(2, 1) == False assert rl.is_committed(3, 4) == False
def test_maxindex(): rl = log.RaftLog(None) assert rl.maxindex() == 0 le = log.logentry(2, 'abcd', {}) rl.add(le) assert rl.maxindex() == 1 le = log.logentry(2, 'abcde', {}) le['index'] = 12 rl.add(le) assert rl.maxindex() == 12 le = log.logentry(2, 'abcdef', {}) le['index'] = 5 rl.add(le) assert rl.maxindex() == 5
def test_get_commit_index(): rl = log.RaftLog(None) assert rl.get_commit_index() == 0 le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(2, 'abcde', {}) le3 = log.logentry(4, 'abcdef', {}) rl.add(le1) rl.add(le2) rl.add(le3) assert rl.get_commit_index() == 0 rl.commit(2, 2) assert rl.get_commit_index() == 2 rl = log.RaftLog(None) rl.get_by_index(0)['committed'] = False assert rl.get_commit_index() == 0
def possible_update_commit(self): # we're in an update; see if the update msg # has committed, and go to phase 2 or finish if not self.log.is_committed_by_uuid(self.update_uuid): # it hasn't return umsg = self.log.get_by_uuid(self.update_uuid) data = copy.deepcopy(umsg['msg']) if data['phase'] == 1 and self.newpeers: # the *first* phase of the update has been committed # new leaders are guaranteed to be in the union of the # old and new configs. now update the configuration # to the new one only. data['phase'] = 2 newid = uuid.uuid4().hex self.update_uuid = newid data['id'] = newid self.oldpeers = self.peers self.peers = self.newpeers self.newpeers = None logentry = log.logentry(self.term, newid, data) self.log.add(logentry) else: # the *second* phase is now committed. tell all our # current peers about the successful commit, drop # the old config entirely and, if necessary, step down self.send_ae() # send this to peers who might be about to dispeer self.oldpeers = None self.update_uuid = None if not self.uuid in self.peers: self.running = False
def test_force_commit(): rl = log.RaftLog(None) le = log.logentry(6, 'xyz', {}) rl.add(le) assert le['committed'] == False rl.force_commit(1) assert le['committed'] == True rl.force_commit(5) # bad indices do nothing
def test_add(): rl = log.RaftLog(None) le1 = log.logentry(2, 'abcd', {}) le2 = log.logentry(4, 'abcde', {}) rl.add(le1) rl.add(le2) assert le1['index'] == 1 assert le2['index'] == 2 # double adds do nothing le1_2 = log.logentry(2, 'abcd', {}) rl.add(le1_2) assert 'index' not in le1_2 assert rl.get_by_uuid('abcd') == le1 le = log.logentry(6, 'xyz', {}) le['index'] = 1 rl.add(le) assert rl.get_by_uuid('abcd') == None assert rl.get_by_uuid('abcde') == None
def test_commit(): rl = log.RaftLog(None) le = log.logentry(6, 'xyz', {}) rl.add(le) assert le['committed'] == False rl.commit(1, 6) assert le['committed'] == True with pytest.raises(AssertionError): rl.commit(1, 8)
def test_num_acked(): rl = log.RaftLog(None) le = log.logentry(6, 'xyz', {}) rl.add(le) assert rl.num_acked(1) == 0 rl.add_ack(1, 6, 'f') assert rl.num_acked(1) == 1 # double acks don't increase our count rl.add_ack(1, 6, 'f') assert rl.num_acked(1) == 1 rl.add_ack(1, 6, 'g') assert rl.num_acked(1) == 2
def add_to_log(self, msg): uuid = msg['id'] logentry = log.logentry(self.term, uuid, msg) index = self.log.add(logentry) self.save() self.log.add_ack(index, self.term, self.uuid)
def test_add_ack(): rl = log.RaftLog(None) le = log.logentry(6, 'xyz', {}) rl.add(le) rl.add_ack(1, 6, 'f') assert 'f' in rl.get_by_uuid('xyz')['acked']
def test_has_uuid(): rl = log.RaftLog(None) le = log.logentry(2, 'abcd', {}) rl.add(le) assert rl.has_uuid('abcd') == True assert rl.has_uuid('dcba') == False