From f290b27378503392f1d22730717428f4fc9cfa90 Mon Sep 17 00:00:00 2001 From: Sasha Krassovsky Date: Mon, 27 Nov 2023 19:14:42 -0800 Subject: [PATCH] Fix check for if shmem is valid to take into account detached shmem (#5937) ## Problem We can segfault if we update connstr inside of a process that has detached from shmem (e.g. inside stats collector) ## Summary of changes Add a check to make sure we're not detached --- pgxn/neon/libpagestore.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/pgxn/neon/libpagestore.c b/pgxn/neon/libpagestore.c index cc09fb849d..8eb9ebb915 100644 --- a/pgxn/neon/libpagestore.c +++ b/pgxn/neon/libpagestore.c @@ -21,6 +21,7 @@ #include "storage/buf_internals.h" #include "storage/lwlock.h" #include "storage/ipc.h" +#include "storage/pg_shmem.h" #include "c.h" #include "postmaster/interrupt.h" @@ -87,6 +88,12 @@ bool (*old_redo_read_buffer_filter) (XLogReaderState *record, uint8 block_id) = static bool pageserver_flush(void); static void pageserver_disconnect(void); +static bool +PagestoreShmemIsValid() +{ + return pagestore_shared && UsedShmemSegAddr; +} + static bool CheckPageserverConnstring(char **newval, void **extra, GucSource source) { @@ -96,7 +103,7 @@ CheckPageserverConnstring(char **newval, void **extra, GucSource source) static void AssignPageserverConnstring(const char *newval, void *extra) { - if(!pagestore_shared) + if(!PagestoreShmemIsValid()) return; LWLockAcquire(pagestore_shared->lock, LW_EXCLUSIVE); strlcpy(pagestore_shared->pageserver_connstring, newval, MAX_PAGESERVER_CONNSTRING_SIZE); @@ -107,7 +114,7 @@ AssignPageserverConnstring(const char *newval, void *extra) static bool CheckConnstringUpdated() { - if(!pagestore_shared) + if(!PagestoreShmemIsValid()) return false; return pagestore_local_counter < pg_atomic_read_u64(&pagestore_shared->update_counter); } @@ -115,7 +122,7 @@ CheckConnstringUpdated() static void ReloadConnstring() { - if(!pagestore_shared) + if(!PagestoreShmemIsValid()) return; LWLockAcquire(pagestore_shared->lock, LW_SHARED); strlcpy(local_pageserver_connstring, pagestore_shared->pageserver_connstring, sizeof(local_pageserver_connstring));