@@ -12,9 +12,9 @@ use crate::{
1212} ;
1313use derive_new:: new;
1414use fail:: fail_point;
15- use futures:: { prelude:: * , stream :: BoxStream } ;
15+ use futures:: prelude:: * ;
1616use slog:: Logger ;
17- use std:: { iter, ops :: RangeBounds , sync:: Arc , time:: Instant } ;
17+ use std:: { iter, sync:: Arc , time:: Instant } ;
1818use tikv_client_proto:: { kvrpcpb, pdpb:: Timestamp } ;
1919use tokio:: { sync:: RwLock , time:: Duration } ;
2020
@@ -344,7 +344,7 @@ impl<PdC: PdClient> Transaction<PdC> {
344344 limit : u32 ,
345345 ) -> Result < impl Iterator < Item = KvPair > > {
346346 debug ! ( self . logger, "invoking transactional scan request" ) ;
347- self . scan_inner ( range, limit, false ) . await
347+ self . scan_inner ( range, limit, false , false ) . await
348348 }
349349
350350 /// Create a new 'scan' request that only returns the keys.
@@ -381,17 +381,39 @@ impl<PdC: PdClient> Transaction<PdC> {
381381 ) -> Result < impl Iterator < Item = Key > > {
382382 debug ! ( self . logger, "invoking transactional scan_keys request" ) ;
383383 Ok ( self
384- . scan_inner ( range, limit, true )
384+ . scan_inner ( range, limit, true , false )
385385 . await ?
386386 . map ( KvPair :: into_key) )
387387 }
388388
389389 /// Create a 'scan_reverse' request.
390390 ///
391391 /// Similar to [`scan`](Transaction::scan), but scans in the reverse direction.
392- pub ( crate ) fn scan_reverse ( & self , _range : impl RangeBounds < Key > ) -> BoxStream < Result < KvPair > > {
392+ pub async fn scan_reverse (
393+ & mut self ,
394+ range : impl Into < BoundRange > ,
395+ limit : u32 ,
396+ ) -> Result < impl Iterator < Item = KvPair > > {
393397 debug ! ( self . logger, "invoking transactional scan_reverse request" ) ;
394- unimplemented ! ( )
398+ self . scan_inner ( range, limit, false , true ) . await
399+ }
400+
401+ /// Create a 'scan_keys_reverse' request.
402+ ///
403+ /// Similar to [`scan`](Transaction::scan_keys), but scans in the reverse direction.
404+ pub async fn scan_keys_reverse (
405+ & mut self ,
406+ range : impl Into < BoundRange > ,
407+ limit : u32 ,
408+ ) -> Result < impl Iterator < Item = Key > > {
409+ debug ! (
410+ self . logger,
411+ "invoking transactional scan_keys_reverse request"
412+ ) ;
413+ Ok ( self
414+ . scan_inner ( range, limit, true , true )
415+ . await ?
416+ . map ( KvPair :: into_key) )
395417 }
396418
397419 /// Sets the value associated with the given key.
@@ -680,6 +702,7 @@ impl<PdC: PdClient> Transaction<PdC> {
680702 range : impl Into < BoundRange > ,
681703 limit : u32 ,
682704 key_only : bool ,
705+ reverse : bool ,
683706 ) -> Result < impl Iterator < Item = KvPair > > {
684707 self . check_allow_operation ( ) . await ?;
685708 let timestamp = self . timestamp . clone ( ) ;
@@ -691,8 +714,10 @@ impl<PdC: PdClient> Transaction<PdC> {
691714 range. into ( ) ,
692715 limit,
693716 !key_only,
717+ reverse,
694718 move |new_range, new_limit| async move {
695- let request = new_scan_request ( new_range, timestamp, new_limit, key_only) ;
719+ let request =
720+ new_scan_request ( new_range, timestamp, new_limit, key_only, reverse) ;
696721 let plan = PlanBuilder :: new ( rpc, request)
697722 . resolve_lock ( retry_options. lock_backoff )
698723 . retry_multi_region ( retry_options. region_backoff )
0 commit comments