Skip to content

Commit 42a3fef

Browse files
committed
log: use logSlice in raftLog.maybeAppend
Signed-off-by: Pavel Kalinnikov <[email protected]>
1 parent 691a870 commit 42a3fef

File tree

3 files changed

+27
-12
lines changed

3 files changed

+27
-12
lines changed

log.go

+10-8
Original file line numberDiff line numberDiff line change
@@ -106,23 +106,25 @@ func (l *raftLog) String() string {
106106

107107
// maybeAppend returns (0, false) if the entries cannot be appended. Otherwise,
108108
// it returns (last index of new entries, true).
109-
func (l *raftLog) maybeAppend(prev entryID, committed uint64, ents ...pb.Entry) (lastnewi uint64, ok bool) {
110-
if !l.matchTerm(prev) {
109+
func (l *raftLog) maybeAppend(a logSlice, committed uint64) (lastnewi uint64, ok bool) {
110+
if !l.matchTerm(a.prev) {
111111
return 0, false
112112
}
113+
// TODO(pav-kv): propagate logSlice down the stack. It will be used all the
114+
// way down in unstable, for safety checks, and for useful bookkeeping.
113115

114-
lastnewi = prev.index + uint64(len(ents))
115-
ci := l.findConflict(ents)
116+
lastnewi = a.prev.index + uint64(len(a.entries))
117+
ci := l.findConflict(a.entries)
116118
switch {
117119
case ci == 0:
118120
case ci <= l.committed:
119121
l.logger.Panicf("entry %d conflict with committed entry [committed(%d)]", ci, l.committed)
120122
default:
121-
offset := prev.index + 1
122-
if ci-offset > uint64(len(ents)) {
123-
l.logger.Panicf("index, %d, is out of range [%d]", ci-offset, len(ents))
123+
offset := a.prev.index + 1
124+
if ci-offset > uint64(len(a.entries)) {
125+
l.logger.Panicf("index, %d, is out of range [%d]", ci-offset, len(a.entries))
124126
}
125-
l.append(ents[ci-offset:]...)
127+
l.append(a.entries[ci-offset:]...)
126128
}
127129
l.commitTo(min(committed, lastnewi))
128130
return lastnewi, true

log_test.go

+11-1
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,16 @@ func TestLogMaybeAppend(t *testing.T) {
296296
}
297297

298298
for i, tt := range tests {
299+
// TODO(pav-kv): for now, we pick a high enough app.term so that it
300+
// represents a valid append message. The maybeAppend currently ignores it,
301+
// but it must check that the append does not regress the term.
302+
app := logSlice{
303+
term: 100,
304+
prev: tt.prev,
305+
entries: tt.ents,
306+
}
307+
require.NoError(t, app.valid())
308+
299309
raftLog := newLog(NewMemoryStorage(), raftLogger)
300310
raftLog.append(previousEnts...)
301311
raftLog.committed = commit
@@ -306,7 +316,7 @@ func TestLogMaybeAppend(t *testing.T) {
306316
require.True(t, tt.wpanic)
307317
}
308318
}()
309-
glasti, gappend := raftLog.maybeAppend(tt.prev, tt.committed, tt.ents...)
319+
glasti, gappend := raftLog.maybeAppend(app, tt.committed)
310320
require.Equal(t, tt.wlasti, glasti)
311321
require.Equal(t, tt.wappend, gappend)
312322
require.Equal(t, tt.wcommit, raftLog.committed)

raft.go

+6-3
Original file line numberDiff line numberDiff line change
@@ -1745,12 +1745,15 @@ func stepFollower(r *raft, m pb.Message) error {
17451745
}
17461746

17471747
func (r *raft) handleAppendEntries(m pb.Message) {
1748-
prev := entryID{term: m.LogTerm, index: m.Index}
1749-
if prev.index < r.raftLog.committed {
1748+
// TODO(pav-kv): construct logSlice up the stack next to receiving the
1749+
// message, and validate it before taking any action (e.g. bumping term).
1750+
a := logSlice{term: m.Term, prev: entryID{term: m.LogTerm, index: m.Index}, entries: m.Entries}
1751+
1752+
if a.prev.index < r.raftLog.committed {
17501753
r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: r.raftLog.committed})
17511754
return
17521755
}
1753-
if mlastIndex, ok := r.raftLog.maybeAppend(prev, m.Commit, m.Entries...); ok {
1756+
if mlastIndex, ok := r.raftLog.maybeAppend(a, m.Commit); ok {
17541757
r.send(pb.Message{To: m.From, Type: pb.MsgAppResp, Index: mlastIndex})
17551758
return
17561759
}

0 commit comments

Comments
 (0)