Skip to content

Commit d1d450c

Browse files
Use Patroni API for is_restart_pending()
1 parent 823e0a0 commit d1d450c

File tree

3 files changed

+22
-29
lines changed

3 files changed

+22
-29
lines changed

lib/charms/postgresql_k8s/v1/postgresql.py

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,23 +1267,6 @@ def update_user_password(
12671267
if connection is not None:
12681268
connection.close()
12691269

1270-
def is_restart_pending(self) -> bool:
1271-
"""Query pg_settings for pending restart."""
1272-
connection = None
1273-
try:
1274-
with self._connect_to_database() as connection, connection.cursor() as cursor:
1275-
cursor.execute("SELECT COUNT(*) FROM pg_settings WHERE pending_restart=True;")
1276-
return cursor.fetchone()[0] > 0
1277-
except psycopg2.OperationalError:
1278-
logger.warning("Failed to connect to PostgreSQL.")
1279-
return False
1280-
except psycopg2.Error as e:
1281-
logger.error(f"Failed to check if restart is pending: {e}")
1282-
return False
1283-
finally:
1284-
if connection:
1285-
connection.close()
1286-
12871270
def database_exists(self, db: str) -> bool:
12881271
"""Check whether specified database exists."""
12891272
connection = None

src/charm.py

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2436,18 +2436,11 @@ def _handle_postgresql_restart_need(self) -> None:
24362436
self._patroni.reload_patroni_configuration()
24372437
except Exception as e:
24382438
logger.error(f"Reload patroni call failed! error: {e!s}")
2439-
# Wait for some more time than the Patroni's loop_wait default value (10 seconds),
2440-
# which tells how much time Patroni will wait before checking the configuration
2441-
# file again to reload it.
2442-
try:
2443-
for attempt in Retrying(stop=stop_after_attempt(5), wait=wait_fixed(3)):
2444-
with attempt:
2445-
restart_postgresql = restart_postgresql or self.postgresql.is_restart_pending()
2446-
if not restart_postgresql:
2447-
raise Exception
2448-
except RetryError:
2449-
# Ignore the error, as it happens only to indicate that the configuration has not changed.
2450-
pass
2439+
2440+
restart_pending = self._patroni.is_restart_pending()
2441+
logger.debug(f"Checking if restart pending: {restart_postgresql} or {restart_pending}")
2442+
restart_postgresql = restart_postgresql or restart_pending
2443+
24512444
self.unit_peer_data.update({"tls": "enabled" if self.is_tls_enabled else ""})
24522445
self.postgresql_client_relation.update_endpoints()
24532446

src/cluster.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,23 @@ def get_patroni_health(self) -> dict[str, str]:
439439

440440
return r.json()
441441

442+
def is_restart_pending(self) -> bool:
443+
"""Returns whether the Patroni/PostgreSQL restart pending."""
444+
patroni_status = requests.get(
445+
f"{self._patroni_url}/patroni",
446+
verify=self.verify,
447+
timeout=API_REQUEST_TIMEOUT,
448+
auth=self._patroni_auth,
449+
)
450+
try:
451+
pending_restart = patroni_status.json()["pending_restart"]
452+
except KeyError:
453+
pending_restart = False
454+
pass
455+
logger.debug(f"Patroni API is_restart_pending: {pending_restart}")
456+
457+
return pending_restart
458+
442459
@property
443460
def is_creating_backup(self) -> bool:
444461
"""Returns whether a backup is being created."""

0 commit comments

Comments
 (0)