diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c index 14e5ba72e9..0f8cddcbee 100644 --- a/src/backend/backup/basebackup.c +++ b/src/backend/backup/basebackup.c @@ -250,8 +250,10 @@ perform_base_backup(basebackup_options *opt, bbsink *sink, state.bytes_total_is_valid = false; /* we're going to use a BufFile, so we need a ResourceOwner */ - Assert(CurrentResourceOwner == NULL); - CurrentResourceOwner = ResourceOwnerCreate(NULL, "base backup"); + Assert(AuxProcessResourceOwner != NULL); + Assert(CurrentResourceOwner == AuxProcessResourceOwner || + CurrentResourceOwner == NULL); + CurrentResourceOwner = AuxProcessResourceOwner; backup_started_in_recovery = RecoveryInProgress(); @@ -672,7 +674,7 @@ perform_base_backup(basebackup_options *opt, bbsink *sink, FreeBackupManifest(&manifest); /* clean up the resource owner we created */ - WalSndResourceCleanup(true); + ReleaseAuxProcessResources(true); basebackup_progress_done(); } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index 866b69ec85..371eef3ddd 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -282,10 +282,8 @@ InitWalSender(void) /* Create a per-walsender data structure in shared memory */ InitWalSenderSlot(); - /* - * We don't currently need any ResourceOwner in a walsender process, but - * if we did, we could call CreateAuxProcessResourceOwner here. - */ + /* need resource owner for e.g. basebackups */ + CreateAuxProcessResourceOwner(); /* * Let postmaster know that we're a WAL sender. Once we've declared us as @@ -346,7 +344,7 @@ WalSndErrorCleanup(void) * without a transaction, we've got to clean that up now. */ if (!IsTransactionOrTransactionBlock()) - WalSndResourceCleanup(false); + ReleaseAuxProcessResources(false); if (got_STOPPING || got_SIGUSR2) proc_exit(0); @@ -355,34 +353,6 @@ WalSndErrorCleanup(void) WalSndSetState(WALSNDSTATE_STARTUP); } -/* - * Clean up any ResourceOwner we created. - */ -void -WalSndResourceCleanup(bool isCommit) -{ - ResourceOwner resowner; - - if (CurrentResourceOwner == NULL) - return; - - /* - * Deleting CurrentResourceOwner is not allowed, so we must save a pointer - * in a local variable and clear it first. - */ - resowner = CurrentResourceOwner; - CurrentResourceOwner = NULL; - - /* Now we can release resources and delete it. */ - ResourceOwnerRelease(resowner, - RESOURCE_RELEASE_BEFORE_LOCKS, isCommit, true); - ResourceOwnerRelease(resowner, - RESOURCE_RELEASE_LOCKS, isCommit, true); - ResourceOwnerRelease(resowner, - RESOURCE_RELEASE_AFTER_LOCKS, isCommit, true); - ResourceOwnerDelete(resowner); -} - /* * Handle a client's connection abort in an orderly manner. */ @@ -685,8 +655,10 @@ UploadManifest(void) * parsing the manifest will use the cryptohash stuff, which requires a * resource owner */ - Assert(CurrentResourceOwner == NULL); - CurrentResourceOwner = ResourceOwnerCreate(NULL, "base backup"); + Assert(AuxProcessResourceOwner != NULL); + Assert(CurrentResourceOwner == AuxProcessResourceOwner || + CurrentResourceOwner == NULL); + CurrentResourceOwner = AuxProcessResourceOwner; /* Prepare to read manifest data into a temporary context. */ mcxt = AllocSetContextCreate(CurrentMemoryContext, @@ -723,7 +695,7 @@ UploadManifest(void) uploaded_manifest_mcxt = mcxt; /* clean up the resource owner we created */ - WalSndResourceCleanup(true); + ReleaseAuxProcessResources(true); } /* diff --git a/src/include/replication/walsender.h b/src/include/replication/walsender.h index f2d8297f01..aff0f7a51c 100644 --- a/src/include/replication/walsender.h +++ b/src/include/replication/walsender.h @@ -38,7 +38,6 @@ extern PGDLLIMPORT bool log_replication_commands; extern void InitWalSender(void); extern bool exec_replication_command(const char *cmd_string); extern void WalSndErrorCleanup(void); -extern void WalSndResourceCleanup(bool isCommit); extern void PhysicalWakeupLogicalWalSnd(void); extern XLogRecPtr GetStandbyFlushRecPtr(TimeLineID *tli); extern void WalSndSignals(void);