scmstore: track FileStore write errors

Summary:
Adds tracking of FileStore write errors.

Write batches will still abort after the first failure as written.

Reviewed By: DurhamG

Differential Revision: D29997203

fbshipit-source-id: e1cc2ffc4a8d97ca935a7fc9aab30bde3dc548b2
This commit is contained in:
Meyer Jacobs 2021-08-12 19:33:46 -07:00 committed by Facebook GitHub Bot
parent 34dfc6d1f7
commit d9a885a6df
2 changed files with 13 additions and 6 deletions

View File

@ -202,8 +202,6 @@ impl WriteMetrics {
self.ok += keys;
}
// TODO(meyer): Add write error tracking.
#[allow(dead_code)]
pub(crate) fn err(&mut self, keys: usize) {
self.err += keys;
}

View File

@ -245,13 +245,16 @@ impl FileStore {
#[instrument(skip(self, entries))]
pub fn write_batch(&self, entries: impl Iterator<Item = (Key, Bytes, Metadata)>) -> Result<()> {
// TODO(meyer): Track error metrics too and don't fail the whole batch for a single write error.
// TODO(meyer): Don't fail the whole batch for a single write error.
let mut metrics = FileStoreWriteMetrics::default();
let mut indexedlog_local = self.indexedlog_local.as_ref().map(|l| l.write_lock());
for (key, bytes, meta) in entries {
if meta.is_lfs() {
metrics.lfsptr.item(1);
self.write_lfsptr(&mut indexedlog_local, key, bytes, meta)?;
if let Err(e) = self.write_lfsptr(&mut indexedlog_local, key, bytes, meta) {
metrics.lfsptr.err(1);
return Err(e);
}
metrics.lfsptr.ok(1);
continue;
}
@ -262,11 +265,17 @@ impl FileStore {
.map_or(false, |threshold| hg_blob_len > threshold)
{
metrics.lfs.item(1);
self.write_lfs(key, bytes)?;
if let Err(e) = self.write_lfs(key, bytes) {
metrics.lfs.err(1);
return Err(e);
}
metrics.lfs.ok(1);
} else {
metrics.nonlfs.item(1);
self.write_nonlfs(&mut indexedlog_local, key, bytes, meta)?;
if let Err(e) = self.write_nonlfs(&mut indexedlog_local, key, bytes, meta) {
metrics.nonlfs.err(1);
return Err(e);
}
metrics.nonlfs.ok(1);
}
}