From bdabc23393f6c1f2be4ea6e1ea5bfd4d9cdec331 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Wed, 3 Jul 2024 11:28:55 -0300 Subject: [PATCH 1/6] Fix GCP backup test Signed-off-by: Marcelo Henrique Neppel --- tests/integration/test_backups.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_backups.py b/tests/integration/test_backups.py index b813001cbd..adbf462105 100644 --- a/tests/integration/test_backups.py +++ b/tests/integration/test_backups.py @@ -287,7 +287,7 @@ async def test_restore_on_new_cluster(ops_test: OpsTest, github_secrets, charm) async with ops_test.fast_forward(): unit = ops_test.model.units.get(f"{database_app_name}/0") await ops_test.model.block_until( - lambda: unit.workload_status_message == ANOTHER_CLUSTER_REPOSITORY_ERROR_MESSAGE + lambda: unit.workload_status_message == MOVE_RESTORED_CLUSTER_TO_ANOTHER_BUCKET ) # Check that the backup was correctly restored by having only the first created table. From cd8fdda04d256641436867400f7cd0f9b1618fdc Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 5 Jul 2024 11:45:51 -0300 Subject: [PATCH 2/6] Reset restore flag Signed-off-by: Marcelo Henrique Neppel --- src/charm.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/charm.py b/src/charm.py index 8a3e3ab41a..362b0931e0 100755 --- a/src/charm.py +++ b/src/charm.py @@ -1411,6 +1411,11 @@ def _set_primary_status_message(self) -> None: try: if "require-change-bucket-after-restore" in self.app_peer_data: self.unit.status = BlockedStatus(MOVE_RESTORED_CLUSTER_TO_ANOTHER_BUCKET) + self.app_peer_data.update({ + "restoring-backup": "", + "restore-stanza": "", + "restore-to-time": "", + }) return if self._patroni.get_primary(unit_name_pattern=True) == self.unit.name: self.unit.status = ActiveStatus("Primary") From 0a0f45da6343c5c53f28b7bdd1dd6b4a0b6673bd Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 5 Jul 2024 14:00:39 -0300 Subject: [PATCH 3/6] Correctly access application peer data Signed-off-by: Marcelo Henrique Neppel --- src/backups.py | 10 ++++++++-- src/charm.py | 11 ++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backups.py b/src/backups.py index 217c17b8aa..58eeac0fc5 100644 --- a/src/backups.py +++ b/src/backups.py @@ -219,6 +219,11 @@ def _is_s3_wal_compatible(self, stanza) -> Tuple[bool, Optional[str]]: and charm_last_archived_wal.split(".", 1)[0] != str(s3_last_archived_wal) ): if bool(self.charm.app_peer_data.get("require-change-bucket-after-restore", None)): + self.charm.app_peer_data.update({ + "restoring-backup": "", + "restore-stanza": "", + "restore-to-time": "", + }) return False, MOVE_RESTORED_CLUSTER_TO_ANOTHER_BUCKET else: return False, ANOTHER_CLUSTER_REPOSITORY_ERROR_MESSAGE @@ -594,12 +599,13 @@ def _on_s3_credential_changed(self, event: CredentialsChangedEvent): event.defer() return + if self.charm.unit.is_leader(): + self.charm.app_peer_data.pop("require-change-bucket-after-restore", None) + # Verify the s3 relation only on the primary. if not self.charm.is_primary: return - self.charm.app_peer_data.pop("require-change-bucket-after-restore", None) - try: self._create_bucket_if_not_exists() except (ClientError, ValueError): diff --git a/src/charm.py b/src/charm.py index 362b0931e0..05d8729bb4 100755 --- a/src/charm.py +++ b/src/charm.py @@ -1410,12 +1410,13 @@ def _set_primary_status_message(self) -> None: """Display 'Primary' in the unit status message if the current unit is the primary.""" try: if "require-change-bucket-after-restore" in self.app_peer_data: + if self.charm.unit.is_leader(): + self.app_peer_data.update({ + "restoring-backup": "", + "restore-stanza": "", + "restore-to-time": "", + }) self.unit.status = BlockedStatus(MOVE_RESTORED_CLUSTER_TO_ANOTHER_BUCKET) - self.app_peer_data.update({ - "restoring-backup": "", - "restore-stanza": "", - "restore-to-time": "", - }) return if self._patroni.get_primary(unit_name_pattern=True) == self.unit.name: self.unit.status = ActiveStatus("Primary") From 0e082d02eb8ba5ba5cd45f6f3de205c6ba9c5907 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 5 Jul 2024 14:10:58 -0300 Subject: [PATCH 4/6] Remove unnecessary code Signed-off-by: Marcelo Henrique Neppel --- src/backups.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/backups.py b/src/backups.py index 58eeac0fc5..c2e7be4dd9 100644 --- a/src/backups.py +++ b/src/backups.py @@ -219,11 +219,6 @@ def _is_s3_wal_compatible(self, stanza) -> Tuple[bool, Optional[str]]: and charm_last_archived_wal.split(".", 1)[0] != str(s3_last_archived_wal) ): if bool(self.charm.app_peer_data.get("require-change-bucket-after-restore", None)): - self.charm.app_peer_data.update({ - "restoring-backup": "", - "restore-stanza": "", - "restore-to-time": "", - }) return False, MOVE_RESTORED_CLUSTER_TO_ANOTHER_BUCKET else: return False, ANOTHER_CLUSTER_REPOSITORY_ERROR_MESSAGE From 012da5223f71a38579709ecca48f55211b82cab7 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 5 Jul 2024 14:35:33 -0300 Subject: [PATCH 5/6] Fix leader check Signed-off-by: Marcelo Henrique Neppel --- src/charm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/charm.py b/src/charm.py index 05d8729bb4..351609aad4 100755 --- a/src/charm.py +++ b/src/charm.py @@ -1410,7 +1410,7 @@ def _set_primary_status_message(self) -> None: """Display 'Primary' in the unit status message if the current unit is the primary.""" try: if "require-change-bucket-after-restore" in self.app_peer_data: - if self.charm.unit.is_leader(): + if self.unit.is_leader(): self.app_peer_data.update({ "restoring-backup": "", "restore-stanza": "", From 2e0dbeb7122acfbf54470a408f5320758c514b40 Mon Sep 17 00:00:00 2001 From: Marcelo Henrique Neppel Date: Fri, 5 Jul 2024 15:16:29 -0300 Subject: [PATCH 6/6] Update library Signed-off-by: Marcelo Henrique Neppel --- lib/charms/postgresql_k8s/v0/postgresql.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/charms/postgresql_k8s/v0/postgresql.py b/lib/charms/postgresql_k8s/v0/postgresql.py index f8f3ad2b23..071643841f 100644 --- a/lib/charms/postgresql_k8s/v0/postgresql.py +++ b/lib/charms/postgresql_k8s/v0/postgresql.py @@ -79,6 +79,10 @@ class PostgreSQLEnableDisableExtensionError(Exception): """Exception raised when enabling/disabling an extension fails.""" +class PostgreSQLGetLastArchivedWALError(Exception): + """Exception raised when retrieving last archived WAL fails.""" + + class PostgreSQLGetPostgreSQLVersionError(Exception): """Exception raised when retrieving PostgreSQL version fails.""" @@ -391,7 +395,7 @@ def get_last_archived_wal(self) -> str: return cursor.fetchone()[0] except psycopg2.Error as e: logger.error(f"Failed to get PostgreSQL last archived WAL: {e}") - raise PostgreSQLGetPostgreSQLVersionError() + raise PostgreSQLGetLastArchivedWALError() def get_postgresql_text_search_configs(self) -> Set[str]: """Returns the PostgreSQL available text search configs.