@@ -337,19 +337,33 @@ private List<KvPair> handleBatchGetResponse(
337337
338338 public List <KvPair > scan (
339339 BackOffer backOffer , ByteString startKey , long version , boolean keyOnly ) {
340+ return scan (backOffer , startKey , ByteString .EMPTY , version , keyOnly );
341+ }
342+
343+ public List <KvPair > scan (
344+ BackOffer backOffer , ByteString startKey , ByteString endKey , long version , boolean keyOnly ) {
340345 boolean forWrite = false ;
341346 while (true ) {
342347 Supplier <ScanRequest > request =
343- () ->
344- ScanRequest .newBuilder ()
345- .setContext (
346- makeContext (
347- getResolvedLocks (version ), this .storeType , backOffer .getSlowLog ()))
348- .setStartKey (codec .encodeKey (startKey ))
349- .setVersion (version )
350- .setKeyOnly (keyOnly )
351- .setLimit (getConf ().getScanBatchSize ())
352- .build ();
348+ () -> {
349+ ScanRequest .Builder b =
350+ ScanRequest .newBuilder ()
351+ .setContext (
352+ makeContext (
353+ getResolvedLocks (version ), this .storeType , backOffer .getSlowLog ()))
354+ .setVersion (version )
355+ .setKeyOnly (keyOnly )
356+ .setLimit (getConf ().getScanBatchSize ());
357+ // API version matters here: v2 transactional keys are keyspace-prefixed; encodeRange applies
358+ // that encoding to both bounds. v1 passes raw keys and only sets start on the RPC in this client path
359+ if (getConf ().getApiVersion ().isV2 ()) {
360+ Pair <ByteString , ByteString > range = codec .encodeRange (startKey , endKey );
361+ b .setStartKey (range .first ).setEndKey (range .second );
362+ } else {
363+ b .setStartKey (codec .encodeKey (startKey ));
364+ }
365+ return b .build ();
366+ };
353367
354368 KVErrorHandler <ScanResponse > handler =
355369 new KVErrorHandler <>(
@@ -367,7 +381,9 @@ public List<KvPair> scan(
367381 region = regionManager .getRegionByKey (startKey , backOffer );
368382
369383 if (handleScanResponse (backOffer , resp , version , forWrite )) {
370- return resp .getPairsList ();
384+ // Return logical user-space keys (same as batchGet) so scan iterators, prefix bounds, and
385+ // get() stay consistent in API v2; wire format includes the keyspace prefix.
386+ return codec .decodeKvPairs (resp .getPairsList ());
371387 }
372388 }
373389 }
0 commit comments