diff --git a/src/bin/pg_probackup/catalog.cpp b/src/bin/pg_probackup/catalog.cpp index 6963b5bf9ff2d2a02d8ca3b574c54a1e31604c37..2d1f50a827aaa46c7891aa984e5be22696aa52d5 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 794242745b89a64df9335f151502820a6d499bf5..8ff268607272ed4291a42de27eb0867d6e431e44 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 25c6a595c7011d06f80b35130aed69d161b7fd3f..4fdebec57e39eec53ddfe7d4a7821bac1481833a 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 7951a500faf28ee53cb19e637c6c35baad3d40cc..e9a4519501af491d33367b0ac899d516158d7710 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)