...
1# Run a V1 membership change that adds a single voter.
2
3# Bootstrap n1.
4add-nodes 1 voters=(1) index=2
5----
6INFO 1 switched to configuration voters=(1)
7INFO 1 became follower at term 0
8INFO newRaft 1 [peers: [1], term: 0, commit: 2, applied: 2, lastindex: 2, lastterm: 1]
9
10campaign 1
11----
12INFO 1 is starting a new election at term 0
13INFO 1 became candidate at term 1
14INFO 1 received MsgVoteResp from 1 at term 1
15INFO 1 became leader at term 1
16
17# Add v2 (with an auto transition).
18propose-conf-change 1 v1=true
19v2
20----
21ok
22
23# Pull n2 out of thin air.
24add-nodes 1
25----
26INFO 2 switched to configuration voters=()
27INFO 2 became follower at term 0
28INFO newRaft 2 [peers: [], term: 0, commit: 0, applied: 0, lastindex: 0, lastterm: 0]
29
30# n1 commits the conf change using itself as commit quorum, immediately transitions into
31# the final config, and catches up n2. Note that it's using an EntryConfChange, not an
32# EntryConfChangeV2, so this is compatible with nodes that don't know about V2 conf changes.
33stabilize
34----
35> 1 handling Ready
36 Ready MustSync=true:
37 Lead:1 State:StateLeader
38 HardState Term:1 Vote:1 Commit:4
39 Entries:
40 1/3 EntryNormal ""
41 1/4 EntryConfChange v2
42 CommittedEntries:
43 1/3 EntryNormal ""
44 1/4 EntryConfChange v2
45 INFO 1 switched to configuration voters=(1 2)
46> 1 handling Ready
47 Ready MustSync=false:
48 Messages:
49 1->2 MsgApp Term:1 Log:1/3 Commit:4 Entries:[1/4 EntryConfChange v2]
50> 2 receiving messages
51 1->2 MsgApp Term:1 Log:1/3 Commit:4 Entries:[1/4 EntryConfChange v2]
52 INFO 2 [term: 0] received a MsgApp message with higher term from 1 [term: 1]
53 INFO 2 became follower at term 1
54 DEBUG 2 [logterm: 0, index: 3] rejected MsgApp [logterm: 1, index: 3] from 1
55> 2 handling Ready
56 Ready MustSync=true:
57 Lead:1 State:StateFollower
58 HardState Term:1 Commit:0
59 Messages:
60 2->1 MsgAppResp Term:1 Log:0/3 Rejected (Hint: 0)
61> 1 receiving messages
62 2->1 MsgAppResp Term:1 Log:0/3 Rejected (Hint: 0)
63 DEBUG 1 received MsgAppResp(rejected, hint: (index 0, term 0)) from 2 for index 3
64 DEBUG 1 decreased progress of 2 to [StateProbe match=0 next=1]
65 DEBUG 1 [firstindex: 3, commit: 4] sent snapshot[index: 4, term: 1] to 2 [StateProbe match=0 next=1]
66 DEBUG 1 paused sending replication messages to 2 [StateSnapshot match=0 next=1 paused pendingSnap=4]
67> 1 handling Ready
68 Ready MustSync=false:
69 Messages:
70 1->2 MsgSnap Term:1 Log:0/0 Snapshot: Index:4 Term:1 ConfState:Voters:[1 2] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false
71> 2 receiving messages
72 1->2 MsgSnap Term:1 Log:0/0 Snapshot: Index:4 Term:1 ConfState:Voters:[1 2] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false
73 INFO log [committed=0, applied=0, unstable.offset=1, len(unstable.Entries)=0] starts to restore snapshot [index: 4, term: 1]
74 INFO 2 switched to configuration voters=(1 2)
75 INFO 2 [commit: 4, lastindex: 4, lastterm: 1] restored snapshot [index: 4, term: 1]
76 INFO 2 [commit: 4] restored snapshot [index: 4, term: 1]
77> 2 handling Ready
78 Ready MustSync=false:
79 HardState Term:1 Commit:4
80 Snapshot Index:4 Term:1 ConfState:Voters:[1 2] VotersOutgoing:[] Learners:[] LearnersNext:[] AutoLeave:false
81 Messages:
82 2->1 MsgAppResp Term:1 Log:0/4
83> 1 receiving messages
84 2->1 MsgAppResp Term:1 Log:0/4
85 DEBUG 1 recovered from needing snapshot, resumed sending replication messages to 2 [StateSnapshot match=4 next=5 paused pendingSnap=4]
86> 1 handling Ready
87 Ready MustSync=false:
88 Messages:
89 1->2 MsgApp Term:1 Log:1/4 Commit:4
90> 2 receiving messages
91 1->2 MsgApp Term:1 Log:1/4 Commit:4
92> 2 handling Ready
93 Ready MustSync=false:
94 Messages:
95 2->1 MsgAppResp Term:1 Log:0/4
96> 1 receiving messages
97 2->1 MsgAppResp Term:1 Log:0/4
View as plain text