Merge pull request #5248 from gyuho/hash_with_revision

functional-tester: use revision from hash method
This commit is contained in:
Gyu-Ho Lee 2016-05-02 15:30:26 -07:00
commit fee71b18a3
4 changed files with 20 additions and 8 deletions

View File

@ -19,12 +19,17 @@ import (
"github.com/coreos/etcd/etcdserver" "github.com/coreos/etcd/etcdserver"
pb "github.com/coreos/etcd/etcdserver/etcdserverpb" pb "github.com/coreos/etcd/etcdserver/etcdserverpb"
"github.com/coreos/etcd/mvcc"
"github.com/coreos/etcd/mvcc/backend" "github.com/coreos/etcd/mvcc/backend"
"github.com/coreos/etcd/pkg/types" "github.com/coreos/etcd/pkg/types"
"github.com/coreos/etcd/version" "github.com/coreos/etcd/version"
"golang.org/x/net/context" "golang.org/x/net/context"
) )
type KVGetter interface {
KV() mvcc.ConsistentWatchableKV
}
type BackendGetter interface { type BackendGetter interface {
Backend() backend.Backend Backend() backend.Backend
} }
@ -41,13 +46,14 @@ type RaftStatusGetter interface {
type maintenanceServer struct { type maintenanceServer struct {
rg RaftStatusGetter rg RaftStatusGetter
kg KVGetter
bg BackendGetter bg BackendGetter
a Alarmer a Alarmer
hdr header hdr header
} }
func NewMaintenanceServer(s *etcdserver.EtcdServer) pb.MaintenanceServer { func NewMaintenanceServer(s *etcdserver.EtcdServer) pb.MaintenanceServer {
return &maintenanceServer{rg: s, bg: s, a: s, hdr: newHeader(s)} return &maintenanceServer{rg: s, kg: s, bg: s, a: s, hdr: newHeader(s)}
} }
func (ms *maintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRequest) (*pb.DefragmentResponse, error) { func (ms *maintenanceServer) Defragment(ctx context.Context, sr *pb.DefragmentRequest) (*pb.DefragmentResponse, error) {
@ -97,11 +103,11 @@ func (ms *maintenanceServer) Snapshot(sr *pb.SnapshotRequest, srv pb.Maintenance
} }
func (ms *maintenanceServer) Hash(ctx context.Context, r *pb.HashRequest) (*pb.HashResponse, error) { func (ms *maintenanceServer) Hash(ctx context.Context, r *pb.HashRequest) (*pb.HashResponse, error) {
h, err := ms.bg.Backend().Hash() h, rev, err := ms.kg.KV().Hash()
if err != nil { if err != nil {
return nil, togRPCError(err) return nil, togRPCError(err)
} }
resp := &pb.HashResponse{Header: &pb.ResponseHeader{Revision: ms.hdr.rev()}, Hash: h} resp := &pb.HashResponse{Header: &pb.ResponseHeader{Revision: rev}, Hash: h}
ms.hdr.fill(resp.Header) ms.hdr.fill(resp.Header)
return resp, nil return resp, nil
} }

View File

@ -70,9 +70,9 @@ type KV interface {
// Compact frees all superseded keys with revisions less than rev. // Compact frees all superseded keys with revisions less than rev.
Compact(rev int64) (<-chan struct{}, error) Compact(rev int64) (<-chan struct{}, error)
// Hash retrieves the hash of KV state. // Hash retrieves the hash of KV state and revision.
// This method is designed for consistency checking purpose. // This method is designed for consistency checking purpose.
Hash() (uint32, error) Hash() (hash uint32, revision int64, err error)
// Commit commits txns into the underlying backend. // Commit commits txns into the underlying backend.
Commit() Commit()

View File

@ -620,7 +620,7 @@ func TestKVHash(t *testing.T) {
kv := NewStore(b, &lease.FakeLessor{}, nil) kv := NewStore(b, &lease.FakeLessor{}, nil)
kv.Put([]byte("foo0"), []byte("bar0"), lease.NoLease) kv.Put([]byte("foo0"), []byte("bar0"), lease.NoLease)
kv.Put([]byte("foo1"), []byte("bar0"), lease.NoLease) kv.Put([]byte("foo1"), []byte("bar0"), lease.NoLease)
hashes[i], err = kv.Hash() hashes[i], _, err = kv.Hash()
if err != nil { if err != nil {
t.Fatalf("failed to get hash: %v", err) t.Fatalf("failed to get hash: %v", err)
} }

View File

@ -293,9 +293,15 @@ func (s *store) Compact(rev int64) (<-chan struct{}, error) {
return ch, nil return ch, nil
} }
func (s *store) Hash() (uint32, error) { func (s *store) Hash() (uint32, int64, error) {
s.b.ForceCommit() s.b.ForceCommit()
return s.b.Hash()
s.mu.Lock()
defer s.mu.Unlock()
h, err := s.b.Hash()
rev := s.currentRev.main
return h, rev, err
} }
func (s *store) Commit() { s.b.ForceCommit() } func (s *store) Commit() { s.b.ForceCommit() }