From 1752658e26ea1f4766454695108ce90296f755e7 Mon Sep 17 00:00:00 2001 From: totaj Date: Wed, 8 Mar 2023 16:27:55 +0800 Subject: [PATCH] Fix gs_probackup doesn't clean lockfile when exit. --- src/bin/pg_probackup/catalog.cpp | 2 +- src/bin/pg_probackup/pg_probackup.cpp | 17 +++++++++++------ src/bin/pg_probackup/pg_probackupc.h | 2 +- src/common/backend/utils/init/postinit.cpp | 2 +- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/bin/pg_probackup/catalog.cpp b/src/bin/pg_probackup/catalog.cpp index 6963b5bf9f..2d1f50a827 100644 --- a/src/bin/pg_probackup/catalog.cpp +++ b/src/bin/pg_probackup/catalog.cpp @@ -66,7 +66,7 @@ timelineInfoFree(void *tliInfo) /* Iterate over locked backups and delete locks files */ void -unlink_lock_atexit(void) +unlink_lock_atexit(bool fatal, void *userdata) { int i; diff --git a/src/bin/pg_probackup/pg_probackup.cpp b/src/bin/pg_probackup/pg_probackup.cpp index 794242745b..8ff2686072 100644 --- a/src/bin/pg_probackup/pg_probackup.cpp +++ b/src/bin/pg_probackup/pg_probackup.cpp @@ -537,12 +537,15 @@ static int do_validate_operate() static int do_actual_operate() { + int res = 0; + pgut_atexit_push(unlink_lock_atexit, NULL); switch (backup_subcmd) { case ADD_INSTANCE_CMD: return do_add_instance(&instance_config); case DELETE_INSTANCE_CMD: - return do_delete_instance(); + res = do_delete_instance(); + break; case INIT_CMD: return do_init(); case BACKUP_CMD: @@ -556,14 +559,17 @@ static int do_actual_operate() elog(ERROR, "required parameter not specified: BACKUP_MODE " "(-b, --backup-mode)"); - return do_backup(start_time, set_backup_params, no_validate, no_sync, backup_logs, backup_replslots); + res = do_backup(start_time, set_backup_params, no_validate, no_sync, backup_logs, backup_replslots); + break; } case RESTORE_CMD: - return do_restore_or_validate(current.backup_id, + res = do_restore_or_validate(current.backup_id, recovery_target_options, restore_params, no_sync); + break; case VALIDATE_CMD: - return do_validate_operate(); + res = do_validate_operate(); + break; case SHOW_CMD: return do_show(instance_name, current.backup_id, show_archive); case DELETE_CMD: @@ -589,10 +595,9 @@ static int do_actual_operate() } on_cleanup(); - unlink_lock_atexit(); release_logfile(); - return 0; + return res; } static void parse_backup_option_to_params(char *command, char *command_name) diff --git a/src/bin/pg_probackup/pg_probackupc.h b/src/bin/pg_probackup/pg_probackupc.h index 25c6a595c7..4fdebec57e 100644 --- a/src/bin/pg_probackup/pg_probackupc.h +++ b/src/bin/pg_probackup/pg_probackupc.h @@ -478,7 +478,7 @@ extern bool fio_is_remote_simple(fio_location location); extern void get_header_errormsg(Page page, char **errormsg); extern void get_checksum_errormsg(Page page, char **errormsg, BlockNumber absolute_blkno); -extern void unlink_lock_atexit(void); +extern void unlink_lock_atexit(bool fatal, void *userdata); extern bool datapagemap_is_set(datapagemap_t *map, BlockNumber blkno); diff --git a/src/common/backend/utils/init/postinit.cpp b/src/common/backend/utils/init/postinit.cpp index 7951a500fa..e9a4519501 100644 --- a/src/common/backend/utils/init/postinit.cpp +++ b/src/common/backend/utils/init/postinit.cpp @@ -247,7 +247,7 @@ static HeapTuple GetDatabaseTuple(const char* dbname) char* GetDatabaseCompatibility(const char* dbname) { - if (!dbname) + if (!dbname || dbname[0] == 0) return NULL; HeapTuple tuple = GetDatabaseTuple(dbname); if (!tuple) -- Gitee