Skip to content

Commit 5b5373f

Browse files
muirdmfacebook-github-bot
authored andcommitted
scmstore: add basic hit/miss counters for tree aux cache
Summary: This will show up as scmstore.tree.fetch.aux.cache.{hits,misses}. Reviewed By: MichaelCuevas Differential Revision: D68021625 fbshipit-source-id: f956db6daef193bac91155692a255e8a3629f228
1 parent ac84bf1 commit 5b5373f

File tree

4 files changed

+89
-76
lines changed

4 files changed

+89
-76
lines changed

eden/scm/lib/revisionstore/src/scmstore/tree.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,12 @@ impl TreeStore {
219219
.pending(wants_aux, false)
220220
.map(|(key, _attrs)| key.clone())
221221
.collect();
222+
223+
let (mut found, mut miss) = (0, 0);
222224
for key in pending.into_iter() {
223225
if let Some(entry) = tree_aux_store.get(&key.hgid)? {
226+
found += 1;
227+
224228
tracing::trace!(?key, ?entry, "found tree aux entry in cache");
225229
if cas_client.is_some() {
226230
tracing::trace!(target: "cas", ?key, ?entry, "found tree aux data");
@@ -233,8 +237,12 @@ impl TreeStore {
233237
aux_data: Some(entry),
234238
},
235239
);
240+
} else {
241+
miss += 1;
236242
}
237243
}
244+
state.metrics.aux.cache.hit(found);
245+
state.metrics.aux.cache.miss(miss);
238246
}
239247
}
240248

eden/scm/lib/revisionstore/src/scmstore/tree/fetch.rs

