diff --git a/server/etcdserver/corrupt.go b/server/etcdserver/corrupt.go index 9833e9877..fe68a2965 100644 --- a/server/etcdserver/corrupt.go +++ b/server/etcdserver/corrupt.go @@ -93,18 +93,18 @@ func (cm *corruptionChecker) InitialCheck() error { zap.Duration("timeout", cm.hasher.ReqTimeout()), ) - h, rev, err := cm.hasher.HashByRev(0) + h, _, err := cm.hasher.HashByRev(0) if err != nil { return fmt.Errorf("%s failed to fetch hash (%v)", cm.hasher.MemberId(), err) } - peers := cm.hasher.PeerHashByRev(rev) + peers := cm.hasher.PeerHashByRev(h.Revision) mismatch := 0 for _, p := range peers { if p.resp != nil { peerID := types.ID(p.resp.Header.MemberId) fields := []zap.Field{ zap.String("local-member-id", cm.hasher.MemberId().String()), - zap.Int64("local-member-revision", rev), + zap.Int64("local-member-revision", h.Revision), zap.Int64("local-member-compact-revision", h.CompactRevision), zap.Uint32("local-member-hash", h.Hash), zap.String("remote-peer-id", peerID.String()), @@ -132,7 +132,7 @@ func (cm *corruptionChecker) InitialCheck() error { cm.lg.Warn( "cannot fetch hash from slow remote peer", zap.String("local-member-id", cm.hasher.MemberId().String()), - zap.Int64("local-member-revision", rev), + zap.Int64("local-member-revision", h.Revision), zap.Int64("local-member-compact-revision", h.CompactRevision), zap.Uint32("local-member-hash", h.Hash), zap.String("remote-peer-id", p.id.String()), @@ -143,7 +143,7 @@ func (cm *corruptionChecker) InitialCheck() error { cm.lg.Warn( "cannot fetch hash from remote peer; local member is behind", zap.String("local-member-id", cm.hasher.MemberId().String()), - zap.Int64("local-member-revision", rev), + zap.Int64("local-member-revision", h.Revision), zap.Int64("local-member-compact-revision", h.CompactRevision), zap.Uint32("local-member-hash", h.Hash), zap.String("remote-peer-id", p.id.String()), @@ -165,11 +165,11 @@ func (cm *corruptionChecker) InitialCheck() error { } func (cm *corruptionChecker) PeriodicCheck() error { - h, rev, err := cm.hasher.HashByRev(0) + h, _, err := cm.hasher.HashByRev(0) if err != nil { return err } - peers := cm.hasher.PeerHashByRev(rev) + peers := cm.hasher.PeerHashByRev(h.Revision) ctx, cancel := context.WithTimeout(context.Background(), cm.hasher.ReqTimeout()) err = cm.hasher.LinearizableReadNotify(ctx) @@ -192,13 +192,13 @@ func (cm *corruptionChecker) PeriodicCheck() error { cm.hasher.TriggerCorruptAlarm(id) } - if h2.Hash != h.Hash && rev2 == rev && h.CompactRevision == h2.CompactRevision { + if h2.Hash != h.Hash && h2.Revision == h.Revision && h.CompactRevision == h2.CompactRevision { cm.lg.Warn( "found hash mismatch", - zap.Int64("revision-1", rev), + zap.Int64("revision-1", h.Revision), zap.Int64("compact-revision-1", h.CompactRevision), zap.Uint32("hash-1", h.Hash), - zap.Int64("revision-2", rev2), + zap.Int64("revision-2", h2.Revision), zap.Int64("compact-revision-2", h2.CompactRevision), zap.Uint32("hash-2", h2.Hash), ) @@ -444,7 +444,11 @@ func (h *hashKVHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - resp := &pb.HashKVResponse{Header: &pb.ResponseHeader{Revision: rev}, Hash: hash.Hash, CompactRevision: hash.CompactRevision} + resp := &pb.HashKVResponse{ + Header: &pb.ResponseHeader{Revision: rev}, + Hash: hash.Hash, + CompactRevision: hash.CompactRevision, + } respBytes, err := json.Marshal(resp) if err != nil { h.lg.Warn("failed to marshal hashKV response", zap.Error(err)) diff --git a/server/etcdserver/corrupt_test.go b/server/etcdserver/corrupt_test.go index d62565035..93942051c 100644 --- a/server/etcdserver/corrupt_test.go +++ b/server/etcdserver/corrupt_test.go @@ -39,7 +39,7 @@ func TestInitialCheck(t *testing.T) { { name: "No peers", hasher: fakeHasher{ - hashByRevResponses: []hashByRev{{revision: 10}}, + hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Revision: 10}}}, }, expectActions: []string{"MemberId()", "ReqTimeout()", "HashByRev(0)", "PeerHashByRev(10)", "MemberId()"}, }, @@ -114,7 +114,7 @@ func TestPeriodicCheck(t *testing.T) { }{ { name: "Same local hash and no peers", - hasher: fakeHasher{hashByRevResponses: []hashByRev{{revision: 10}, {revision: 10}}}, + hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Revision: 10}}, {hash: mvcc.KeyValueHash{Revision: 10}}}}, expectActions: []string{"HashByRev(0)", "PeerHashByRev(10)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)"}, }, { @@ -125,7 +125,7 @@ func TestPeriodicCheck(t *testing.T) { }, { name: "Error getting hash second time", - hasher: fakeHasher{hashByRevResponses: []hashByRev{{revision: 11}, {err: fmt.Errorf("error getting hash")}}}, + hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Revision: 11}}, {err: fmt.Errorf("error getting hash")}}}, expectActions: []string{"HashByRev(0)", "PeerHashByRev(11)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)"}, expectError: true, }, @@ -137,7 +137,7 @@ func TestPeriodicCheck(t *testing.T) { }, { name: "Different local hash and revision", - hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2}, revision: 2}}}, + hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, Revision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2}, revision: 2}}}, expectActions: []string{"HashByRev(0)", "PeerHashByRev(1)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)"}, }, { @@ -147,7 +147,7 @@ func TestPeriodicCheck(t *testing.T) { }, { name: "Different local hash and same revisions", - hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 1}, revision: 1}}}, + hasher: fakeHasher{hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1, Revision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 1, Revision: 1}, revision: 1}}}, expectActions: []string{"HashByRev(0)", "PeerHashByRev(1)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)", "MemberId()", "TriggerCorruptAlarm(1)"}, expectCorrupt: true, }, @@ -177,7 +177,7 @@ func TestPeriodicCheck(t *testing.T) { { name: "Peer with same hash and compact revision", hasher: fakeHasher{ - hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 2}, revision: 2}}, + hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1, Revision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 2, Revision: 2}, revision: 2}}, peerHashes: []*peerHashKVResp{{resp: &pb.HashKVResponse{Header: &pb.ResponseHeader{Revision: 1}, CompactRevision: 1, Hash: 1}}}, }, expectActions: []string{"HashByRev(0)", "PeerHashByRev(1)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)"}, @@ -185,7 +185,7 @@ func TestPeriodicCheck(t *testing.T) { { name: "Peer with different hash and same compact revision as first local", hasher: fakeHasher{ - hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 2}, revision: 2}}, + hashByRevResponses: []hashByRev{{hash: mvcc.KeyValueHash{Hash: 1, CompactRevision: 1, Revision: 1}, revision: 1}, {hash: mvcc.KeyValueHash{Hash: 2, CompactRevision: 2}, revision: 2}}, peerHashes: []*peerHashKVResp{{peerInfo: peerInfo{id: 666}, resp: &pb.HashKVResponse{Header: &pb.ResponseHeader{Revision: 1}, CompactRevision: 1, Hash: 2}}}, }, expectActions: []string{"HashByRev(0)", "PeerHashByRev(1)", "ReqTimeout()", "LinearizableReadNotify()", "HashByRev(0)", "TriggerCorruptAlarm(666)"},