From 385e17583f7fa05940f99710e3915f6f6bbc51bc Mon Sep 17 00:00:00 2001 From: Xiang Li Date: Wed, 23 Sep 2015 11:01:27 -0700 Subject: [PATCH] storage: fix hash by iterating kv --- storage/backend/backend.go | 30 ++++++++++++++++++++++++++++++ storage/kvstore.go | 9 ++------- storage/kvstore_test.go | 1 + 3 files changed, 33 insertions(+), 7 deletions(-) diff --git a/storage/backend/backend.go b/storage/backend/backend.go index 0f68c1557..1ce9907af 100644 --- a/storage/backend/backend.go +++ b/storage/backend/backend.go @@ -15,6 +15,8 @@ package backend import ( + "fmt" + "hash/crc32" "io" "log" "time" @@ -25,6 +27,7 @@ import ( type Backend interface { BatchTx() BatchTx Snapshot(w io.Writer) (n int64, err error) + Hash() (uint32, error) ForceCommit() Close() error } @@ -84,6 +87,33 @@ func (b *backend) Snapshot(w io.Writer) (n int64, err error) { return n, err } +func (b *backend) Hash() (uint32, error) { + h := crc32.New(crc32.MakeTable(crc32.Castagnoli)) + + err := b.db.View(func(tx *bolt.Tx) error { + c := tx.Cursor() + for next, _ := c.First(); next != nil; next, _ = c.Next() { + b := tx.Bucket(next) + if b == nil { + return fmt.Errorf("cannot get hash of bucket %s", string(next)) + } + h.Write(next) + b.ForEach(func(k, v []byte) error { + h.Write(k) + h.Write(v) + return nil + }) + } + return nil + }) + + if err != nil { + return 0, err + } + + return h.Sum32(), nil +} + func (b *backend) run() { defer close(b.donec) diff --git a/storage/kvstore.go b/storage/kvstore.go index d9afdec9c..8e2a530d4 100644 --- a/storage/kvstore.go +++ b/storage/kvstore.go @@ -16,7 +16,6 @@ package storage import ( "errors" - "hash/crc32" "io" "log" "math" @@ -289,12 +288,8 @@ func (s *store) Compact(rev int64) error { } 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 + s.b.ForceCommit() + return s.b.Hash() } func (s *store) Snapshot(w io.Writer) (int64, error) { diff --git a/storage/kvstore_test.go b/storage/kvstore_test.go index 7116fff06..e74a5c2b8 100644 --- a/storage/kvstore_test.go +++ b/storage/kvstore_test.go @@ -722,6 +722,7 @@ type fakeBackend struct { } func (b *fakeBackend) BatchTx() backend.BatchTx { return b.tx } +func (b *fakeBackend) Hash() (uint32, error) { return 0, nil } func (b *fakeBackend) Snapshot(w io.Writer) (n int64, err error) { return 0, errors.New("unsupported") } func (b *fakeBackend) ForceCommit() {} func (b *fakeBackend) Close() error { return nil }