示例#1
0
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)
示例#2
0
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)
示例#3
0
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
示例#4
0
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}
示例#5
0
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
示例#6
0
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
示例#7
0
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}
示例#8
0
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
示例#9
0
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
示例#10
0
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}
示例#11
0
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}
示例#12
0
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
示例#13
0
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
示例#14
0
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
示例#15
0
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
示例#16
0
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
示例#17
0
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
示例#18
0
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
示例#19
0
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
示例#20
0
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
示例#21
0
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
示例#22
0
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
示例#23
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
示例#24
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
示例#25
0
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
示例#26
0
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
示例#27
0
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
示例#28
0
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)
示例#29
0
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
示例#30
0
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)
示例#31
0
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
示例#32
0
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
示例#33
0
 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)
示例#34
0
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']
示例#35
0
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
示例#36
0
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
示例#37
0
 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)
示例#38
0
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']