Преглед изворни кода

Merge pull request #1820 from xiang90/fix_storage

raft: fix memory storage
Xiang Li пре 11 година
родитељ
комит
cb74b6812b
1 измењених фајлова са 19 додато и 5 уклоњено
  1. 19 5
      raft/storage.go

+ 19 - 5
raft/storage.go

@@ -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 {
+	// 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...)
 }