예제 #1
0
def test_answer_pre_vote(loop):
    m = Machine("node1")
    m.add_peer("node2")
    m.add_peer("node3")
    m.term = 1

    # Vote rejected because in same term and obedient
    m.step(Msg("node2", "node1", Message.PreVote, 1, index=1))
    assert m.outbox[-1].type == Message.PreVoteReply
    assert m.outbox[-1].reject is True

    # Becomes a PRE_CANDIDATE - no longer obedient
    m.tick = 0
    m.step(Msg("node1", "node1", Message.Tick, 0))
    assert m.obedient is False
    assert m.state == NodeState.PRE_CANDIDATE
    assert m.term == 1

    # In a later term and not obedient
    m.tick = 0
    m.step(Msg("node2", "node1", Message.PreVote, 2, index=1))
    assert m.outbox[-1].type == Message.PreVoteReply
    assert m.outbox[-1].reject is False

    # Hasn't actually voted so this shouldn't be set
    assert m.voted_for is None
예제 #2
0
def test_append_entries_revoke_previous_log_entry(loop):
    m = Machine("node1")
    m.add_peer("node2")
    m.add_peer("node3")
    m.term = 2

    # Recovered from saved log
    m.log.append((1, {"type": "consensus"}))

    # Committed when became leader
    m.log.append((2, {}))

    m.step(
        Msg(
            "node2",
            "node1",
            Message.AppendEntries,
            term=3,
            prev_index=2,
            prev_term=3,
            entries=[],
            leader_commit=0,
        ))

    assert m.log[2] == (2, {})
    assert m.outbox[-1].type == Message.AppendEntriesReply
    assert m.outbox[-1].reject is True

    m.step(
        Msg(
            "node2",
            "node1",
            Message.AppendEntries,
            term=3,
            prev_index=1,
            prev_term=1,
            entries=[(3, {})],
            leader_commit=0,
        ))

    assert m.log[2] == (3, {})
    assert m.outbox[-1].type == Message.AppendEntriesReply
    assert m.outbox[-1].reject is False
    assert m.outbox[-1].log_index == 2
예제 #3
0
def test_answer_vote(loop):
    m = Machine("node1")
    m.add_peer("node2")
    m.add_peer("node3")
    m.term = 1

    # Vote rejected because in same term
    m.step(Msg("node2", "node1", Message.Vote, 1, index=1))
    assert m.outbox[-1].type == Message.VoteReply
    assert m.outbox[-1].reject is True

    # Vote in new term, but it is still obedient to current leader
    m.step(Msg("node2", "node1", Message.Vote, 2, index=1))
    assert m.outbox[-1].type == Message.VoteReply
    assert m.outbox[-1].reject is True

    # Becomes a PRE_CANDIDATE - nog longer obedient
    m.tick = 0
    m.step(Msg("node1", "node1", Message.Tick, 0))
    assert m.obedient is False
    assert m.state == NodeState.PRE_CANDIDATE
    assert m.term == 1

    # Vote in new term, but it is still obedient to current leader
    m.tick = 0
    m.step(Msg("node2", "node1", Message.Vote, 2, index=1))
    assert m.term == 2
    assert m.outbox[-1].type == Message.VoteReply
    assert m.outbox[-1].reject is False

    # Election timer reset after vote
    assert m.tick > 0

    # Pin to node until next reset
    assert m.voted_for == "node2"

    # Term should have increased
    assert m.term == 2