Add Storage.Term() method and hide the first entry from other methods.
The first entry in the log is a dummy which is used for matchTerm but may not have an actual payload. This change permits Storage implementations to treat this term value specially instead of storing it as a dummy Entry. Storage.FirstIndex() no longer includes the term-only entry. This reverses a recent decision to create entry zero as initially unstable; Storage implementations are now required to make Term(0) == 0 and the first unstable entry is now index 1. stableTo(0) is no longer allowed.
This commit is contained in:
@ -840,9 +840,29 @@ func TestSnapshot(t *testing.T) {
|
||||
n := raft.StartNode(0xBAD0, mustMakePeerSlice(t, 0xBAD0), 10, 1, s)
|
||||
defer n.Stop()
|
||||
|
||||
// Save the initial state to storage so we have something to snapshot.
|
||||
// Progress the node to the point where it has something to snapshot.
|
||||
// TODO(bdarnell): this could be improved with changes in the raft internals.
|
||||
// First, we must apply the initial conf changes so we can have an election.
|
||||
rd := <-n.Ready()
|
||||
s.Append(rd.Entries)
|
||||
for _, e := range rd.CommittedEntries {
|
||||
if e.Type == raftpb.EntryConfChange {
|
||||
var cc raftpb.ConfChange
|
||||
err := cc.Unmarshal(e.Data)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
n.ApplyConfChange(cc)
|
||||
}
|
||||
}
|
||||
n.Advance()
|
||||
|
||||
// Now we can have an election and persist the rest of the log.
|
||||
// This causes HardState.Commit to advance. HardState.Commit must
|
||||
// be > 0 to snapshot.
|
||||
n.Campaign(context.Background())
|
||||
rd = <-n.Ready()
|
||||
s.Append(rd.Entries)
|
||||
n.Advance()
|
||||
|
||||
st := &storeRecorder{}
|
||||
@ -854,7 +874,7 @@ func TestSnapshot(t *testing.T) {
|
||||
raftStorage: s,
|
||||
}
|
||||
|
||||
srv.snapshot(0, []uint64{1})
|
||||
srv.snapshot(1, []uint64{1})
|
||||
gaction := st.Action()
|
||||
if len(gaction) != 1 {
|
||||
t.Fatalf("len(action) = %d, want 1", len(gaction))
|
||||
|
Reference in New Issue
Block a user