...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package rafttest
16
17 import (
18 "fmt"
19 "testing"
20
21 "github.com/cockroachdb/datadriven"
22 "go.etcd.io/etcd/raft/v3"
23 "go.etcd.io/etcd/raft/v3/raftpb"
24 )
25
26 func (env *InteractionEnv) handleProcessReady(t *testing.T, d datadriven.TestData) error {
27 idxs := nodeIdxs(t, d)
28 for _, idx := range idxs {
29 var err error
30 if len(idxs) > 1 {
31 fmt.Fprintf(env.Output, "> %d handling Ready\n", idx+1)
32 env.withIndent(func() { err = env.ProcessReady(idx) })
33 } else {
34 err = env.ProcessReady(idx)
35 }
36 if err != nil {
37 return err
38 }
39 }
40 return nil
41 }
42
43
44 func (env *InteractionEnv) ProcessReady(idx int) error {
45
46 rn, s := env.Nodes[idx].RawNode, env.Nodes[idx].Storage
47 rd := rn.Ready()
48 env.Output.WriteString(raft.DescribeReady(rd, defaultEntryFormatter))
49
50
51 if !raft.IsEmptyHardState(rd.HardState) {
52 if err := s.SetHardState(rd.HardState); err != nil {
53 return err
54 }
55 }
56 if err := s.Append(rd.Entries); err != nil {
57 return err
58 }
59 if !raft.IsEmptySnap(rd.Snapshot) {
60 if err := s.ApplySnapshot(rd.Snapshot); err != nil {
61 return err
62 }
63 }
64 for _, ent := range rd.CommittedEntries {
65 var update []byte
66 var cs *raftpb.ConfState
67 switch ent.Type {
68 case raftpb.EntryConfChange:
69 var cc raftpb.ConfChange
70 if err := cc.Unmarshal(ent.Data); err != nil {
71 return err
72 }
73 update = cc.Context
74 cs = rn.ApplyConfChange(cc)
75 case raftpb.EntryConfChangeV2:
76 var cc raftpb.ConfChangeV2
77 if err := cc.Unmarshal(ent.Data); err != nil {
78 return err
79 }
80 cs = rn.ApplyConfChange(cc)
81 update = cc.Context
82 default:
83 update = ent.Data
84 }
85
86
87
88 lastSnap := env.Nodes[idx].History[len(env.Nodes[idx].History)-1]
89 var snap raftpb.Snapshot
90 snap.Data = append(snap.Data, lastSnap.Data...)
91
92 snap.Data = append(snap.Data, update...)
93 snap.Metadata.Index = ent.Index
94 snap.Metadata.Term = ent.Term
95 if cs == nil {
96 sl := env.Nodes[idx].History
97 cs = &sl[len(sl)-1].Metadata.ConfState
98 }
99 snap.Metadata.ConfState = *cs
100 env.Nodes[idx].History = append(env.Nodes[idx].History, snap)
101 }
102
103 env.Messages = append(env.Messages, rd.Messages...)
104
105 rn.Advance(rd)
106 return nil
107 }
108
View as plain text