From fdd504f043ea32c7d1be8734a695f113d7f96dfa Mon Sep 17 00:00:00 2001 From: Christian Schwarz Date: Wed, 17 May 2023 20:19:56 +0200 Subject: [PATCH] neon_local tenant config: ensure that all supplied config args have been used This does it like `tenant create`. We should dedupe these at a future point in time. --- control_plane/src/pageserver.rs | 44 ++++++++++++++++++++------------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/control_plane/src/pageserver.rs b/control_plane/src/pageserver.rs index f022be3910..30e39822cb 100644 --- a/control_plane/src/pageserver.rs +++ b/control_plane/src/pageserver.rs @@ -393,69 +393,79 @@ impl PageServerNode { }) } - pub fn tenant_config(&self, tenant_id: TenantId, settings: HashMap<&str, &str>) -> Result<()> { + pub fn tenant_config( + &self, + tenant_id: TenantId, + mut settings: HashMap<&str, &str>, + ) -> anyhow::Result<()> { let config = { // Braces to make the diff easier to read models::TenantConfig { checkpoint_distance: settings - .get("checkpoint_distance") + .remove("checkpoint_distance") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'checkpoint_distance' as an integer")?, - checkpoint_timeout: settings.get("checkpoint_timeout").map(|x| x.to_string()), + checkpoint_timeout: settings.remove("checkpoint_timeout").map(|x| x.to_string()), compaction_target_size: settings - .get("compaction_target_size") + .remove("compaction_target_size") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'compaction_target_size' as an integer")?, - compaction_period: settings.get("compaction_period").map(|x| x.to_string()), + compaction_period: settings.remove("compaction_period").map(|x| x.to_string()), compaction_threshold: settings - .get("compaction_threshold") + .remove("compaction_threshold") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'compaction_threshold' as an integer")?, gc_horizon: settings - .get("gc_horizon") + .remove("gc_horizon") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'gc_horizon' as an integer")?, - gc_period: settings.get("gc_period").map(|x| x.to_string()), + gc_period: settings.remove("gc_period").map(|x| x.to_string()), image_creation_threshold: settings - .get("image_creation_threshold") + .remove("image_creation_threshold") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'image_creation_threshold' as non zero integer")?, - pitr_interval: settings.get("pitr_interval").map(|x| x.to_string()), + pitr_interval: settings.remove("pitr_interval").map(|x| x.to_string()), walreceiver_connect_timeout: settings - .get("walreceiver_connect_timeout") + .remove("walreceiver_connect_timeout") + .map(|x| x.to_string()), + lagging_wal_timeout: settings + .remove("lagging_wal_timeout") .map(|x| x.to_string()), - lagging_wal_timeout: settings.get("lagging_wal_timeout").map(|x| x.to_string()), max_lsn_wal_lag: settings - .get("max_lsn_wal_lag") + .remove("max_lsn_wal_lag") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'max_lsn_wal_lag' as non zero integer")?, trace_read_requests: settings - .get("trace_read_requests") + .remove("trace_read_requests") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'trace_read_requests' as bool")?, eviction_policy: settings - .get("eviction_policy") + .remove("eviction_policy") .map(|x| serde_json::from_str(x)) .transpose() .context("Failed to parse 'eviction_policy' json")?, min_resident_size_override: settings - .get("min_resident_size_override") + .remove("min_resident_size_override") .map(|x| x.parse::()) .transpose() .context("Failed to parse 'min_resident_size_override' as an integer")?, evictions_low_residence_duration_metric_threshold: settings - .get("evictions_low_residence_duration_metric_threshold") + .remove("evictions_low_residence_duration_metric_threshold") .map(|x| x.to_string()), } }; + if !settings.is_empty() { + bail!("Unrecognized tenant settings: {settings:?}") + } + self.http_request(Method::PUT, format!("{}/tenant/config", self.http_base_url))? .json(&models::TenantConfigRequest { tenant_id, config }) .send()?