summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndres Freund2024-10-08 15:37:45 +0000
committerAndres Freund2024-10-08 15:37:45 +0000
commit57f37024712702350b714cf64215077f1d75c568 (patch)
tree7f7ed06961747eaad8f7c0d53bb304c954c7b4ea
parent755a4c10d19dbe432a1860cced914c570ff3becc (diff)
Use aux process resource owner in walsender
AIO will need a resource owner to do IO. Right now we create a resowner on-demand during basebackup, and we could do the same for AIO. But it seems easier to just always create an aux process resowner. Reviewed-by: Heikki Linnakangas <[email protected]> Reviewed-by: Noah Misch <[email protected]> Discussion: https://postgr.es/m/[email protected]
-rw-r--r--src/backend/backup/basebackup.c8
-rw-r--r--src/backend/replication/walsender.c44
-rw-r--r--src/include/replication/walsender.h1
3 files changed, 13 insertions, 40 deletions
diff --git a/src/backend/backup/basebackup.c b/src/backend/backup/basebackup.c
index 14e5ba72e97..0f8cddcbeeb 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 866b69ec855..371eef3dddc 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);
@@ -356,34 +354,6 @@ WalSndErrorCleanup(void)
}
/*
- * 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.
*/
static void
@@ -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 f2d8297f016..aff0f7a51ca 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);