From d90648909d7db6abf4938a4cbdfa8c3705235e7f Mon Sep 17 00:00:00 2001 From: Masahiko Sawada 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)