Use aux process resource owner in walsender
authorAndres Freund <[email protected]>
Tue, 8 Oct 2024 15:37:45 +0000 (11:37 -0400)
committerAndres Freund <[email protected]>
Tue, 8 Oct 2024 15:37:45 +0000 (11:37 -0400)
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/1f6b50a7-38ef-4d87-8246-786d39f46ab9@iki.fi

src/backend/backup/basebackup.c
src/backend/replication/walsender.c
src/include/replication/walsender.h

index 14e5ba72e97a4e70479f3b157c5c5e343f1b1780..0f8cddcbeeba0d0ae84b2dcc942c09823467948e 100644 (file)
@@ -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();
 }
index 866b69ec8555c0942df32cb7fa3f284625807b5b..371eef3dddc069e52b0d59db4f7c675bfa04d4b4 100644 (file)
@@ -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);
 }
 
 /*
index f2d8297f016ea25a22fd80eacb08d40d77e6692e..aff0f7a51cae0ee7f4e5bd95fcdaf529eafb625a 100644 (file)
@@ -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);