From 4b6004e8c9ca3cbef8e9efb6aed951160d0697a0 Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Tue, 9 Jan 2024 10:22:43 +0100 Subject: [PATCH] fix(page_service client): correctly deserialize pagestream errors (#6302) 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 dea925b468..316d79b634 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, }; @@ -813,9 +813,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(), })