fix(rpc): add issue 2815 regression and docker validation (#2828)

This commit is contained in:
houseme
2026-05-06 20:22:13 +08:00
committed by GitHub
parent 3898d524fe
commit 41ba34a145
5 changed files with 302 additions and 8 deletions
+63
View File
@@ -36,6 +36,7 @@ pub(crate) fn encode_msgpack_map<T: Serialize>(value: &T) -> Result<Vec<u8>, rmp
mod tests {
use super::*;
use rmp_serde::Deserializer;
use rustfs_madmin::{BackendDisks, BackendInfo, Disk, ITEM_ONLINE, StorageInfo};
use serde::Deserialize;
use std::collections::HashMap;
use std::io::Cursor;
@@ -90,4 +91,66 @@ mod tests {
let decoded: Nested = Deserialize::deserialize(&mut Deserializer::new(Cursor::new(&buf))).unwrap();
assert_eq!(val, decoded);
}
#[test]
fn storage_info_map_encoding_round_trip_matches_issue_2815_contract() {
let mut online_disks = BackendDisks::new();
online_disks.0.insert("node1".into(), 4);
let mut offline_disks = BackendDisks::new();
offline_disks.0.insert("node2".into(), 0);
let value = StorageInfo {
disks: vec![Disk {
endpoint: "node1:9000".into(),
state: ITEM_ONLINE.into(),
local: true,
pool_index: 0,
set_index: 0,
disk_index: 0,
..Default::default()
}],
backend: BackendInfo {
online_disks,
offline_disks,
total_sets: vec![1],
drives_per_set: vec![4],
..Default::default()
},
};
let buf = encode_msgpack_map(&value).unwrap();
let marker = buf[0];
assert!(
(0x80..=0x8f).contains(&marker) || marker == 0xde || marker == 0xdf,
"StorageInfo map-encoded payload must start with a map marker, got 0x{marker:02x}"
);
let decoded: StorageInfo = Deserialize::deserialize(&mut Deserializer::new(Cursor::new(&buf))).unwrap();
assert_eq!(decoded.disks.len(), 1);
assert_eq!(decoded.disks[0].endpoint, "node1:9000");
assert_eq!(decoded.backend.online_disks.0.get("node1"), Some(&4));
assert_eq!(decoded.backend.offline_disks.0.get("node2"), Some(&0));
}
#[test]
fn storage_info_tuple_encoding_uses_array_marker_that_issue_2815_fixed() {
let mut online_disks = BackendDisks::new();
online_disks.0.insert("node1".into(), 4);
let value = StorageInfo {
backend: BackendInfo {
online_disks,
..Default::default()
},
..Default::default()
};
let mut buf = Vec::new();
value.serialize(&mut Serializer::new(&mut buf)).unwrap();
let marker = buf[0];
assert!(
(0x90..=0x9f).contains(&marker) || marker == 0xdc || marker == 0xdd,
"legacy tuple-mode StorageInfo must start with an array marker, got 0x{marker:02x}"
);
}
}