-
Notifications
You must be signed in to change notification settings - Fork 170
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #79 from erikgrinaker/step-down-on-removal
- Loading branch information
Showing
6 changed files
with
471 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,190 @@ | ||
# We'll turn this back on after the boilerplate. | ||
log-level none | ||
---- | ||
ok | ||
|
||
# Run a V1 membership change that removes the leader, asking it | ||
# to step down on removal. | ||
# Bootstrap n1, n2, n3. | ||
add-nodes 3 voters=(1,2,3) index=2 step-down-on-removal=true | ||
---- | ||
ok | ||
|
||
campaign 1 | ||
---- | ||
ok | ||
|
||
stabilize | ||
---- | ||
ok | ||
|
||
log-level debug | ||
---- | ||
ok | ||
|
||
raft-state | ||
---- | ||
1: StateLeader (Voter) Term:1 Lead:1 | ||
2: StateFollower (Voter) Term:1 Lead:1 | ||
3: StateFollower (Voter) Term:1 Lead:1 | ||
|
||
# Start removing n1. | ||
propose-conf-change 1 v1=true | ||
r1 | ||
---- | ||
ok | ||
|
||
raft-state | ||
---- | ||
1: StateLeader (Voter) Term:1 Lead:1 | ||
2: StateFollower (Voter) Term:1 Lead:1 | ||
3: StateFollower (Voter) Term:1 Lead:1 | ||
|
||
# Propose an extra entry which will be sent out together with the conf change. | ||
propose 1 foo | ||
---- | ||
ok | ||
|
||
# Send out the corresponding appends. | ||
process-ready 1 | ||
---- | ||
Ready MustSync=true: | ||
Entries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
Messages: | ||
1->2 MsgApp Term:1 Log:1/3 Commit:3 Entries:[1/4 EntryConfChange r1] | ||
1->3 MsgApp Term:1 Log:1/3 Commit:3 Entries:[1/4 EntryConfChange r1] | ||
1->2 MsgApp Term:1 Log:1/4 Commit:3 Entries:[1/5 EntryNormal "foo"] | ||
1->3 MsgApp Term:1 Log:1/4 Commit:3 Entries:[1/5 EntryNormal "foo"] | ||
|
||
# Send response from n2 (which is enough to commit the entries so far next time | ||
# n1 runs). | ||
stabilize 2 | ||
---- | ||
> 2 receiving messages | ||
1->2 MsgApp Term:1 Log:1/3 Commit:3 Entries:[1/4 EntryConfChange r1] | ||
1->2 MsgApp Term:1 Log:1/4 Commit:3 Entries:[1/5 EntryNormal "foo"] | ||
> 2 handling Ready | ||
Ready MustSync=true: | ||
Entries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
Messages: | ||
2->1 MsgAppResp Term:1 Log:0/4 | ||
2->1 MsgAppResp Term:1 Log:0/5 | ||
|
||
# Put another entry in n1's log. | ||
propose 1 bar | ||
---- | ||
ok | ||
|
||
# n1 applies the conf change, removing itself and stepping down. But it still | ||
# has an uncommitted 'bar' entry in the log that it sends out appends for first. | ||
stabilize 1 | ||
---- | ||
> 1 handling Ready | ||
Ready MustSync=true: | ||
Entries: | ||
1/6 EntryNormal "bar" | ||
Messages: | ||
1->2 MsgApp Term:1 Log:1/5 Commit:3 Entries:[1/6 EntryNormal "bar"] | ||
1->3 MsgApp Term:1 Log:1/5 Commit:3 Entries:[1/6 EntryNormal "bar"] | ||
> 1 receiving messages | ||
2->1 MsgAppResp Term:1 Log:0/4 | ||
2->1 MsgAppResp Term:1 Log:0/5 | ||
> 1 handling Ready | ||
Ready MustSync=false: | ||
HardState Term:1 Vote:1 Commit:5 | ||
CommittedEntries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
Messages: | ||
1->2 MsgApp Term:1 Log:1/6 Commit:4 | ||
1->3 MsgApp Term:1 Log:1/6 Commit:4 | ||
1->2 MsgApp Term:1 Log:1/6 Commit:5 | ||
1->3 MsgApp Term:1 Log:1/6 Commit:5 | ||
INFO 1 switched to configuration voters=(2 3) | ||
INFO 1 became follower at term 1 | ||
> 1 handling Ready | ||
Ready MustSync=false: | ||
Lead:0 State:StateFollower | ||
|
||
raft-state | ||
---- | ||
1: StateFollower (Non-Voter) Term:1 Lead:0 | ||
2: StateFollower (Voter) Term:1 Lead:1 | ||
3: StateFollower (Voter) Term:1 Lead:1 | ||
|
||
# n2 responds, n3 doesn't yet. Quorum for 'bar' should not be reached... | ||
stabilize 2 | ||
---- | ||
> 2 receiving messages | ||
1->2 MsgApp Term:1 Log:1/5 Commit:3 Entries:[1/6 EntryNormal "bar"] | ||
1->2 MsgApp Term:1 Log:1/6 Commit:4 | ||
1->2 MsgApp Term:1 Log:1/6 Commit:5 | ||
> 2 handling Ready | ||
Ready MustSync=true: | ||
HardState Term:1 Vote:1 Commit:5 | ||
Entries: | ||
1/6 EntryNormal "bar" | ||
CommittedEntries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
Messages: | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
INFO 2 switched to configuration voters=(2 3) | ||
|
||
# ...because the old leader n1 ignores the append responses. | ||
stabilize 1 | ||
---- | ||
> 1 receiving messages | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
2->1 MsgAppResp Term:1 Log:0/6 | ||
|
||
# When n3 responds, quorum is reached and everything falls into place. | ||
stabilize | ||
---- | ||
> 3 receiving messages | ||
1->3 MsgApp Term:1 Log:1/3 Commit:3 Entries:[1/4 EntryConfChange r1] | ||
1->3 MsgApp Term:1 Log:1/4 Commit:3 Entries:[1/5 EntryNormal "foo"] | ||
1->3 MsgApp Term:1 Log:1/5 Commit:3 Entries:[1/6 EntryNormal "bar"] | ||
1->3 MsgApp Term:1 Log:1/6 Commit:4 | ||
1->3 MsgApp Term:1 Log:1/6 Commit:5 | ||
> 3 handling Ready | ||
Ready MustSync=true: | ||
HardState Term:1 Vote:1 Commit:5 | ||
Entries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
1/6 EntryNormal "bar" | ||
CommittedEntries: | ||
1/4 EntryConfChange r1 | ||
1/5 EntryNormal "foo" | ||
Messages: | ||
3->1 MsgAppResp Term:1 Log:0/4 | ||
3->1 MsgAppResp Term:1 Log:0/5 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
INFO 3 switched to configuration voters=(2 3) | ||
> 1 receiving messages | ||
3->1 MsgAppResp Term:1 Log:0/4 | ||
3->1 MsgAppResp Term:1 Log:0/5 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
3->1 MsgAppResp Term:1 Log:0/6 | ||
|
||
# n1 can no longer propose. | ||
propose 1 baz | ||
---- | ||
INFO 1 no leader at term 1; dropping proposal | ||
raft proposal dropped | ||
|
||
# Nor can it campaign to become leader. | ||
campaign 1 | ||
---- | ||
WARN 1 is unpromotable and can not campaign |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.