mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-28 18:40:38 +00:00
Handle pageserver response with different number of pages gracefully
Some tests are hitting this case, where pageserver returns 0 page images in the response to a GetPage request. I suspect it's because the code doesn't handle sharding correclty? In any case, let's not panic on it, but return an IO error to the originating backend.
This commit is contained in:
@@ -484,7 +484,11 @@ impl<'t> CommunicatorWorkerProcessStruct<'t> {
|
||||
Ok(resp) => {
|
||||
// Write the received page image directly to the shared memory location
|
||||
// that the backend requested.
|
||||
assert!(resp.page_images.len() == 1);
|
||||
if resp.page_images.len() != 1 {
|
||||
error!("received unexpected response with {} page images received from pageserver for a request for one page",
|
||||
resp.page_images.len());
|
||||
return Err(-1);
|
||||
}
|
||||
let page_image = resp.page_images[0].clone();
|
||||
let src: &[u8] = page_image.as_ref();
|
||||
let len = std::cmp::min(src.len(), dest.bytes_total() as usize);
|
||||
@@ -564,7 +568,11 @@ impl<'t> CommunicatorWorkerProcessStruct<'t> {
|
||||
"prefetch completed, remembering blk {} in rel {:?} in LFC",
|
||||
*blkno, rel
|
||||
);
|
||||
assert!(resp.page_images.len() == 1);
|
||||
if resp.page_images.len() != 1 {
|
||||
error!("received unexpected response with {} page images received from pageserver for a request for one page",
|
||||
resp.page_images.len());
|
||||
return Err(-1);
|
||||
}
|
||||
let page_image = resp.page_images[0].clone();
|
||||
self.cache
|
||||
.remember_page(&rel, *blkno, page_image, not_modified_since, false)
|
||||
|
||||
Reference in New Issue
Block a user