1111//!
1212//! We're storing the consensus data in a subspace at `/mz/consensus`. Each key maps to a subspace
1313//! with the following structure:
14- //! ./seqno/<key> -> <seqno>
15- //! ./data/<key>/<seqno> -> <data>
14+ //! * ` ./seqno/<key> -> <seqno>`
15+ //! * ` ./data/<key>/<seqno> -> <data>`
1616
1717use std:: io:: Write ;
1818use std:: sync:: OnceLock ;
@@ -304,24 +304,27 @@ impl FdbConsensus {
304304 trx. set ( & data_seqno_key, & pack ( & new. data . as_ref ( ) ) ) ;
305305 Ok ( CaSResult :: Committed )
306306 }
307+
307308 async fn scan_trx (
308309 & self ,
309310 trx : & Transaction ,
310311 data_key : & Subspace ,
311312 from : & SeqNo ,
312313 limit : & usize ,
313- ) -> Result < Vec < VersionedData > , FdbTransactError > {
314+ entries : & mut Vec < VersionedData > ,
315+ ) -> Result < ( ) , FdbTransactError > {
314316 let mut limit = * limit;
315317 let seqno_start = data_key. pack ( & from) ;
316318 let seqno_end = data_key. pack ( & SeqNo :: maximum ( ) ) ;
317319
318320 let mut range = RangeOption :: from ( seqno_start..=seqno_end) ;
319321 range. limit = Some ( limit) ;
320322
321- let mut entries = Vec :: new ( ) ;
323+ entries. clear ( ) ;
322324
323325 loop {
324326 let output = trx. get_range ( & range, 1 , false ) . await ?;
327+ entries. reserve ( output. len ( ) ) ;
325328 for key_value in & output {
326329 let seqno = data_key. unpack ( key_value. key ( ) ) ?;
327330 let value: Vec < u8 > = unpack ( key_value. value ( ) ) ?;
@@ -342,9 +345,7 @@ impl FdbConsensus {
342345 break ;
343346 }
344347 }
345-
346- entries. sort_by_key ( |e| e. seqno ) ;
347- Ok ( entries)
348+ Ok ( ( ) )
348349 }
349350 async fn truncate_trx (
350351 & self ,
@@ -462,15 +463,19 @@ impl Consensus for FdbConsensus {
462463 limit : usize ,
463464 ) -> Result < Vec < VersionedData > , ExternalError > {
464465 let data_key = self . data . subspace ( & key) ;
465- let ok = self
466- . db
466+ let mut entries = Vec :: new ( ) ;
467+ self . db
467468 . transact_boxed (
468- ( & data_key, from, limit) ,
469- |trx, ( data_key, from, limit) | self . scan_trx ( trx, data_key, from, limit) . boxed ( ) ,
469+ ( & data_key, from, limit, & mut entries) ,
470+ |trx, ( data_key, from, limit, entries) | {
471+ self . scan_trx ( trx, data_key, from, limit, entries) . boxed ( )
472+ } ,
470473 TransactOption :: default ( ) ,
471474 )
472475 . await ?;
473- Ok ( ok)
476+
477+ entries. sort_by_key ( |e| e. seqno ) ;
478+ Ok ( entries)
474479 }
475480
476481 async fn truncate ( & self , key : & str , seqno : SeqNo ) -> Result < usize , ExternalError > {
0 commit comments