1
0
Fork 0

Add FullNeeded() to Snapshot store

It may be necessary to override the FullNeeded definition, so wrap it.
master
Philip O'Toole 10 months ago
parent c756b380a4
commit 31aef91d17

@ -107,6 +107,12 @@ func Test_SinkFullSnapshot(t *testing.T) {
t.Fatalf("Snapshot data does not match")
}
if fn, err := store.FullNeeded(); err != nil {
t.Fatalf("Failed to check if full snapshot needed: %v", err)
} else if fn {
t.Errorf("Expected full snapshot not to be needed, but it is")
}
// Write a second full snapshot, it should be installed without issue.
sink = NewSink(store, makeRaftMeta("snap-5678", 4, 3, 2))
if sink == nil {
@ -206,6 +212,17 @@ func Test_SinkCreateFullThenWALSnapshots(t *testing.T) {
if err := sink.Close(); err != nil {
t.Fatalf("Failed to close sink: %v", err)
}
if fn, err := store.FullNeeded(); err != nil {
t.Fatalf("Failed to check if full snapshot needed: %v", err)
} else if fn {
t.Errorf("Expected full snapshot not to be needed, but it is")
}
}
if fn, err := store.FullNeeded(); err != nil {
t.Fatalf("Failed to check if full snapshot needed: %v", err)
} else if !fn {
t.Errorf("Expected full snapshot to be needed, but it is not")
}
createSnapshot("snap-1234", 3, 2, 1, "testdata/db-and-wals/backup.db")
createSnapshot("snap-2345", 4, 3, 2, "testdata/db-and-wals/wal-00")

@ -151,6 +151,15 @@ func (s *Store) Open(id string) (*raft.SnapshotMeta, io.ReadCloser, error) {
return meta, fd, nil
}
// FullNeeded returns true if a full snapshot is needed.
func (s *Store) FullNeeded() (bool, error) {
snaps, err := s.getSnapshots()
if err != nil {
return false, err
}
return len(snaps) == 0, nil
}
// Stats returns stats about the Snapshot Store.
func (s *Store) Stats() (map[string]interface{}, error) {
snapshots, err := s.getSnapshots()

@ -94,6 +94,12 @@ func Test_StoreEmpty(t *testing.T) {
t.Errorf("Expected no snapshots, got %d", len(snaps))
}
if fn, err := store.FullNeeded(); err != nil {
t.Fatalf("Failed to check if full snapshot needed: %v", err)
} else if !fn {
t.Errorf("Expected full snapshot needed, but it is not")
}
_, _, err = store.Open("non-existent")
if err == nil {
t.Fatalf("Expected error opening non-existent snapshot, got nil")

@ -159,6 +159,9 @@ func ResetStats() {
type SnapshotStore interface {
raft.SnapshotStore
// FullNeeded returns true if a full snapshot is needed.
FullNeeded() (bool, error)
// Stats returns stats about the Snapshot Store.
Stats() (map[string]interface{}, error)
}
@ -1668,12 +1671,10 @@ func (s *Store) Database(leader bool) ([]byte, error) {
func (s *Store) Snapshot() (raft.FSMSnapshot, error) {
startT := time.Now()
currSnaps, err := s.snapshotStore.List()
fullNeeded, err := s.snapshotStore.FullNeeded()
if err != nil {
return nil, err
}
fullNeeded := len(currSnaps) == 0
fPLog := fullPretty(fullNeeded)
s.logger.Printf("initiating %s snapshot on node ID %s", fPLog, s.raftID)
defer func() {

Loading…
Cancel
Save