diff --git a/crates/feldera-types/src/checkpoint.rs b/crates/feldera-types/src/checkpoint.rs index 3656247deeb..46bd2e1a006 100644 --- a/crates/feldera-types/src/checkpoint.rs +++ b/crates/feldera-types/src/checkpoint.rs @@ -119,6 +119,8 @@ pub struct CheckpointMetadata { /// An optional name for the checkpoint. pub identifier: Option, /// Fingerprint of the circuit at the time of the checkpoint. + // Uses the full 64-bit range. + #[schema(format = "uint64")] pub fingerprint: u64, /// Total size of the checkpoint files in bytes. pub size: Option, diff --git a/crates/rest-api/src/lib.rs b/crates/rest-api/src/lib.rs index 72c5f77dc09..37f471037de 100644 --- a/crates/rest-api/src/lib.rs +++ b/crates/rest-api/src/lib.rs @@ -3,3 +3,23 @@ use feldera_observability::ReqwestTracingExt; include!(concat!(env!("OUT_DIR"), "/codegen.rs")); + +#[cfg(test)] +mod tests { + use super::types::CheckpointMetadata; + + /// Reproduces issue #6841: `fda pipelines`/`fda status` failed to parse + /// any pipeline's checkpoint list once one checkpoint's fingerprint had + /// the high bit set, because the generated `fingerprint` field was `i64`. + /// `format: uint64` on that field (checkpoint.rs) makes progenitor/typify + /// generate `u64` instead, so this must deserialize without error. + #[test] + fn checkpoint_metadata_accepts_fingerprint_above_i64_max() { + let raw = r#"{ + "uuid": "00000000-0000-0000-0000-000000000000", + "fingerprint": 14128757731148314856 + }"#; + let metadata: CheckpointMetadata = serde_json::from_str(raw).unwrap(); + assert_eq!(metadata.fingerprint, 14128757731148314856); + } +} diff --git a/openapi.json b/openapi.json index bc1b04bac81..373df8055cc 100644 --- a/openapi.json +++ b/openapi.json @@ -8475,7 +8475,7 @@ "properties": { "fingerprint": { "type": "integer", - "format": "int64", + "format": "uint64", "description": "Fingerprint of the circuit at the time of the checkpoint.", "minimum": 0 },