Lines changed: 74 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -240,90 +240,90 @@ impl FetchState {
240240
async_runtime::block_in_place(|| {
241241
block_on(async {
242242
cas_client.fetch(&digests, CasDigestType::Tree).await.for_each(|results| match results {
243-
Ok((stats, results)) => {
244-
reqs += 1;
245-
total_stats.add(&stats);
246-
for (digest, data) in results {
247-
let Some(mut keys) = digest_to_key.remove(&digest) else {
248-
tracing::error!("got CAS result for unrequested digest {:?}", digest);
249-
continue;
250-
};
251-
252-
match data {
253-
Err(err) => {
254-
tracing::error!(?err, ?keys, ?digest, "CAS fetch error");
255-
tracing::error!(target: "cas", ?err, ?keys, ?digest, "tree fetch error");
256-
error += keys.len();
257-
self.errors.multiple_keyed_error(keys, "CAS fetch error", err);
258-
}
259-
Ok(None) => {
260-
tracing::trace!(target: "cas", ?keys, ?digest, "tree not in cas");
261-
// miss
262-
}
263-
Ok(Some(data)) => match AugmentedTree::try_deserialize(&*data) {
264-
Ok(tree) => {
265-
keys_found_count += keys.len();
266-
tracing::trace!(target: "cas", ?keys, ?digest, "tree found in cas");
267-
268-
let lazy_tree = LazyTree::Cas(AugmentedTreeWithDigest {
269-
augmented_manifest_id: digest.hash,
270-
augmented_manifest_size: digest.size,
271-
augmented_tree: tree,
272-
});
273-
274-
if let Err(err) =
275-
cache_child_aux_data(
276-
&lazy_tree,
277-
aux_cache,
278-
tree_aux_store,
279-
// read_before_write=true - check presence in indexedlog before appending (to avoid duplicate entries on every CAS fetch)
280-
true,
281-
)
282-
{
283-
self.errors.multiple_keyed_error(keys, "cache child aux data failed", err);
284-
} else if !keys.is_empty() {
285-
let last = keys.pop().unwrap();
286-
for key in keys {
243+
Ok((stats, results)) => {
244+
reqs += 1;
245+
total_stats.add(&stats);
246+
for (digest, data) in results {
247+
let Some(mut keys) = digest_to_key.remove(&digest) else {
248+
tracing::error!("got CAS result for unrequested digest {:?}", digest);
249+
continue;
250+
};
251+
252+
match data {
253+
Err(err) => {
254+
tracing::error!(?err, ?keys, ?digest, "CAS fetch error");
255+
tracing::error!(target: "cas", ?err, ?keys, ?digest, "tree fetch error");
256+
error += keys.len();
257+
self.errors.multiple_keyed_error(keys, "CAS fetch error", err);
258+
}
259+
Ok(None) => {
260+
tracing::trace!(target: "cas", ?keys, ?digest, "tree not in cas");
261+
// miss
262+
}
263+
Ok(Some(data)) => match AugmentedTree::try_deserialize(&*data) {
264+
Ok(tree) => {
265+
keys_found_count += keys.len();
266+
tracing::trace!(target: "cas", ?keys, ?digest, "tree found in cas");
267+
268+
let lazy_tree = LazyTree::Cas(AugmentedTreeWithDigest {
269+
augmented_manifest_id: digest.hash,
270+
augmented_manifest_size: digest.size,
271+
augmented_tree: tree,
272+
});
273+
274+
if let Err(err) =
275+
cache_child_aux_data(
276+
&lazy_tree,
277+
aux_cache,
278+
tree_aux_store,
279+
// read_before_write=true - check presence in indexedlog before appending (to avoid duplicate entries on every CAS fetch)
280+
true,
281+
)
282+
{
283+
self.errors.multiple_keyed_error(keys, "cache child aux data failed", err);
284+
} else if !keys.is_empty() {
285+
let last = keys.pop().unwrap();
286+
for key in keys {
287+
self.common.found(
288+
key,
289+
StoreTree {
290+
content: Some(lazy_tree.clone()),
291+
parents: None,
292+
aux_data: None,
293+
},
294+
);
295+
}
296+
// no clones needed
287297
self.common.found(
288-
key,
298+
last,
289299
StoreTree {
290-
content: Some(lazy_tree.clone()),
300+
content: Some(lazy_tree),
291301
parents: None,
292302
aux_data: None,
293303
},
294304
);
295305
}
296-
// no clones needed
297-
self.common.found(
298-
last,
299-
StoreTree {
300-
content: Some(lazy_tree),
301-
parents: None,
302-
aux_data: None,
303-
},
304-
);
305306
}
306-
}
307-
Err(err) => {
308-
error += keys.len();
309-
tracing::error!(target: "cas", ?err, ?keys, ?digest, "error deserializing tree");
310-
self.errors.multiple_keyed_error(keys, "CAS tree deserialization failed", err);
311-
}
312-
},
307+
Err(err) => {
308+
error += keys.len();
309+
tracing::error!(target: "cas", ?err, ?keys, ?digest, "error deserializing tree");
310+
self.errors.multiple_keyed_error(keys, "CAS tree deserialization failed", err);
311+
}
312+
},
313+
}
313314
}
315+
future::ready(())
314316
}
315-
future::ready(())
316-
}
317-
Err(err) => {
318-
tracing::error!(?err, "overall CAS error");
319-
tracing::error!(target: "cas", ?err, "CAS error fetching trees");
320-
321-
// Don't propagate CAS error - we want to fall back to SLAPI.
322-
reqs += 1;
323-
error += 1;
324-
future::ready(())
325-
}
326-
}).await;
317+
Err(err) => {
318+
tracing::error!(?err, "overall CAS error");
319+
tracing::error!(target: "cas", ?err, "CAS error fetching trees");
320+
321+
// Don't propagate CAS error - we want to fall back to SLAPI.
322+
reqs += 1;
323+
error += 1;
324+
future::ready(())
325+
}
326+
}).await;
327327
})
328328
});
329329

eden/scm/lib/revisionstore/src/scmstore/tree/metrics.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ use crate::scmstore::metrics::FetchMetrics;
1313
use crate::scmstore::metrics::LocalAndCacheFetchMetrics;
1414

1515
static_local_cache_fetch_metrics!(INDEXEDLOG, "scmstore.tree.fetch.indexedlog");
16+
static_local_cache_fetch_metrics!(AUX, "scmstore.tree.fetch.aux");
1617
static_fetch_metrics!(EDENAPI, "scmstore.tree.fetch.edenapi");
1718
static_fetch_metrics!(CAS, "scmstore.tree.fetch.cas");
1819

@@ -21,13 +22,15 @@ static_cas_backend_metrics!(CAS_BACKEND, "scmstore.tree.fetch.cas");
2122
pub(crate) static TREE_STORE_FETCH_METRICS: TreeStoreFetchMetrics = TreeStoreFetchMetrics {
2223
indexedlog: &INDEXEDLOG,
2324
edenapi: &EDENAPI,
25+
aux: &AUX,
2426
cas: &CAS,
2527
cas_backend: &CAS_BACKEND,
2628
};
2729

2830
pub struct TreeStoreFetchMetrics {
2931
pub(crate) indexedlog: &'static LocalAndCacheFetchMetrics,
3032
pub(crate) edenapi: &'static FetchMetrics,
33+
pub(crate) aux: &'static LocalAndCacheFetchMetrics,
3134
pub(crate) cas: &'static FetchMetrics,
3235
pub(crate) cas_backend: &'static CasBackendMetrics,
3336
}

eden/scm/tests/test-scmstore-cas.t

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,11 @@ Empty shared caches.
8888
scmstore can fetch trees from CAS:
8989

9090
First fetch root tree to trigger fetching "dir" aux data:
91-
$ hg debugscmstore -r $A --mode tree "" >/dev/null
91+
$ hg debugscmstore -r $A --mode tree "" --config devel.print-metrics=scmstore.tree.fetch.aux >/dev/null
92+
scmstore.tree.fetch.aux.cache.misses: 1
9293

9394
Then fetch "dir" from CAS:
94-
$ hg debugscmstore -r $A --mode tree "dir"
95+
$ hg debugscmstore -r $A --mode tree "dir" --config devel.print-metrics=scmstore.tree.fetch.aux
9596
Successfully fetched tree: (
9697
Key {
9798
path: RepoPathBuf(
@@ -135,6 +136,7 @@ Then fetch "dir" from CAS:
135136
aux_data: None,
136137
},
137138
)
139+
scmstore.tree.fetch.aux.cache.hits: 1
138140

139141
Empty the caches
140142
$ setconfig remotefilelog.cachepath=$TESTTMP/cache4

0 commit comments

Comments
 (0)