mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
raft: fix memory storage
Memory storage should append all entries that have greater index than the snap.Matedata.Index. We first truncate the old parts of incoming entries. Then truncate the existing entries in the storage. At last, we append the incoming entries to the existing entries.
This commit is contained in:
parent
19ccdbee18
commit
312db7f0f3
@ -179,13 +179,27 @@ func (ms *MemoryStorage) Append(entries []pb.Entry) {
|
||||
if len(entries) == 0 {
|
||||
return
|
||||
}
|
||||
offset := entries[0].Index - ms.snapshot.Metadata.Index
|
||||
// do not append out of date entries
|
||||
if offset < 0 {
|
||||
first := ms.snapshot.Metadata.Index + 1
|
||||
last := entries[0].Index + uint64(len(entries)) - 1
|
||||
|
||||
// shortcut if there is no new entry.
|
||||
if last < first {
|
||||
return
|
||||
}
|
||||
if uint64(len(ms.ents)) > offset {
|
||||
ms.ents = append([]pb.Entry{}, ms.ents[:offset]...)
|
||||
// truncate old entries
|
||||
if first > entries[0].Index {
|
||||
entries = entries[first-entries[0].Index:]
|
||||
}
|
||||
|
||||
offset := entries[0].Index - ms.snapshot.Metadata.Index
|
||||
switch {
|
||||
case uint64(len(ms.ents)) > offset:
|
||||
ms.ents = append([]pb.Entry{}, ms.ents[:offset]...)
|
||||
ms.ents = append(ms.ents, entries...)
|
||||
case uint64(len(ms.ents)) == offset:
|
||||
ms.ents = append(ms.ents, entries...)
|
||||
default:
|
||||
log.Panicf("missing log entry [last: %d, append at: %d]",
|
||||
ms.snapshot.Metadata.Index+uint64(len(ms.ents)), entries[0].Index)
|
||||
}
|
||||
ms.ents = append(ms.ents, entries...)
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user