commit
451cce4a90
|
@ -40,6 +40,10 @@ type KV interface {
|
||||||
|
|
||||||
Compact(rev int64) error
|
Compact(rev int64) error
|
||||||
|
|
||||||
|
// Get the hash of KV state.
|
||||||
|
// This method is designed for consistency checking purpose.
|
||||||
|
Hash() (uint32, error)
|
||||||
|
|
||||||
// Write a snapshot to the given io writer
|
// Write a snapshot to the given io writer
|
||||||
Snapshot(w io.Writer) (int64, error)
|
Snapshot(w io.Writer) (int64, error)
|
||||||
|
|
||||||
|
|
|
@ -608,6 +608,28 @@ func TestKVCompactBad(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestKVHash(t *testing.T) {
|
||||||
|
hashes := make([]uint32, 3)
|
||||||
|
|
||||||
|
for i := 0; i < len(hashes); i++ {
|
||||||
|
var err error
|
||||||
|
kv := New(tmpPath)
|
||||||
|
kv.Put([]byte("foo0"), []byte("bar0"))
|
||||||
|
kv.Put([]byte("foo1"), []byte("bar0"))
|
||||||
|
hashes[i], err = kv.Hash()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("failed to get hash: %v", err)
|
||||||
|
}
|
||||||
|
cleanup(kv, tmpPath)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i := 1; i < len(hashes); i++ {
|
||||||
|
if hashes[i-1] != hashes[i] {
|
||||||
|
t.Errorf("hash[%d](%d) != hash[%d](%d)", i-1, hashes[i-1], i, hashes[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestKVRestore(t *testing.T) {
|
func TestKVRestore(t *testing.T) {
|
||||||
tests := []func(kv KV){
|
tests := []func(kv KV){
|
||||||
func(kv KV) {
|
func(kv KV) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ package storage
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
|
"hash/crc32"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"math"
|
"math"
|
||||||
|
@ -203,6 +204,15 @@ func (s *store) Compact(rev int64) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *store) Hash() (uint32, error) {
|
||||||
|
h := crc32.New(crc32.MakeTable(crc32.Castagnoli))
|
||||||
|
_, err := s.Snapshot(h)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
return h.Sum32(), nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *store) Snapshot(w io.Writer) (int64, error) {
|
func (s *store) Snapshot(w io.Writer) (int64, error) {
|
||||||
s.b.ForceCommit()
|
s.b.ForceCommit()
|
||||||
return s.b.Snapshot(w)
|
return s.b.Snapshot(w)
|
||||||
|
|
Loading…
Reference in New Issue