diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/pgarch.c | 27 | ||||
-rw-r--r-- | src/backend/postmaster/shell_archive.c | 8 | ||||
-rw-r--r-- | src/test/recovery/t/020_archive_status.pl | 14 |
3 files changed, 30 insertions, 19 deletions
diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 3868cd7bd35..2670e41666a 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -144,7 +144,7 @@ static void pgarch_die(int code, Datum arg); static void HandlePgArchInterrupts(void); static int ready_file_comparator(Datum a, Datum b, void *arg); static void LoadArchiveLibrary(void); -static void call_archive_module_shutdown_callback(int code, Datum arg); +static void pgarch_call_module_shutdown_cb(int code, Datum arg); /* Report shared memory space needed by PgArchShmemInit */ Size @@ -252,13 +252,7 @@ PgArchiverMain(void) /* Load the archive_library. */ LoadArchiveLibrary(); - PG_ENSURE_ERROR_CLEANUP(call_archive_module_shutdown_callback, 0); - { - pgarch_MainLoop(); - } - PG_END_ENSURE_ERROR_CLEANUP(call_archive_module_shutdown_callback, 0); - - call_archive_module_shutdown_callback(0, 0); + pgarch_MainLoop(); proc_exit(0); } @@ -804,18 +798,13 @@ HandlePgArchInterrupts(void) if (archiveLibChanged) { /* - * Call the currently loaded archive module's shutdown callback, - * if one is defined. - */ - call_archive_module_shutdown_callback(0, 0); - - /* * Ideally, we would simply unload the previous archive module and * load the new one, but there is presently no mechanism for * unloading a library (see the comment above * internal_load_library()). To deal with this, we simply restart * the archiver. The new archive module will be loaded when the - * new archiver process starts up. + * new archiver process starts up. Note that this triggers the + * module's shutdown callback, if defined. */ ereport(LOG, (errmsg("restarting archiver process because value of " @@ -858,15 +847,15 @@ LoadArchiveLibrary(void) if (ArchiveContext.archive_file_cb == NULL) ereport(ERROR, (errmsg("archive modules must register an archive callback"))); + + before_shmem_exit(pgarch_call_module_shutdown_cb, 0); } /* - * call_archive_module_shutdown_callback - * - * Calls the loaded archive module's shutdown callback, if one is defined. + * Call the shutdown callback of the loaded archive module, if defined. */ static void -call_archive_module_shutdown_callback(int code, Datum arg) +pgarch_call_module_shutdown_cb(int code, Datum arg) { if (ArchiveContext.shutdown_cb != NULL) ArchiveContext.shutdown_cb(); diff --git a/src/backend/postmaster/shell_archive.c b/src/backend/postmaster/shell_archive.c index 8a54d02e7bb..71d567065a2 100644 --- a/src/backend/postmaster/shell_archive.c +++ b/src/backend/postmaster/shell_archive.c @@ -23,6 +23,7 @@ static bool shell_archive_configured(void); static bool shell_archive_file(const char *file, const char *path); +static void shell_archive_shutdown(void); void shell_archive_init(ArchiveModuleCallbacks *cb) @@ -31,6 +32,7 @@ shell_archive_init(ArchiveModuleCallbacks *cb) cb->check_configured_cb = shell_archive_configured; cb->archive_file_cb = shell_archive_file; + cb->shutdown_cb = shell_archive_shutdown; } static bool @@ -156,3 +158,9 @@ shell_archive_file(const char *file, const char *path) elog(DEBUG1, "archived write-ahead log file \"%s\"", file); return true; } + +static void +shell_archive_shutdown(void) +{ + elog(DEBUG1, "archiver process shutting down"); +} diff --git a/src/test/recovery/t/020_archive_status.pl b/src/test/recovery/t/020_archive_status.pl index 550fb37cb68..2108d50073a 100644 --- a/src/test/recovery/t/020_archive_status.pl +++ b/src/test/recovery/t/020_archive_status.pl @@ -234,4 +234,18 @@ ok( -f "$standby2_data/$segment_path_1_done" ".done files created after archive success with archive_mode=always on standby" ); +# Check that the archiver process calls the shell archive module's shutdown +# callback. +$standby2->append_conf('postgresql.conf', "log_min_messages = debug1"); +$standby2->reload; + +# Run a query to make sure that the reload has taken effect. +$standby2->safe_psql('postgres', q{SELECT 1}); +my $log_location = -s $standby2->logfile; + +$standby2->stop; +my $logfile = slurp_file($standby2->logfile, $log_location); +ok( $logfile =~ qr/archiver process shutting down/, + 'check shutdown callback of shell archive module'); + done_testing(); |