From 3de35e3ac838ee0920d71ece220929dee645d3e8 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 14 Aug 2023 16:31:44 +0200 Subject: [PATCH] Use RFC 3339 dates in worker endpoint --- src/server/web/api/worker.rs | 8 ++++++-- src/server/web/pages/worker.rs | 2 +- src/server/workers.rs | 6 +++--- src/shared.rs | 37 +++++++++++++++++++++++++++++----- 4 files changed, 42 insertions(+), 11 deletions(-) diff --git a/src/server/web/api/worker.rs b/src/server/web/api/worker.rs index 64cfcd6..0b48f62 100644 --- a/src/server/web/api/worker.rs +++ b/src/server/web/api/worker.rs @@ -40,7 +40,11 @@ async fn save_work( let mut tx = db.begin().await?; let conn = tx.acquire().await?; - let end = finished.end.unwrap_or_else(OffsetDateTime::now_utc); + let end = finished + .end + .map(|t| t.0) + .unwrap_or_else(OffsetDateTime::now_utc); + let bench_method = match finished.run.bench_method { BenchMethod::Internal => "internal".to_string(), BenchMethod::Repo { hash } => format!("bench repo, hash {hash}"), @@ -65,7 +69,7 @@ async fn save_work( bench_method, worker_name, worker_info, - finished.run.start, + finished.run.start.0, end, finished.exit_code, ) diff --git a/src/server/web/pages/worker.rs b/src/server/web/pages/worker.rs index 276d907..04f6751 100644 --- a/src/server/web/pages/worker.rs +++ b/src/server/web/pages/worker.rs @@ -57,7 +57,7 @@ async fn status(status: &WorkerStatus, db: &SqlitePool, base: &Base) -> somehow: &unfinished.run.hash, &message, ), - since: util::format_time(unfinished.run.start), + since: util::format_time(unfinished.run.start.0), } } }) diff --git a/src/server/workers.rs b/src/server/workers.rs index 73f3187..3ee7094 100644 --- a/src/server/workers.rs +++ b/src/server/workers.rs @@ -5,7 +5,7 @@ use time::OffsetDateTime; use crate::{ config::Config, id, - shared::{BenchMethod, Run, UnfinishedRun, WorkerStatus}, + shared::{BenchMethod, Rfc3339Time, Run, UnfinishedRun, WorkerStatus}, }; #[derive(Clone)] @@ -78,7 +78,7 @@ impl Workers { id, hash, bench_method, - start: OffsetDateTime::now_utc(), + start: Rfc3339Time(OffsetDateTime::now_utc()), }; // Reserve work so other workers don't choose it @@ -112,7 +112,7 @@ impl Workers { } _ => None, }) - .max_by_key(|(_, start)| *start) + .max_by_key(|(_, start)| start.0) .map(|(name, _)| name as &str); if oldest_working_on_commit != Some(name) { return true; diff --git a/src/shared.rs b/src/shared.rs index ff52c6e..ed4086f 100644 --- a/src/shared.rs +++ b/src/shared.rs @@ -2,14 +2,38 @@ use std::collections::HashMap; -use serde::{Deserialize, Serialize}; +use serde::{de, Deserialize, Serialize}; use serde_repr::{Deserialize_repr, Serialize_repr}; -use time::OffsetDateTime; +use time::{format_description::well_known::Rfc3339, OffsetDateTime}; fn is_false(b: &bool) -> bool { !b } +#[derive(Clone, Copy)] +pub struct Rfc3339Time(pub OffsetDateTime); + +impl serde::Serialize for Rfc3339Time { + fn serialize(&self, serializer: S) -> Result + where + S: serde::Serializer, + { + self.0.format(&Rfc3339).unwrap().serialize(serializer) + } +} + +impl<'de> serde::Deserialize<'de> for Rfc3339Time { + fn deserialize(deserializer: D) -> Result + where + D: serde::Deserializer<'de>, + { + let input: &str = serde::Deserialize::deserialize(deserializer)?; + OffsetDateTime::parse(input, &Rfc3339) + .map_err(de::Error::custom) + .map(Self) + } +} + #[derive(Clone, Serialize_repr, Deserialize_repr, sqlx::Type)] #[repr(u8)] pub enum Source { @@ -29,10 +53,13 @@ pub enum Direction { #[derive(Clone, Serialize, Deserialize)] pub struct Measurement { pub value: f64, + #[serde(skip_serializing_if = "Option::is_none")] pub stddev: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub unit: Option, + #[serde(skip_serializing_if = "Option::is_none")] pub direction: Option, } @@ -50,13 +77,14 @@ pub struct Run { pub id: String, pub hash: String, pub bench_method: BenchMethod, - pub start: OffsetDateTime, + pub start: Rfc3339Time, } #[derive(Clone, Serialize, Deserialize)] pub struct UnfinishedRun { #[serde(flatten)] pub run: Run, + #[serde(default)] pub last_output: Vec<(Source, String)>, } @@ -70,8 +98,7 @@ pub struct FinishedRun { /// /// Should not be used in normal operation, but can be used when importing /// completed runs from other sources. - #[serde(skip_serializing_if = "Option::is_none")] - pub end: Option, + pub end: Option, #[serde(default)] pub exit_code: i32,