@@ -16,17 +16,23 @@ package server
1616
1717import (
1818 "context"
19+ "io"
1920 "net/http"
21+ "time"
2022
2123 "google.golang.org/grpc"
2224
25+ "github.com/pingcap/errors"
2326 "github.com/pingcap/kvproto/pkg/pdpb"
2427 "github.com/pingcap/kvproto/pkg/routerpb"
2528 "github.com/pingcap/log"
2629
2730 bs "github.com/tikv/pd/pkg/basicserver"
31+ "github.com/tikv/pd/pkg/errs"
2832 "github.com/tikv/pd/pkg/mcs/registry"
2933 "github.com/tikv/pd/pkg/utils/apiutil"
34+ "github.com/tikv/pd/pkg/utils/grpcutil"
35+ "github.com/tikv/pd/pkg/utils/keypath"
3036)
3137
3238// SetUpRestHandler is a hook to sets up the REST service.
@@ -73,41 +79,88 @@ func (s *Service) RegisterRESTHandler(userDefineHandlers map[string]http.Handler
7379}
7480
7581// BatchScanRegions implements the BatchScanRegions RPC method.
76- func (* Service ) BatchScanRegions (context.Context , * pdpb.BatchScanRegionsRequest ) (* pdpb.BatchScanRegionsResponse , error ) {
77- return & pdpb.BatchScanRegionsResponse {}, nil
82+ func (s * Service ) BatchScanRegions (_ctx context.Context , request * pdpb.BatchScanRegionsRequest ) (* pdpb.BatchScanRegionsResponse , error ) {
83+ resp , err := grpcutil .BatchScanRegions (s .GetBasicCluster (), request , false )
84+ grpcutil .RequestCounter ("BatchScanRegions" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
85+ return resp , err
7886}
7987
8088// ScanRegions implements the ScanRegions RPC method.
81- func (* Service ) ScanRegions (context.Context , * pdpb.ScanRegionsRequest ) (* pdpb.ScanRegionsResponse , error ) {
82- return & pdpb.ScanRegionsResponse {}, nil
89+ func (s * Service ) ScanRegions (_ctx context.Context , request * pdpb.ScanRegionsRequest ) (* pdpb.ScanRegionsResponse , error ) {
90+ resp , err := grpcutil .ScanRegions (s .GetBasicCluster (), request , false )
91+ grpcutil .RequestCounter ("ScanRegions" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
92+ return resp , err
8393}
8494
8595// GetRegion implements the GetRegion RPC method.
86- func (* Service ) GetRegion (context.Context , * pdpb.GetRegionRequest ) (* pdpb.GetRegionResponse , error ) {
87- return & pdpb.GetRegionResponse {}, nil
96+ func (s * Service ) GetRegion (_ctx context.Context , request * pdpb.GetRegionRequest ) (* pdpb.GetRegionResponse , error ) {
97+ resp , err := grpcutil .GetRegion (s .GetBasicCluster (), request , false )
98+ grpcutil .RequestCounter ("GetRegion" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
99+ return resp , err
88100}
89101
90102// GetAllStores implements the GetAllStores RPC method.
91- func (* Service ) GetAllStores (context.Context , * pdpb.GetAllStoresRequest ) (* pdpb.GetAllStoresResponse , error ) {
92- return & pdpb.GetAllStoresResponse {}, nil
103+ func (s * Service ) GetAllStores (_ctx context.Context , request * pdpb.GetAllStoresRequest ) (* pdpb.GetAllStoresResponse , error ) {
104+ resp , err := grpcutil .GetAllStores (s .GetBasicCluster (), request )
105+ grpcutil .RequestCounter ("GetAllStores" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
106+ return resp , err
93107}
94108
95109// GetStore implements the GetStore RPC method.
96- func (* Service ) GetStore (context.Context , * pdpb.GetStoreRequest ) (* pdpb.GetStoreResponse , error ) {
97- return & pdpb.GetStoreResponse {}, nil
110+ func (s * Service ) GetStore (_ctx context.Context , request * pdpb.GetStoreRequest ) (* pdpb.GetStoreResponse , error ) {
111+ resp , err := grpcutil .GetStore (s .GetBasicCluster (), request )
112+ grpcutil .RequestCounter ("GetStore" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
113+ return resp , err
98114}
99115
100116// GetPrevRegion implements the GetPrevRegion RPC method.
101- func (* Service ) GetPrevRegion (context.Context , * pdpb.GetRegionRequest ) (* pdpb.GetRegionResponse , error ) {
102- return & pdpb.GetRegionResponse {}, nil
117+ func (s * Service ) GetPrevRegion (_ctx context.Context , request * pdpb.GetRegionRequest ) (* pdpb.GetRegionResponse , error ) {
118+ resp , err := grpcutil .GetPrevRegion (s .GetBasicCluster (), request , false )
119+ grpcutil .RequestCounter ("GetPrevRegion" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
120+ return resp , err
103121}
104122
105123// GetRegionByID implements the GetRegionByID RPC method.
106- func (* Service ) GetRegionByID (context.Context , * pdpb.GetRegionByIDRequest ) (* pdpb.GetRegionResponse , error ) {
107- return & pdpb.GetRegionResponse {}, nil
124+ func (s * Service ) GetRegionByID (_ctx context.Context , request * pdpb.GetRegionByIDRequest ) (* pdpb.GetRegionResponse , error ) {
125+ resp , err := grpcutil .GetRegionByID (s .GetBasicCluster (), request , false )
126+ grpcutil .RequestCounter ("GetRegionByID" , request .GetHeader (), resp .GetHeader ().GetError (), regionRequestCounter )
127+ return resp , err
108128}
109129
110130// QueryRegion implements the QueryRegion RPC method.
111- func (* Service ) QueryRegion (routerpb.Router_QueryRegionServer ) error {
112- return nil
131+ func (s * Service ) QueryRegion (stream routerpb.Router_QueryRegionServer ) error {
132+ for {
133+ request , err := stream .Recv ()
134+ if err == io .EOF {
135+ return nil
136+ }
137+ if err != nil {
138+ return errors .WithStack (err )
139+ }
140+ if clusterID := keypath .ClusterID (); request .GetHeader ().GetClusterId () != clusterID {
141+ return errs .ErrMismatchClusterID (clusterID , request .GetHeader ().GetClusterId ())
142+ }
143+
144+ cluster := s .GetBasicCluster ()
145+ start := time .Now ()
146+ needBuckets := request .GetNeedBuckets ()
147+ keyIDMap , prevKeyIDMap , regionsByID := cluster .QueryRegions (
148+ request .GetKeys (),
149+ request .GetPrevKeys (),
150+ request .GetIds (),
151+ needBuckets ,
152+ )
153+ queryRegionDuration .Observe (time .Since (start ).Seconds ())
154+ // Build the response and send it to the client.
155+ response := & pdpb.QueryRegionResponse {
156+ Header : grpcutil .WrapHeader (),
157+ KeyIdMap : keyIDMap ,
158+ PrevKeyIdMap : prevKeyIDMap ,
159+ RegionsById : regionsByID ,
160+ }
161+ grpcutil .RequestCounter ("QueryRegion" , request .Header , response .Header .Error , regionRequestCounter )
162+ if err := stream .Send (response ); err != nil {
163+ return errors .WithStack (err )
164+ }
165+ }
113166}
0 commit comments