Esempio n. 1
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
Esempio n. 2
0
 def handle_msg_follower_rv(self, msg):
     term = msg['term']
     uuid = msg['id']
     if not self.valid_peer(uuid):
         return
     olog = {
         msg['log_index']: {
             'index': msg['log_index'],
             'term': msg['log_term'],
             'msgid': '',
             'msg': {}
         }
     }
     olog = log.RaftLog(olog)
     if term < self.term:
         # someone with a smaller term wants to get elected
         # as if
         rpc = self.rv_rpc_reply(False)
         self.send_to_peer(rpc, uuid)
         return
     if (self.voted is None or self.voted == uuid) and self.log <= olog:
         # we can vote for this guy
         self.voted = uuid
         self.save()
         rpc = self.rv_rpc_reply(True)
         self.last_update = time.time()
         self.send_to_peer(rpc, uuid)
         return
     # we probably voted for somebody else, or the log is old
     rpc = self.rv_rpc_reply(False)
     self.send_to_peer(rpc, uuid)
Esempio n. 3
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
Esempio n. 4
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)
Esempio n. 5
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)
Esempio n. 6
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
Esempio n. 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}
Esempio n. 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
Esempio n. 9
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}
Esempio n. 10
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
Esempio n. 11
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
Esempio n. 12
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
Esempio n. 13
0
def test_dump():
    rl = log.RaftLog(None)
    dump = {
        0: {
            'term': 0,
            'msgid': '',
            'committed': True,
            'acked': [],
            'msg': {},
            'index': 0
        }
    }
    assert rl.dump() == dump
Esempio n. 14
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
Esempio n. 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
Esempio n. 16
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
Esempio n. 17
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
Esempio n. 18
0
def test_le():
    # a's term is greater than b's
    a = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 4)}
    b = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 3)}
    ra = log.RaftLog(a)
    rb = log.RaftLog(b)
    assert ra > rb
    # terms are equal
    a = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 4)}
    b = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 4)}
    ra = log.RaftLog(a)
    rb = log.RaftLog(b)
    assert ra <= rb
    assert rb <= ra
    # terms equal but more commits in b
    a = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 4)}
    b = {1: mle(1, 2), 2: mle(2, 2), 3: mle(3, 4), 4: mle(4, 4)}
    ra = log.RaftLog(a)
    rb = log.RaftLog(b)
    assert rb > ra
Esempio n. 19
0
 def load(self):
     self.term, self.voted, llog, self.peers, \
         self.uuid = store.read_state(self.port)
     self.log = log.RaftLog(llog)
Esempio n. 20
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']
Esempio n. 21
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