@@ -47,6 +47,12 @@ fn latency_percentile_us(
4747
4848const SMALL_BATCH_DEDUP_LIMIT : usize = 64 ;
4949
50+ fn empty_batch_results < T > ( len : usize ) -> Vec < Option < T > > {
51+ let mut results = Vec :: with_capacity ( len) ;
52+ results. resize_with ( len, || None ) ;
53+ results
54+ }
55+
5056fn coalesce_batch_keys ( keys : & [ CacheKey ] ) -> ( Vec < CacheKey > , Vec < ( usize , usize ) > ) {
5157 let mut unique_keys = Vec :: < CacheKey > :: new ( ) ;
5258 let mut requested_positions = Vec :: with_capacity ( keys. len ( ) ) ;
@@ -2382,7 +2388,7 @@ impl MultiLayerCache {
23822388 & self ,
23832389 keys : & [ CacheKey ] ,
23842390 ) -> Result < Vec < Option < std:: sync:: Arc < [ u8 ] > > > , CacheError > {
2385- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
2391+ let mut results = empty_batch_results ( keys. len ( ) ) ;
23862392 if keys. is_empty ( ) {
23872393 return Ok ( results) ;
23882394 }
@@ -2393,7 +2399,7 @@ impl MultiLayerCache {
23932399 self . emit_access_record ( CacheAccessRecordKind :: Get , key) ;
23942400 }
23952401
2396- let mut unique_values = ( 0 .. unique_keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
2402+ let mut unique_values = empty_batch_results ( unique_keys. len ( ) ) ;
23972403 let mut needs_exclusive = Vec :: < ( CacheKey , HitOutcome , usize ) > :: new ( ) ;
23982404 let mut pmem_refills = Vec :: < ( usize , CacheKey , Arc < [ u8 ] > , Instant ) > :: new ( ) ;
23992405 let mut ssd_candidates = Vec :: < ( usize , CacheKey , Instant ) > :: new ( ) ;
@@ -2599,7 +2605,7 @@ impl MultiLayerCache {
25992605 & self ,
26002606 keys : & [ CacheKey ] ,
26012607 ) -> Result < Vec < Option < CacheReadResult > > , CacheError > {
2602- let mut results = vec ! [ None ; keys. len( ) ] ;
2608+ let mut results = empty_batch_results ( keys. len ( ) ) ;
26032609 if keys. is_empty ( ) {
26042610 return Ok ( results) ;
26052611 }
@@ -2864,7 +2870,7 @@ impl MultiLayerCache {
28642870 self . emit_access_record ( CacheAccessRecordKind :: Get , key) ;
28652871 }
28662872
2867- let mut results = vec ! [ None ; keys. len( ) ] ;
2873+ let mut results = empty_batch_results ( keys. len ( ) ) ;
28682874 let mut ssd_candidates = Vec :: new ( ) ;
28692875 let mut needs_eviction_drain = false ;
28702876 // One clock read for the batch. `get` reads it once per call for the
@@ -3327,7 +3333,7 @@ impl MultiLayerCache {
33273333 & self ,
33283334 keys : & [ CacheKey ] ,
33293335 ) -> Result < Vec < Option < CachePinnedHandle > > , CacheError > {
3330- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
3336+ let mut results = empty_batch_results ( keys. len ( ) ) ;
33313337 if keys. is_empty ( ) {
33323338 return Ok ( results) ;
33333339 }
@@ -3460,7 +3466,7 @@ impl MultiLayerCache {
34603466 & self ,
34613467 keys : & [ CacheKey ] ,
34623468 ) -> Result < Vec < Option < CachePinnedHandle > > , CacheError > {
3463- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
3469+ let mut results = empty_batch_results ( keys. len ( ) ) ;
34643470 if keys. is_empty ( ) {
34653471 return Ok ( results) ;
34663472 }
@@ -6267,7 +6273,7 @@ impl ShardedMultiLayerCache {
62676273 for ( position, key) in keys. iter ( ) . cloned ( ) . enumerate ( ) {
62686274 grouped[ self . shard_index_for_key ( & key) ] . push ( ( position, key) ) ;
62696275 }
6270- let mut results = vec ! [ None ; keys. len( ) ] ;
6276+ let mut results = empty_batch_results ( keys. len ( ) ) ;
62716277 for ( index, group) in grouped. into_iter ( ) . enumerate ( ) {
62726278 if group. is_empty ( ) {
62736279 continue ;
@@ -6350,7 +6356,7 @@ impl ShardedMultiLayerCache {
63506356 Ok ( merged)
63516357 } ) ?;
63526358
6353- let mut results = vec ! [ None ; keys. len( ) ] ;
6359+ let mut results = empty_batch_results ( keys. len ( ) ) ;
63546360 for ( position, value) in shard_results {
63556361 results[ position] = value;
63566362 }
@@ -6589,7 +6595,7 @@ impl ShardedMultiLayerCache {
65896595 }
65906596 let fanout = self . batch_shard_fanout ( keys) ;
65916597 self . sharded_stats . record_fanout ( fanout) ;
6592- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
6598+ let mut results = empty_batch_results ( keys. len ( ) ) ;
65936599 let mut groups = ( 0 ..self . shard_count ( ) )
65946600 . map ( |_| Vec :: < ( usize , CacheKey ) > :: new ( ) )
65956601 . collect :: < Vec < _ > > ( ) ;
@@ -6642,7 +6648,7 @@ impl ShardedMultiLayerCache {
66426648 & self ,
66436649 keys : & [ CacheKey ] ,
66446650 ) -> Result < Vec < Option < CachePinnedHandle > > , CacheError > {
6645- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
6651+ let mut results = empty_batch_results ( keys. len ( ) ) ;
66466652 let positions_by_key = coalesce_batch_positions ( keys) ;
66476653 for ( key, positions) in positions_by_key {
66486654 let Some ( handle) = self . acquire_no_promotion ( & key) ? else {
@@ -6681,7 +6687,7 @@ impl ShardedMultiLayerCache {
66816687 }
66826688 let fanout = self . batch_shard_fanout ( keys) ;
66836689 self . sharded_stats . record_fanout ( fanout) ;
6684- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
6690+ let mut results = empty_batch_results ( keys. len ( ) ) ;
66856691 let mut groups = ( 0 ..self . shard_count ( ) )
66866692 . map ( |_| Vec :: < ( usize , CacheKey ) > :: new ( ) )
66876693 . collect :: < Vec < _ > > ( ) ;
@@ -6734,7 +6740,7 @@ impl ShardedMultiLayerCache {
67346740 & self ,
67356741 keys : & [ CacheKey ] ,
67366742 ) -> Result < Vec < Option < CachePinnedHandle > > , CacheError > {
6737- let mut results = ( 0 .. keys. len ( ) ) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
6743+ let mut results = empty_batch_results ( keys. len ( ) ) ;
67386744 let positions_by_key = coalesce_batch_positions ( keys) ;
67396745 for ( key, positions) in positions_by_key {
67406746 let Some ( handle) = self . acquire ( & key) ? else {
@@ -6998,7 +7004,7 @@ impl ShardedMultiLayerCache {
69987004 groups[ self . shard_index_for_key ( & key) ] . push ( ( position, key, value, size) ) ;
69997005 }
70007006 if entry_count < Self :: BATCH_FANOUT_THRESHOLD {
7001- let mut results = ( 0 .. entry_count) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
7007+ let mut results = empty_batch_results ( entry_count) ;
70027008 for ( index, group) in groups. into_iter ( ) . enumerate ( ) {
70037009 for ( position, key, value, size) in group {
70047010 results[ position] = self . shards [ index] . insert_pinned_sized ( key, value, size) ?;
@@ -7043,7 +7049,7 @@ impl ShardedMultiLayerCache {
70437049 } ) ,
70447050 ) ?;
70457051
7046- let mut results = ( 0 .. entry_count) . map ( |_| None ) . collect :: < Vec < _ > > ( ) ;
7052+ let mut results = empty_batch_results ( entry_count) ;
70477053 for ( position, handle) in shard_results {
70487054 results[ position] = handle;
70497055 }
0 commit comments