From 0228d4eaad9d40c226064f9cd3d50021039c19de Mon Sep 17 00:00:00 2001 From: Mark Rousskov Date: Sat, 28 Oct 2023 21:38:08 -0400 Subject: [PATCH] Make result a field rather than Vec We only ever pass one element in this vec; this simplifies the API. --- src/agent/api.rs | 14 ++++++-------- src/results/db.rs | 38 ++++++++++++++++++-------------------- src/server/routes/agent.rs | 11 ++--------- 3 files changed, 26 insertions(+), 37 deletions(-) diff --git a/src/agent/api.rs b/src/agent/api.rs index bbb0f2e0..e420ff52 100644 --- a/src/agent/api.rs +++ b/src/agent/api.rs @@ -182,14 +182,12 @@ impl AgentApi { .build_request(Method::POST, "record-progress") .json(&json!({ "experiment-name": ex.name, - "results": [ - { - "crate": krate, - "toolchain": toolchain, - "result": result, - "log": base64::engine::general_purpose::STANDARD.encode(log), - }, - ], + "result": { + "crate": krate, + "toolchain": toolchain, + "result": result, + "log": base64::engine::general_purpose::STANDARD.encode(log), + }, "version": version })) .send()? diff --git a/src/results/db.rs b/src/results/db.rs index a303d43c..0c0f1d99 100644 --- a/src/results/db.rs +++ b/src/results/db.rs @@ -20,7 +20,7 @@ pub struct TaskResult { #[derive(Deserialize)] pub struct ProgressData { - pub results: Vec, + pub result: TaskResult, pub version: Option<(Crate, Crate)>, } @@ -83,25 +83,23 @@ impl<'a> DatabaseDB<'a> { data: &ProgressData, encoding_type: EncodingType, ) -> Fallible<()> { - for result in &data.results { - self.store_result( - ex, - &result.krate, - &result.toolchain, - &result.result, - &base64::engine::general_purpose::STANDARD - .decode(&result.log) - .with_context(|_| "invalid base64 log provided")?, - encoding_type, - )?; - - if let Some((old, new)) = &data.version { - self.update_crate_version(ex, old, new)?; - } - - self.mark_crate_as_completed(ex, &result.krate)?; + self.store_result( + ex, + &data.result.krate, + &data.result.toolchain, + &data.result.result, + &base64::engine::general_purpose::STANDARD + .decode(&data.result.log) + .with_context(|_| "invalid base64 log provided")?, + encoding_type, + )?; + + if let Some((old, new)) = &data.version { + self.update_crate_version(ex, old, new)?; } + self.mark_crate_as_completed(ex, &data.result.krate)?; + Ok(()) } @@ -465,12 +463,12 @@ mod tests { .store( &ex, &ProgressData { - results: vec![TaskResult { + result: TaskResult { krate: updated.clone(), toolchain: MAIN_TOOLCHAIN.clone(), result: TestResult::TestPass, log: base64::engine::general_purpose::STANDARD.encode("foo"), - }], + }, version: Some((krate.clone(), updated.clone())), }, EncodingType::Plain, diff --git a/src/server/routes/agent.rs b/src/server/routes/agent.rs index e820f033..60b46cd3 100644 --- a/src/server/routes/agent.rs +++ b/src/server/routes/agent.rs @@ -203,10 +203,7 @@ impl RecordProgressThread { crate::utils::report_failure(&e); } - metrics.record_completed_jobs( - &ex.name, - result.data.results.len() as u64, - ); + metrics.record_completed_jobs(&ex.name, 1); if let Err(e) = db.clear_stale_records() { // Not a hard failure. We can continue even if we failed @@ -301,11 +298,7 @@ fn endpoint_record_progress( data: Arc, _auth: AuthDetails, ) -> Fallible> { - match data - .record_progress_worker - .queue - .try_send(result) - { + match data.record_progress_worker.queue.try_send(result) { Ok(()) => Ok(ApiResponse::Success { result: true }.into_response()?), Err(crossbeam_channel::TrySendError::Full(_)) => { data.metrics.crater_bounced_record_progress.inc_by(1);