From 3ce7c6ffcbcb63f6d54214fc7305f5acdf08d372 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Mon, 8 Jan 2024 19:00:04 +0000 Subject: [PATCH] fix(page_service client): correctly deserialize pagestream errors Before this PR, we wouldn't advance the underlying `Bytes`'s cursor. fixes https://github.com/neondatabase/neon/issues/6298 --- libs/pageserver_api/src/models.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/libs/pageserver_api/src/models.rs b/libs/pageserver_api/src/models.rs index a93c47f5a2..25530c9fc9 100644 --- a/libs/pageserver_api/src/models.rs +++ b/libs/pageserver_api/src/models.rs @@ -2,7 +2,7 @@ pub mod partitioning; use std::{ collections::HashMap, - io::Read, + io::{BufRead, Read}, num::{NonZeroU64, NonZeroUsize}, time::SystemTime, }; @@ -815,9 +815,10 @@ impl PagestreamBeMessage { PagestreamBeMessage::GetPage(PagestreamGetPageResponse { page: page.into() }) } Tag::Error => { - let buf = buf.get_ref(); - let cstr = std::ffi::CStr::from_bytes_until_nul(buf)?; - let rust_str = cstr.to_str()?; + let mut msg = Vec::new(); + buf.read_until(0, &mut msg)?; + let cstring = std::ffi::CString::from_vec_with_nul(msg)?; + let rust_str = cstring.to_str()?; PagestreamBeMessage::Error(PagestreamErrorResponse { message: rust_str.to_owned(), })