Skip to content

Commit ae8f418

Browse files
committed
Reuse batch result initialization helper
1 parent c717215 commit ae8f418

1 file changed

Lines changed: 20 additions & 14 deletions

File tree

src/runtime/multilayer_cache.rs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,12 @@ fn latency_percentile_us(
4747

4848
const 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+
5056
fn 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

Comments
 (0)