summaryrefslogtreecommitdiffstats
path: root/src/remake
diff options
context:
space:
mode:
authortv <tv@krebsco.de>2026-10-25 13:39:44 +0100
committertv <tv@krebsco.de>2026-10-25 13:39:44 +0100
commit714debc94b0ef2b543949241f1eb04ae5738ad0c (patch)
tree975232c77d5e7be54853555afafc4ed3ab1c8d11 /src/remake
parentf52ae6973299fa3c1d81758838951e39904e1d84 (diff)
add force module usable by API and CLI
Diffstat (limited to 'src/remake')
-rw-r--r--src/remake/api.rs47
1 files changed, 7 insertions, 40 deletions
diff --git a/src/remake/api.rs b/src/remake/api.rs
index 3530423..6b1a30c 100644
--- a/src/remake/api.rs
+++ b/src/remake/api.rs
@@ -73,6 +73,7 @@ use super::records::{
};
use super::{Host, kind, vote};
use crate::document::store::StoreError;
+use crate::force::Force;
#[derive(Debug, Default, Deserialize)]
pub(crate) struct WaitQuery {
@@ -85,7 +86,7 @@ pub(crate) struct WaitQuery {
pub(crate) struct StartQuery {
#[serde(default)]
wait: bool,
- /// The checks to override (`Force`).
+ /// The checks to override (`force`).
force: Option<String>,
// Only for an import uploaded as `application/octet-stream`, which has no JSON
// body to carry them:
@@ -160,42 +161,8 @@ struct StartRequest {
switch_delay_secs: Option<u64>,
}
-/// The checks `?force=` overrides: `true` all of them, or a comma-separated list.
-#[derive(Debug, Default, Clone, Copy)]
-struct Force {
- switch_delay: bool,
- supersede: bool,
-}
-
-impl Force {
- fn parse(value: Option<&str>) -> Result<Self, String> {
- let mut force = Force::default();
- match value.map(str::trim) {
- None | Some("" | "false") => {}
- Some("true") => {
- force = Force {
- switch_delay: true,
- supersede: true,
- };
- }
- Some(list) => {
- for name in list.split(',').map(str::trim) {
- match name {
- "switchDelaySecs" => force.switch_delay = true,
- "supersede" => force.supersede = true,
- other => {
- return Err(format!(
- "unknown force {other:?}: use true, or a list of \
- switchDelaySecs and supersede"
- ));
- }
- }
- }
- }
- }
- Ok(force)
- }
-}
+/// What `?force=` may override on a proposal (`force`).
+const FORCE: &[&str] = &["switchDelaySecs", "supersede"];
/// An expired remake of the epoch a proposal would supersede.
#[derive(Debug)]
@@ -333,7 +300,7 @@ async fn start_kind<H: Host>(
if !host.is_node_ready().await {
return error_response(StatusCode::SERVICE_UNAVAILABLE, "node is not ready", None);
}
- let force = match Force::parse(query.force.as_deref()) {
+ let force = match Force::parse(query.force.as_deref(), FORCE) {
Ok(force) => force,
Err(reason) => return error_response(StatusCode::BAD_REQUEST, reason, None),
};
@@ -436,7 +403,7 @@ async fn start_kind<H: Host>(
let keepalive = dormant_after / 4;
let switch_delay = request.switch_delay_secs.map(Duration::from_secs);
match switch_delay {
- Some(delay) if delay < keepalive && force.switch_delay => {
+ Some(delay) if delay < keepalive && force.allows("switchDelaySecs") => {
warn!(
switch_delay_secs = delay.as_secs(),
keepalive_secs = keepalive.as_secs(),
@@ -502,7 +469,7 @@ async fn start_kind<H: Host>(
id.clone(),
proposal,
base,
- force.supersede,
+ force.allows("supersede"),
now,
grace,
));