From 3fba7ea8c0736c5e21f50983543b45ef566b0a06 Mon Sep 17 00:00:00 2001 From: Alexey Kondratov Date: Thu, 29 Sep 2022 15:36:49 +0300 Subject: [PATCH] Create and load pg_state_statements on compute start --- compute_tools/src/compute.rs | 1 + compute_tools/src/pg_helpers.rs | 15 ++++++++++++--- compute_tools/src/spec.rs | 11 +++++++++++ compute_tools/tests/pg_helpers_tests.rs | 3 +-- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/compute_tools/src/compute.rs b/compute_tools/src/compute.rs index 58469b1c97..a254ade50b 100644 --- a/compute_tools/src/compute.rs +++ b/compute_tools/src/compute.rs @@ -296,6 +296,7 @@ impl ComputeNode { Ok(client) => client, }; + create_system_extensions(&mut client)?; handle_roles(&self.spec, &mut client)?; handle_databases(&self.spec, &mut client)?; handle_role_deletions(self, &mut client)?; diff --git a/compute_tools/src/pg_helpers.rs b/compute_tools/src/pg_helpers.rs index ac065fa60c..592448fe11 100644 --- a/compute_tools/src/pg_helpers.rs +++ b/compute_tools/src/pg_helpers.rs @@ -61,7 +61,9 @@ impl GenericOption { /// Represent `GenericOption` as configuration option. pub fn to_pg_setting(&self) -> String { - if let Some(val) = &self.value { + if let Some(val) = self.value.as_ref() { + // XXX: such overrides don't look as they should be here, but I cannot find a better place now + // Probably, we need to add some override pass before the first compute start steps. let name = match self.name.as_str() { "safekeepers" => "neon.safekeepers", "wal_acceptor_reconnect" => "neon.safekeeper_reconnect_timeout", @@ -69,9 +71,16 @@ impl GenericOption { it => it, }; + let mut res_val = val.to_owned(); + if self.name == "shared_preload_libraries" { + if !res_val.contains("pg_stat_statements") { + res_val = format!("{},pg_stat_statements", res_val) + } + } + match self.vartype.as_ref() { - "string" => format!("{} = '{}'", name, val), - _ => format!("{} = {}", name, val), + "string" => format!("{} = '{}'", name, res_val), + _ => format!("{} = {}", name, res_val), } } else { self.name.to_owned() diff --git a/compute_tools/src/spec.rs b/compute_tools/src/spec.rs index bd47614386..f16dd2b13a 100644 --- a/compute_tools/src/spec.rs +++ b/compute_tools/src/spec.rs @@ -426,3 +426,14 @@ pub fn handle_grants(node: &ComputeNode, client: &mut Client) -> Result<()> { Ok(()) } + +pub fn create_system_extensions(client: &mut Client) -> Result<()> { + for ext in ["pg_stat_statements", "neon"].iter() { + let query: String = format!("CREATE EXTENSION IF NOT EXISTS {}", ext); + + info!("creating extension '{}'", ext); + client.execute(query.as_str(), &[])?; + } + + Ok(()) +} diff --git a/compute_tools/tests/pg_helpers_tests.rs b/compute_tools/tests/pg_helpers_tests.rs index bae944440e..ecd8c5fe8c 100644 --- a/compute_tools/tests/pg_helpers_tests.rs +++ b/compute_tools/tests/pg_helpers_tests.rs @@ -28,8 +28,7 @@ mod pg_helpers_tests { assert_eq!( spec.cluster.settings.as_pg_settings(), - "fsync = off\nwal_level = replica\nhot_standby = on\nneon.safekeepers = '127.0.0.1:6502,127.0.0.1:6503,127.0.0.1:6501'\nwal_log_hints = on\nlog_connections = on\nshared_buffers = 32768\nport = 55432\nmax_connections = 100\nmax_wal_senders = 10\nlisten_addresses = '0.0.0.0'\nwal_sender_timeout = 0\npassword_encryption = md5\nmaintenance_work_mem = 65536\nmax_parallel_workers = 8\nmax_worker_processes = 8\nneon.tenant_id = 'b0554b632bd4d547a63b86c3630317e8'\nmax_replication_slots = 10\nneon.timeline_id = '2414a61ffc94e428f14b5758fe308e13'\nshared_preload_libraries = 'neon'\nsynchronous_standby_names = 'walproposer'\nneon.pageserver_connstring = 'host=127.0.0.1 port=6400'" - ); + "fsync = off\nwal_level = replica\nhot_standby = on\nneon.safekeepers = '127.0.0.1:6502,127.0.0.1:6503,127.0.0.1:6501'\nwal_log_hints = on\nlog_connections = on\nshared_buffers = 32768\nport = 55432\nmax_connections = 100\nmax_wal_senders = 10\nlisten_addresses = '0.0.0.0'\nwal_sender_timeout = 0\npassword_encryption = md5\nmaintenance_work_mem = 65536\nmax_parallel_workers = 8\nmax_worker_processes = 8\nneon.tenant_id = 'b0554b632bd4d547a63b86c3630317e8'\nmax_replication_slots = 10\nneon.timeline_id = '2414a61ffc94e428f14b5758fe308e13'\nshared_preload_libraries = 'neon,pg_stat_statements'\nsynchronous_standby_names = 'walproposer'\nneon.pageserver_connstring = 'host=127.0.0.1 port=6400'" ); } #[test]