v9-0005-Move-shared-fileset-cleanup-to-before_shmem_exit.patch
application/octet-stream
Filename: v9-0005-Move-shared-fileset-cleanup-to-before_shmem_exit.patch
Type: application/octet-stream
Part: 0
Patch
Format: format-patch
Series: patch v9-0005
Subject: Move shared fileset cleanup to before_shmem_exit().
| File | + | − |
|---|---|---|
| src/backend/storage/file/sharedfileset.c | 9 | 4 |
From d90648909d7db6abf4938a4cbdfa8c3705235e7f Mon Sep 17 00:00:00 2001
From: Masahiko Sawada <sawada.mshk@gmail.com>
Date: Thu, 12 Aug 2021 10:57:41 +0900
Subject: [PATCH v9 5/5] Move shared fileset cleanup to before_shmem_exit().
The reported problem is that shared file set created in
SharedFileSetInit() by logical replication apply worker is cleaned up
in SharedFileSetDeleteOnProcExit() when the process exited on an error
due to a conflict. As shared fileset cleanup causes pgstat reporting
for underlying temporary files, the assertions added in ee3f8d3d3ae
caused failures.
To fix the problem, similar to 675c945394, move shared fileset cleanup
to a before_shmem_exit() hook, ensuring that the fileset is dropped
while we can still report stats for underlying temporary files.
---
src/backend/storage/file/sharedfileset.c | 13 +++++++++----
1 file changed, 9 insertions(+), 4 deletions(-)
diff --git a/src/backend/storage/file/sharedfileset.c b/src/backend/storage/file/sharedfileset.c
index ed37c940ad..0d9700bf56 100644
--- a/src/backend/storage/file/sharedfileset.c
+++ b/src/backend/storage/file/sharedfileset.c
@@ -36,7 +36,7 @@
static List *filesetlist = NIL;
static void SharedFileSetOnDetach(dsm_segment *segment, Datum datum);
-static void SharedFileSetDeleteOnProcExit(int status, Datum arg);
+static void SharedFileSetDeleteBeforeShmemExit(int status, Datum arg);
static void SharedFileSetPath(char *path, SharedFileSet *fileset, Oid tablespace);
static void SharedFilePath(char *path, SharedFileSet *fileset, const char *name);
static Oid ChooseTablespace(const SharedFileSet *fileset, const char *name);
@@ -112,7 +112,12 @@ SharedFileSetInit(SharedFileSet *fileset, dsm_segment *seg)
* fileset clean up.
*/
Assert(filesetlist == NIL);
- on_proc_exit(SharedFileSetDeleteOnProcExit, 0);
+
+ /*
+ * Register before-shmem-exit hook to ensure fileset is dropped
+ * while we can still report stats for underlying temporary files.
+ */
+ before_shmem_exit(SharedFileSetDeleteBeforeShmemExit, 0);
registered_cleanup = true;
}
@@ -259,12 +264,12 @@ SharedFileSetOnDetach(dsm_segment *segment, Datum datum)
}
/*
- * Callback function that will be invoked on the process exit. This will
+ * Callback function that will be invoked before shmem exit. This will
* process the list of all the registered sharedfilesets and delete the
* underlying files.
*/
static void
-SharedFileSetDeleteOnProcExit(int status, Datum arg)
+SharedFileSetDeleteBeforeShmemExit(int status, Datum arg)
{
/*
* Remove all the pending shared fileset entries. We don't use foreach()
--
2.24.3 (Apple Git-128)