From 885033ad42a98e4bf11689469efc2a2ab4836c17 Mon Sep 17 00:00:00 2001 From: Konstantin Knizhnik Date: Thu, 6 Oct 2022 09:37:37 +0300 Subject: [PATCH] Make reconstruction more intensive --- control_plane/src/compute.rs | 2 +- pageserver/src/tenant/layer_map.rs | 13 +++++++++++++ pageserver/src/tenant/timeline.rs | 12 ++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/control_plane/src/compute.rs b/control_plane/src/compute.rs index 89994c5647..ab9edd5de7 100644 --- a/control_plane/src/compute.rs +++ b/control_plane/src/compute.rs @@ -284,7 +284,7 @@ impl PostgresNode { conf.append("max_wal_senders", "10"); // wal_log_hints is mandatory when running against pageserver (see gh issue#192) // TODO: is it possible to check wal_log_hints at pageserver side via XLOG_PARAMETER_CHANGE? - conf.append("wal_log_hints", "on"); + conf.append("wal_log_hints", "off"); conf.append("max_replication_slots", "10"); conf.append("hot_standby", "on"); conf.append("shared_buffers", "1MB"); diff --git a/pageserver/src/tenant/layer_map.rs b/pageserver/src/tenant/layer_map.rs index 0f82a0b165..369d02fd10 100644 --- a/pageserver/src/tenant/layer_map.rs +++ b/pageserver/src/tenant/layer_map.rs @@ -336,6 +336,19 @@ impl LayerMap { pub fn insert_historic(&mut self, layer: Arc) { if layer.get_key_range() == (Key::MIN..Key::MAX) { self.latest_delta_layer = Some(layer.clone()); + } else if !layer.is_incremental() { + // If latest delta layer is followed by image layers + // then reset it, preventing generation of partial image layer + if let Some(latest_delta) = &self.latest_delta_layer { + // May be it is more correct to use contains() rather than inrestects + // but one delta layer can be covered by several image layers. + let kr1 = layer.get_key_range(); + let kr2 = latest_delta.get_key_range(); + if kr2.end > kr1.start && kr2.start < kr1.end { + // if kr1.intersects(&kr2) { + self.latest_delta_layer = None; + } + } } self.historic_layers.insert(LayerRTreeObject { layer }); NUM_ONDISK_LAYERS.inc(); diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index bb1c0d1c8b..11639256a0 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -589,7 +589,7 @@ impl Timeline { last_received_wal: Mutex::new(None), rel_size_cache: RwLock::new(HashMap::new()), }; - result.repartition_threshold = result.get_checkpoint_distance() / 10; + result.repartition_threshold = result.get_checkpoint_distance() * 3; result } @@ -1392,11 +1392,6 @@ impl Timeline { None, ); } - - // 3. Reconstruct - let timer = self.metrics.reconstruct_time_histo.start_timer(); - self.reconstruct_level0(target_file_size)?; - timer.stop_and_record(); } Err(err) => { // no partitioning? This is normal, if the timeline was just created @@ -1407,6 +1402,11 @@ impl Timeline { } }; + // 3. Reconstruct + let timer = self.metrics.reconstruct_time_histo.start_timer(); + self.reconstruct_level0(target_file_size)?; + timer.stop_and_record(); + Ok(()) }