func (fs *FragmentStorage) CreateSnapshot(i uint64, cs *pb.ConfState, data []byte) (pb.Snapshot, error) { fs.Lock() defer fs.Unlock() snapshot := pb.Snapshot{} preSnapshot, err := fs.Snapshot() if err != nil { return snapshot, err } if i <= preSnapshot.Metadata.Index { return pb.Snapshot{}, ErrSnapOutOfDate } lastIndex, err := fs.LastIndex() if err != nil { return snapshot, err } if i > lastIndex { fmt.Errorf("snapshot %d is out of bound lastindex(%d)", i, lastIndex) } snapshot.Metadata.Index = i if en, err := fs.Entry(i); err != nil { return snapshot, err } else { snapshot.Metadata.Term = en.Term } if cs != nil { snapshot.Metadata.ConfState = *cs } snapshot.Data = data return snapshot, nil }