From 8d8bc304c1220ab371b28ecdfe249b2a5f828e8f Mon Sep 17 00:00:00 2001 From: Eric Seppanen Date: Fri, 7 May 2021 12:34:31 -0700 Subject: [PATCH] work around NodeId endian issues Instead of playing games during serialize/deserialize, just treat NodeId::term as an 8-byte array instead of a u64. --- Cargo.lock | 1 + walkeeper/Cargo.toml | 1 + walkeeper/src/wal_service.rs | 30 +++++++----------------------- 3 files changed, 9 insertions(+), 23 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2df732e815..e59adeb4b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2238,6 +2238,7 @@ dependencies = [ "crc32c", "daemonize", "fs2", + "hex", "lazy_static", "log", "pageserver", diff --git a/walkeeper/Cargo.toml b/walkeeper/Cargo.toml index 2e58ad0dd0..878ce491aa 100644 --- a/walkeeper/Cargo.toml +++ b/walkeeper/Cargo.toml @@ -30,6 +30,7 @@ crc32c = "0.6.0" parse_duration = "2.1.1" walkdir = "2" serde = { version = "1.0", features = ["derive"] } +hex = "0.4.3" # FIXME: 'pageserver' is needed for ZTimelineId. Refactor pageserver = { path = "../pageserver" } diff --git a/walkeeper/src/wal_service.rs b/walkeeper/src/wal_service.rs index 5f2fcd92be..8d790634ac 100644 --- a/walkeeper/src/wal_service.rs +++ b/walkeeper/src/wal_service.rs @@ -78,9 +78,7 @@ fn read_into(r: &mut impl Read, buf: &mut BytesMut) -> io::Result { #[derive(Debug, Clone, Copy, Ord, PartialOrd, PartialEq, Eq, Serialize, Deserialize)] struct NodeId { uuid: u128, - #[serde(serialize_with = "serialize_u64_flip_endian")] - #[serde(deserialize_with = "deserialize_u64_flip_endian")] - term: u64, + term: [u8; 8], } #[repr(C)] @@ -236,23 +234,6 @@ fn parse_hex_str(s: &str) -> Result { } } -// For use with serde's `serialize_with` attribute -fn serialize_u64_flip_endian(x: &u64, s: S) -> std::result::Result -where - S: serde::Serializer, -{ - s.serialize_u64(u64::from_be(*x)) -} - -// For use with serde's `deserialize_with` attribute -fn deserialize_u64_flip_endian<'de, D>(deserializer: D) -> std::result::Result -where - D: serde::de::Deserializer<'de>, -{ - let x: u64 = serde::de::Deserialize::deserialize(deserializer)?; - Ok(u64::from_be(x)) -} - impl SafeKeeperInfo { fn new() -> SafeKeeperInfo { SafeKeeperInfo { @@ -262,7 +243,10 @@ impl SafeKeeperInfo { server: ServerInfo { protocol_version: SK_PROTOCOL_VERSION, /* proxy-safekeeper protocol version */ pg_version: UNKNOWN_SERVER_VERSION, /* Postgres server version */ - node_id: NodeId { term: 0, uuid: 0 }, + node_id: NodeId { + term: [0; 8], + uuid: 0, + }, system_id: 0, /* Postgres system identifier */ timeline_id: ZTimelineId::from([0u8; 16]), wal_end: 0, @@ -588,8 +572,8 @@ impl Connection { self.send()?; io_error!( "Reject connection attempt with term {} because my term is {}", - prop.node_id.term, - my_info.server.node_id.term + hex::encode(prop.node_id.term), + hex::encode(my_info.server.node_id.term) ); } my_info.server.node_id = prop.node_id;