diff --git a/server/etcdserver/txn/util.go b/server/etcdserver/txn/util.go index 7c4b58b46..ec75744dc 100644 --- a/server/etcdserver/txn/util.go +++ b/server/etcdserver/txn/util.go @@ -61,10 +61,10 @@ func WarnOfExpensiveReadOnlyTxnRequest(lg *zap.Logger, warningApplyDuration time if !isNil(txnResponse) { var resps []string for _, r := range txnResponse.Responses { - switch op := r.Response.(type) { + switch r.Response.(type) { case *pb.ResponseOp_ResponseRange: - if op.ResponseRange != nil { - resps = append(resps, fmt.Sprintf("range_response_count:%d", len(op.ResponseRange.Kvs))) + if op := r.GetResponseRange(); op != nil { + resps = append(resps, fmt.Sprintf("range_response_count:%d", len(op.GetKvs()))) } else { resps = append(resps, "range_response:nil") } diff --git a/server/etcdserver/txn/util_test.go b/server/etcdserver/txn/util_test.go index 205f35e16..1fc9eeac9 100644 --- a/server/etcdserver/txn/util_test.go +++ b/server/etcdserver/txn/util_test.go @@ -19,12 +19,19 @@ import ( "time" pb "go.etcd.io/etcd/api/v3/etcdserverpb" + "go.etcd.io/etcd/api/v3/mvccpb" + "go.uber.org/zap/zaptest" ) // TestWarnOfExpensiveReadOnlyTxnRequest verifies WarnOfExpensiveReadOnlyTxnRequest // never panic no matter what data the txnResponse contains. func TestWarnOfExpensiveReadOnlyTxnRequest(t *testing.T) { + kvs := []*mvccpb.KeyValue{ + &mvccpb.KeyValue{Key: []byte("k1"), Value: []byte("v1")}, + &mvccpb.KeyValue{Key: []byte("k2"), Value: []byte("v2")}, + } + testCases := []struct { name string txnResp *pb.TxnResponse @@ -35,7 +42,9 @@ func TestWarnOfExpensiveReadOnlyTxnRequest(t *testing.T) { Responses: []*pb.ResponseOp{ { Response: &pb.ResponseOp_ResponseRange{ - ResponseRange: &pb.RangeResponse{}, + ResponseRange: &pb.RangeResponse{ + Kvs: kvs, + }, }, }, { @@ -60,6 +69,13 @@ func TestWarnOfExpensiveReadOnlyTxnRequest(t *testing.T) { ResponseRange: nil, }, }, + { + Response: &pb.ResponseOp_ResponseRange{ + ResponseRange: &pb.RangeResponse{ + Kvs: kvs, + }, + }, + }, }, }, },