Browse Source

raft: handled panic for Term due to IOB

Instead of raising panic, returning an error instead for better handling

#6215
sharat 9 năm trước cách đây
mục cha
commit
9b3b1f80dd
3 tập tin đã thay đổi với 5 bổ sung2 xóa
  1. 1 1
      raft/log.go
  2. 3 0
      raft/storage.go
  3. 1 1
      raft/storage_test.go

+ 1 - 1
raft/log.go

@@ -232,7 +232,7 @@ func (l *raftLog) term(i uint64) (uint64, error) {
 	if err == nil {
 		return t, nil
 	}
-	if err == ErrCompacted {
+	if err == ErrCompacted || err == ErrUnavailable {
 		return 0, err
 	}
 	panic(err) // TODO(bdarnell)

+ 3 - 0
raft/storage.go

@@ -130,6 +130,9 @@ func (ms *MemoryStorage) Term(i uint64) (uint64, error) {
 	if i < offset {
 		return 0, ErrCompacted
 	}
+	if int(i-offset) >= len(ms.ents) {
+		return 0, ErrUnavailable
+	}
 	return ms.ents[i-offset].Term, nil
 }
 

+ 1 - 1
raft/storage_test.go

@@ -35,7 +35,7 @@ func TestStorageTerm(t *testing.T) {
 		{3, nil, 3, false},
 		{4, nil, 4, false},
 		{5, nil, 5, false},
-		{6, nil, 0, true},
+		{6, ErrUnavailable, 0, false},
 	}
 
 	for i, tt := range tests {