test(internode): pin JSON fallback compatibility (#5330)

Co-authored-by: heihutu <heihutu@gmail.com>
This commit is contained in:
houseme
2026-07-27 17:49:24 +08:00
committed by GitHub
parent ab5aa54035
commit 0cbfa1ac90
2 changed files with 65 additions and 0 deletions
@@ -616,6 +616,41 @@ fn records_msgpack_decode_metric_with_codec_label() {
assert_eq!(values.get(&key).and_then(|points| points.get(&7)).copied(), Some((11, 5)));
}
#[test]
fn records_msgpack_fallback_metric_with_direction_and_message_labels() {
let export = ExportMetricsServiceRequest {
resource_metrics: vec![ResourceMetrics {
scope_metrics: vec![ScopeMetrics {
metrics: vec![Metric {
name: MSGPACK_JSON_FALLBACK_COUNTER.to_string(),
data: Some(metric::Data::Sum(Sum {
data_points: vec![NumberDataPoint {
attributes: vec![
metric_attribute(DIRECTION_LABEL, FALLBACK_RESPONSE_DIRECTION),
metric_attribute(MESSAGE_LABEL, "RenameDataResp"),
],
start_time_unix_nano: 7,
time_unix_nano: 11,
value: Some(number_data_point::Value::AsInt(14)),
..Default::default()
}],
..Default::default()
})),
..Default::default()
}],
..Default::default()
}],
..Default::default()
}],
};
let mut values = BTreeMap::new();
record_msgpack_fallback_metrics(&export, &mut values);
let key = msgpack_fallback_metric_key(FALLBACK_RESPONSE_DIRECTION, "RenameDataResp");
assert_eq!(values.get(&key).and_then(|points| points.get(&7)).copied(), Some((11, 14)));
}
#[test]
fn records_msgpack_decode_error_metric_with_codec_label() {
let export = ExportMetricsServiceRequest {
@@ -3166,6 +3166,36 @@ mod tests {
assert!(after > before, "successful response JSON decode should increment traffic metrics");
}
#[test]
fn rename_data_response_accepts_legacy_json_without_decode_error() {
crate::cluster::rpc::runtime_sources::reset_internode_metrics_for_test();
let response = RenameDataResp {
old_data_dir: Some(Uuid::new_v4()),
sign: Some(vec![0x14, 0x35]),
old_current_size: Some(crate::disk::OldCurrentSize::Present(64 * 1024)),
};
let json = serde_json::to_string(&response).expect("legacy rename_data JSON response should encode");
let decode_before = rustfs_io_metrics::internode_metrics::global_internode_metrics().msgpack_json_decode_total_for_test();
let decode_errors_before = crate::cluster::rpc::runtime_sources::internode_msgpack_json_decode_error_total_for_test();
let decoded = decode_msgpack_or_json::<RenameDataResp>(&[], &json, "RenameDataResp")
.expect("legacy rename_data JSON response should decode");
let decode_after = rustfs_io_metrics::internode_metrics::global_internode_metrics().msgpack_json_decode_total_for_test();
let decode_errors_after = crate::cluster::rpc::runtime_sources::internode_msgpack_json_decode_error_total_for_test();
assert_eq!(decoded.old_data_dir, response.old_data_dir);
assert_eq!(decoded.sign, response.sign);
assert_eq!(decoded.old_current_size, response.old_current_size);
assert!(
decode_after > decode_before,
"legacy JSON response should increment successful decode traffic"
);
assert_eq!(
decode_errors_after, decode_errors_before,
"legacy JSON compatibility fallback must stay observable without becoming a decode error"
);
}
#[test]
fn read_multiple_response_payload_len_prefers_msgpack_and_falls_back_to_json() {
let bin_a = encode_msgpack(&sample_read_multiple_resp("a", b"binary")).expect("msgpack should encode");