fix(compute): Respect skip_pg_catalog_updates in reconfigure() (#10696)

## Problem

We respect `skip_pg_catalog_updates` at the initial start, but ignore at
the follow-up `/configure`. Yet, it's used for storage->cplane->compute
notify requests after migrations, shard split, etc. So every time we get
them, applying the new config takes much longer than it should because
we go through Postgres catalog checks. Cplane sets this flag, when it
does serves notify attach call
9068c7d743

Related to `inc-403`, for example

## Summary of changes

Look at `skip_pg_catalog_updates` in `compute.reconfigure()`
This commit is contained in:
Alexey Kondratov
2025-02-12 18:54:21 +01:00
committed by GitHub
parent f45f9209b9
commit 49775d28e4
2 changed files with 79 additions and 16 deletions

View File

@@ -1400,26 +1400,27 @@ impl ComputeNode {
let postgresql_conf_path = pgdata_path.join("postgresql.conf");
config::write_postgres_conf(&postgresql_conf_path, &spec, self.internal_http_port)?;
let max_concurrent_connections = spec.reconfigure_concurrency;
if !spec.skip_pg_catalog_updates {
let max_concurrent_connections = spec.reconfigure_concurrency;
// Temporarily reset max_cluster_size in config
// to avoid the possibility of hitting the limit, while we are reconfiguring:
// creating new extensions, roles, etc.
config::with_compute_ctl_tmp_override(pgdata_path, "neon.max_cluster_size=-1", || {
self.pg_reload_conf()?;
// Temporarily reset max_cluster_size in config
// to avoid the possibility of hitting the limit, while we are reconfiguring:
// creating new extensions, roles, etc.
config::with_compute_ctl_tmp_override(pgdata_path, "neon.max_cluster_size=-1", || {
self.pg_reload_conf()?;
if spec.mode == ComputeMode::Primary {
let mut conf = tokio_postgres::Config::from_str(self.connstr.as_str()).unwrap();
conf.application_name("apply_config");
let conf = Arc::new(conf);
if spec.mode == ComputeMode::Primary {
let mut conf = tokio_postgres::Config::from_str(self.connstr.as_str()).unwrap();
conf.application_name("apply_config");
let conf = Arc::new(conf);
let spec = Arc::new(spec.clone());
let spec = Arc::new(spec.clone());
self.apply_spec_sql(spec, conf, max_concurrent_connections)?;
}
self.apply_spec_sql(spec, conf, max_concurrent_connections)?;
}
Ok(())
})?;
Ok(())
})?;
}
self.pg_reload_conf()?;

View File

@@ -0,0 +1,62 @@
from __future__ import annotations
from fixtures.neon_fixtures import NeonEnv
from fixtures.utils import wait_until
def test_compute_reconfigure(neon_simple_env: NeonEnv):
"""
Test that we can change postgresql.conf settings even if
skip_pg_catalog_updates=True is set.
"""
env = neon_simple_env
TEST_LOG_LINE_PREFIX = "%m [%p] [test_compute_reconfigure]: "
endpoint = env.endpoints.create_start("main")
# Check that the log line prefix is not set
# or different from TEST_LOG_LINE_PREFIX
with endpoint.cursor() as cursor:
cursor.execute("SHOW log_line_prefix;")
row = cursor.fetchone()
assert row is not None
assert row[0] != TEST_LOG_LINE_PREFIX
endpoint.respec_deep(
**{
"skip_pg_catalog_updates": True,
"cluster": {
"settings": [
{
"name": "log_line_prefix",
"vartype": "string",
"value": TEST_LOG_LINE_PREFIX,
}
]
},
}
)
endpoint.reconfigure()
# Check that in logs we see that it was actually reconfigured,
# not restarted or something else.
endpoint.log_contains("INFO request{method=POST uri=/configure")
# In /configure we only send SIGHUP at the end, so in theory
# it doesn't necessarily mean that Postgres already reloaded
# the new config; and it may race in some envs.
# So we wait until we see the log line that the config was changed.
def check_logs():
endpoint.log_contains(
f'[test_compute_reconfigure]: LOG: parameter "log_line_prefix" changed to "{TEST_LOG_LINE_PREFIX}"'
)
wait_until(check_logs)
# Check that the log line prefix is set
with endpoint.cursor() as cursor:
cursor.execute("SHOW log_line_prefix;")
row = cursor.fetchone()
assert row is not None
assert row[0] == TEST_LOG_LINE_PREFIX