From 96c9fd330c3b58cff5bddc1eed02b0f37734fda3 Mon Sep 17 00:00:00 2001 From: Joonas Koivunen Date: Thu, 24 Aug 2023 17:04:04 +0300 Subject: [PATCH] fix: duplicate residency events on flushing l0 --- pageserver/src/tenant/timeline.rs | 12 +----------- pageserver/src/tenant/timeline/layer_manager.rs | 10 ++++++++-- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/pageserver/src/tenant/timeline.rs b/pageserver/src/tenant/timeline.rs index 9d4534f0ea..05b8ab18af 100644 --- a/pageserver/src/tenant/timeline.rs +++ b/pageserver/src/tenant/timeline.rs @@ -2389,19 +2389,9 @@ impl Timeline { if let Some(ref l) = delta_layer_to_add { // TODO: move access stats, metrics update, etc. into layer manager. - l.access_stats().record_residence_event( - LayerResidenceStatus::Resident, - LayerResidenceEventReason::LayerCreate, - ); - - // update metrics - let sz = l.layer_desc().file_size; - self.metrics.resident_physical_size_gauge.add(sz); - self.metrics.num_persistent_files_created.inc_by(1); - self.metrics.persistent_bytes_written.inc_by(sz); } - guard.finish_flush_l0_layer(delta_layer_to_add.as_ref(), &frozen_layer); + guard.finish_flush_l0_layer(delta_layer_to_add.as_ref(), &frozen_layer, &self.metrics); // release lock on 'layers' } diff --git a/pageserver/src/tenant/timeline/layer_manager.rs b/pageserver/src/tenant/timeline/layer_manager.rs index 9e7d54c249..0e59817c0d 100644 --- a/pageserver/src/tenant/timeline/layer_manager.rs +++ b/pageserver/src/tenant/timeline/layer_manager.rs @@ -171,13 +171,13 @@ impl LayerManager { &mut self, delta_layer: Option<&ResidentLayer>, frozen_layer_for_check: &Arc, + metrics: &crate::metrics::TimelineMetrics, ) { let inmem = self .layer_map .frozen_layers .pop_front() .expect("there must be a inmem layer to flush"); - let mut updates = self.layer_map.batch_update(); // Only one task may call this function at a time (for this // timeline). If two tasks tried to flush the same frozen @@ -185,13 +185,19 @@ impl LayerManager { assert_eq!(Arc::as_ptr(&inmem), Arc::as_ptr(frozen_layer_for_check)); if let Some(l) = delta_layer { + let mut updates = self.layer_map.batch_update(); l.access_stats().record_residence_event( LayerResidenceStatus::Resident, LayerResidenceEventReason::LayerCreate, ); + let sz = l.layer_desc().file_size; + metrics.resident_physical_size_gauge.add(sz); + metrics.num_persistent_files_created.inc_by(1); + metrics.persistent_bytes_written.inc_by(sz); + Self::insert_historic_layer(l.as_ref().clone(), &mut updates, &mut self.layer_fmgr); + updates.flush(); } - updates.flush(); } /// Called when compaction is completed.