From 171663be86c8322ad12a3395ed4eb55cefb38aee Mon Sep 17 00:00:00 2001 From: John Spray Date: Thu, 16 Nov 2023 12:32:50 +0100 Subject: [PATCH] pageserver: split off metadata into its own layer files --- pageserver/src/keyspace.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/pageserver/src/keyspace.rs b/pageserver/src/keyspace.rs index 20e6df9c7b..c2809d5290 100644 --- a/pageserver/src/keyspace.rs +++ b/pageserver/src/keyspace.rs @@ -1,4 +1,7 @@ -use crate::repository::{key_range_size, singleton_range, Key}; +use crate::{ + pgdatadir_mapping::{BASEBACKUP_CUT, METADATA_CUT}, + repository::{key_range_size, singleton_range, Key}, +}; use postgres_ffi::BLCKSZ; use std::ops::Range; @@ -22,13 +25,22 @@ impl KeySpace { let target_nblocks = (target_size / BLCKSZ as u64) as usize; let mut parts = Vec::new(); - let mut current_part = Vec::new(); + let mut current_part: Vec> = Vec::new(); let mut current_part_size: usize = 0; for range in &self.ranges { + let last = current_part + .last() + .map(|r| r.end) + .unwrap_or(Key::from_i128(0)); + let cut_here = (range.start >= METADATA_CUT && last < METADATA_CUT) + || (range.start >= BASEBACKUP_CUT && last < BASEBACKUP_CUT); + // If appending the next contiguous range in the keyspace to the current // partition would cause it to be too large, start a new partition. let this_size = key_range_size(range) as usize; - if current_part_size + this_size > target_nblocks && !current_part.is_empty() { + if cut_here + || current_part_size + this_size > target_nblocks && !current_part.is_empty() + { parts.push(KeySpace { ranges: current_part, });