From d214e87aeee3bbb0838163d7c82082818cb0d6db Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 26 Nov 2014 23:35:06 -0800 Subject: [PATCH] raft: make unstable.entries immutable; copy the entries at bad path --- raft/log.go | 3 +-- raft/log_unstable.go | 25 +++++++++++++++---------- raft/storage.go | 4 ++-- 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/raft/log.go b/raft/log.go index 2b772271789..e6478f5f5df 100644 --- a/raft/log.go +++ b/raft/log.go @@ -123,8 +123,7 @@ func (l *raftLog) unstableEntries() []pb.Entry { if len(l.unstable.entries) == 0 { return nil } - // copy unstable entries to an empty slice - return append([]pb.Entry{}, l.unstable.entries...) + return l.unstable.entries } // nextEnts returns all the available entries for execution. diff --git a/raft/log_unstable.go b/raft/log_unstable.go index 1c50cddcae6..2a38bce18ab 100644 --- a/raft/log_unstable.go +++ b/raft/log_unstable.go @@ -98,18 +98,23 @@ func (u *unstable) restore(s pb.Snapshot) { u.snapshot = &s } -func (u *unstable) resetEntries(offset uint64) { - u.entries = nil - u.offset = offset -} - func (u *unstable) truncateAndAppend(after uint64, ents []pb.Entry) { - if after < u.offset { - // The log is being truncated to before our current unstable - // portion, so discard it and reset unstable. - u.resetEntries(after + 1) + switch { + case after < u.offset: + // The log is being truncated to before our current offset + // portion, so set the offset and replace the entries + u.offset = after + 1 + u.entries = ents + case after == u.offset+uint64(len(u.entries))-1: + // after is the last index in the u.entries + // directly append + u.entries = append(u.entries, ents...) + default: + // truncate to after and copy to u.entries + // then append + u.entries = append([]pb.Entry{}, u.slice(u.offset, after+1)...) + u.entries = append(u.entries, ents...) } - u.entries = append(u.slice(u.offset, after+1), ents...) } func (u *unstable) slice(lo uint64, hi uint64) []pb.Entry { diff --git a/raft/storage.go b/raft/storage.go index 7c61d599da2..80d5b727588 100644 --- a/raft/storage.go +++ b/raft/storage.go @@ -184,8 +184,8 @@ func (ms *MemoryStorage) Append(entries []pb.Entry) { if offset < 0 { return } - if uint64(len(ms.ents)) >= offset { - ms.ents = ms.ents[:offset] + if uint64(len(ms.ents)) > offset { + ms.ents = append([]pb.Entry{}, ms.ents[:offset]...) } ms.ents = append(ms.ents, entries...) }