3636import java .net .URI ;
3737import java .nio .charset .StandardCharsets ;
3838import java .util .List ;
39+ import java .util .Optional ;
3940import java .util .concurrent .CompletableFuture ;
4041import java .util .concurrent .ConcurrentHashMap ;
4142import java .util .concurrent .ConcurrentMap ;
4950import org .slf4j .LoggerFactory ;
5051import org .tikv .common .TiConfiguration .KVMode ;
5152import org .tikv .common .codec .Codec .BytesCodec ;
53+ import org .tikv .common .codec .CodecDataInput ;
5254import org .tikv .common .codec .CodecDataOutput ;
5355import org .tikv .common .codec .KeyUtils ;
5456import org .tikv .common .exception .GrpcException ;
5557import org .tikv .common .exception .TiClientInternalException ;
5658import org .tikv .common .meta .TiTimestamp ;
5759import org .tikv .common .operation .NoopHandler ;
5860import org .tikv .common .operation .PDErrorHandler ;
59- import org .tikv .common .region .TiRegion ;
6061import org .tikv .common .util .BackOffFunction .BackOffFuncType ;
6162import org .tikv .common .util .BackOffer ;
6263import org .tikv .common .util .ChannelFactory ;
6364import org .tikv .common .util .ConcreteBackOffer ;
65+ import org .tikv .common .util .Pair ;
66+ import org .tikv .kvproto .Metapb ;
6467import org .tikv .kvproto .Metapb .Store ;
6568import org .tikv .kvproto .PDGrpc ;
6669import org .tikv .kvproto .PDGrpc .PDBlockingStub ;
@@ -145,7 +148,7 @@ public TiTimestamp getTimestamp(BackOffer backOffer) {
145148 *
146149 * @param region represents a region info
147150 */
148- void scatterRegion (TiRegion region , BackOffer backOffer ) {
151+ void scatterRegion (Metapb . Region region , BackOffer backOffer ) {
149152 Supplier <ScatterRegionRequest > request =
150153 () ->
151154 ScatterRegionRequest .newBuilder ().setHeader (header ).setRegionId (region .getId ()).build ();
@@ -169,7 +172,7 @@ void scatterRegion(TiRegion region, BackOffer backOffer) {
169172 *
170173 * @param region
171174 */
172- void waitScatterRegionFinish (TiRegion region , BackOffer backOffer ) {
175+ void waitScatterRegionFinish (Metapb . Region region , BackOffer backOffer ) {
173176 for (; ; ) {
174177 GetOperatorResponse resp = getOperator (region .getId ());
175178 if (resp != null ) {
@@ -222,7 +225,7 @@ private boolean isScatterRegionFinish(GetOperatorResponse resp) {
222225 }
223226
224227 @ Override
225- public TiRegion getRegionByKey (BackOffer backOffer , ByteString key ) {
228+ public Pair < Metapb . Region , Metapb . Peer > getRegionByKey (BackOffer backOffer , ByteString key ) {
226229 Histogram .Timer requestTimer = PD_GET_REGION_BY_KEY_REQUEST_LATENCY .startTimer ();
227230 try {
228231 if (conf .getKvMode () == KVMode .TXN ) {
@@ -240,37 +243,22 @@ public TiRegion getRegionByKey(BackOffer backOffer, ByteString key) {
240243
241244 GetRegionResponse resp =
242245 callWithRetry (backOffer , PDGrpc .getGetRegionMethod (), request , handler );
243- return new TiRegion (
244- resp .getRegion (),
245- resp .getLeader (),
246- null ,
247- conf .getIsolationLevel (),
248- conf .getCommandPriority (),
249- conf .getKvMode (),
250- conf .getReplicaSelector ());
246+ return new Pair <Metapb .Region , Metapb .Peer >(decodeRegion (resp .getRegion ()), resp .getLeader ());
251247 } finally {
252248 requestTimer .observeDuration ();
253249 }
254250 }
255251
256252 @ Override
257- public TiRegion getRegionByID (BackOffer backOffer , long id ) {
253+ public Pair < Metapb . Region , Metapb . Peer > getRegionByID (BackOffer backOffer , long id ) {
258254 Supplier <GetRegionByIDRequest > request =
259255 () -> GetRegionByIDRequest .newBuilder ().setHeader (header ).setRegionId (id ).build ();
260256 PDErrorHandler <GetRegionResponse > handler =
261257 new PDErrorHandler <>(getRegionResponseErrorExtractor , this );
262258
263259 GetRegionResponse resp =
264260 callWithRetry (backOffer , PDGrpc .getGetRegionByIDMethod (), request , handler );
265- // Instead of using default leader instance, explicitly set no leader to null
266- return new TiRegion (
267- resp .getRegion (),
268- resp .getLeader (),
269- null ,
270- conf .getIsolationLevel (),
271- conf .getCommandPriority (),
272- conf .getKvMode (),
273- conf .getReplicaSelector ());
261+ return new Pair <Metapb .Region , Metapb .Peer >(decodeRegion (resp .getRegion ()), resp .getLeader ());
274262 }
275263
276264 private Supplier <GetStoreRequest > buildGetStoreReq (long storeId ) {
@@ -569,12 +557,15 @@ private void initCluster() {
569557 .setDaemon (true )
570558 .build ()))
571559 .build ();
572- this .hostMapping = new HostMapping (this .etcdClient , conf .getNetworkMappingName ());
560+ this .hostMapping =
561+ Optional .ofNullable (getConf ().getHostMapping ())
562+ .orElseGet (() -> new DefaultHostMapping (this .etcdClient , conf .getNetworkMappingName ()));
573563 for (URI u : pdAddrs ) {
574564 resp = getMembers (u );
575565 if (resp != null ) {
576566 break ;
577567 }
568+ logger .info ("Could not get leader member with pd: " + u );
578569 }
579570 checkNotNull (resp , "Failed to init client for PD cluster." );
580571 long clusterId = resp .getHeader ().getClusterId ();
@@ -668,4 +659,29 @@ public String toString() {
668659 return "[leaderInfo: " + leaderInfo + "]" ;
669660 }
670661 }
662+
663+ private Metapb .Region decodeRegion (Metapb .Region region ) {
664+ final boolean isRawRegion = conf .getKvMode () == KVMode .RAW ;
665+ Metapb .Region .Builder builder =
666+ Metapb .Region .newBuilder ()
667+ .setId (region .getId ())
668+ .setRegionEpoch (region .getRegionEpoch ())
669+ .addAllPeers (region .getPeersList ());
670+
671+ if (region .getStartKey ().isEmpty () || isRawRegion ) {
672+ builder .setStartKey (region .getStartKey ());
673+ } else {
674+ byte [] decodedStartKey = BytesCodec .readBytes (new CodecDataInput (region .getStartKey ()));
675+ builder .setStartKey (ByteString .copyFrom (decodedStartKey ));
676+ }
677+
678+ if (region .getEndKey ().isEmpty () || isRawRegion ) {
679+ builder .setEndKey (region .getEndKey ());
680+ } else {
681+ byte [] decodedEndKey = BytesCodec .readBytes (new CodecDataInput (region .getEndKey ()));
682+ builder .setEndKey (ByteString .copyFrom (decodedEndKey ));
683+ }
684+
685+ return builder .build ();
686+ }
671687}
0 commit comments