@@ -18,6 +18,7 @@ import (
1818 "errors"
1919 "fmt"
2020 "io"
21+ "math"
2122 "os"
2223 "path/filepath"
2324 "reflect"
@@ -62,14 +63,17 @@ func PersistedRequests(lg *zap.Logger, dataDirs []string) ([]model.EtcdRequest,
6263 return nil , errors .New ("no data dirs" )
6364 }
6465 entriesPersistedInWAL := make ([][]raftpb.Entry , len (dataDirs ))
66+ var minCommitIndex uint64 = math .MaxUint64
6567 for i , dir := range dataDirs {
66- _ , entries , err := ReadWAL (lg , dir )
68+ state , entries , err := ReadWAL (lg , dir )
6769 if err != nil {
6870 lg .Error ("Failed to read WAL" , zap .Error (err ), zap .String ("data-dir" , dir ))
71+ continue
6972 }
73+ minCommitIndex = min (minCommitIndex , state .Commit )
7074 entriesPersistedInWAL [i ] = entries
7175 }
72- entries , err := mergeMembersEntries (entriesPersistedInWAL )
76+ entries , err := mergeMembersEntries (minCommitIndex , entriesPersistedInWAL )
7377 if err != nil {
7478 return nil , err
7579 }
@@ -89,7 +93,7 @@ func PersistedRequests(lg *zap.Logger, dataDirs []string) ([]model.EtcdRequest,
8993 return persistedRequests , nil
9094}
9195
92- func mergeMembersEntries (memberEntries [][]raftpb.Entry ) ([]raftpb.Entry , error ) {
96+ func mergeMembersEntries (minCommitIndex uint64 , memberEntries [][]raftpb.Entry ) ([]raftpb.Entry , error ) {
9397 for _ , entries := range memberEntries {
9498 var lastIndex uint64
9599 for _ , e := range entries {
@@ -162,10 +166,20 @@ func mergeMembersEntries(memberEntries [][]raftpb.Entry) ([]raftpb.Entry, error)
162166 if vote != topVotes {
163167 continue
164168 }
165- if entryWithMostVotes != nil && ! reflect .DeepEqual (* entryWithMostVotes , memberEntries [i ][memberIndices [i ]]) {
166- return nil , fmt .Errorf ("mismatching entries on raft index %d" , raftIndex )
169+ entry := memberEntries [i ][memberIndices [i ]]
170+ if entryWithMostVotes == nil {
171+ entryWithMostVotes = & entry
172+ continue
173+ }
174+ if entryWithMostVotes .Term != entry .Term && entry .Index > minCommitIndex {
175+ if entryWithMostVotes .Term < entry .Term {
176+ entryWithMostVotes = & entry
177+ }
178+ continue
179+ }
180+ if ! reflect .DeepEqual (* entryWithMostVotes , entry ) {
181+ return nil , fmt .Errorf ("mismatching entries on raft index %d, mostVotes: %+v, other: %+v" , raftIndex , * entryWithMostVotes , entry )
167182 }
168- entryWithMostVotes = & memberEntries [i ][memberIndices [i ]]
169183 }
170184 mergedHistory = append (mergedHistory , * entryWithMostVotes )
171185 }
0 commit comments