diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/commands/async.c | 29 | ||||
-rw-r--r-- | src/backend/postmaster/pgstat.c | 9 |
2 files changed, 24 insertions, 14 deletions
diff --git a/src/backend/commands/async.c b/src/backend/commands/async.c index 0c9d20ebfc9..4613bd1cfb6 100644 --- a/src/backend/commands/async.c +++ b/src/backend/commands/async.c @@ -200,7 +200,10 @@ typedef struct QueuePosition } while (0) #define QUEUE_POS_EQUAL(x,y) \ - ((x).page == (y).page && (x).offset == (y).offset) + ((x).page == (y).page && (x).offset == (y).offset) + +#define QUEUE_POS_IS_ZERO(x) \ + ((x).page == 0 && (x).offset == 0) /* choose logically smaller QueuePosition */ #define QUEUE_POS_MIN(x,y) \ @@ -515,7 +518,6 @@ void AsyncShmemInit(void) { bool found; - int slotno; Size size; /* @@ -562,13 +564,6 @@ AsyncShmemInit(void) * During start or reboot, clean out the pg_notify directory. */ (void) SlruScanDirectory(AsyncCtl, SlruScanDirCbDeleteAll, NULL); - - /* Now initialize page zero to empty */ - LWLockAcquire(AsyncCtlLock, LW_EXCLUSIVE); - slotno = SimpleLruZeroPage(AsyncCtl, QUEUE_POS_PAGE(QUEUE_HEAD)); - /* This write is just to verify that pg_notify/ is writable */ - SimpleLruWritePage(AsyncCtl, slotno); - LWLockRelease(AsyncCtlLock); } } @@ -1470,9 +1465,21 @@ asyncQueueAddEntries(ListCell *nextNotify) */ queue_head = QUEUE_HEAD; - /* Fetch the current page */ + /* + * If this is the first write since the postmaster started, we need to + * initialize the first page of the async SLRU. Otherwise, the current + * page should be initialized already, so just fetch it. + * + * (We could also take the first path when the SLRU position has just + * wrapped around, but re-zeroing the page is harmless in that case.) + */ pageno = QUEUE_POS_PAGE(queue_head); - slotno = SimpleLruReadPage(AsyncCtl, pageno, true, InvalidTransactionId); + if (QUEUE_POS_IS_ZERO(queue_head)) + slotno = SimpleLruZeroPage(AsyncCtl, pageno); + else + slotno = SimpleLruReadPage(AsyncCtl, pageno, true, + InvalidTransactionId); + /* Note we mark the page dirty before writing in it */ AsyncCtl->shared->page_dirty[slotno] = true; diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 80a06e58ef2..0ecd29a1d99 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -2906,9 +2906,6 @@ pgstat_initialize(void) MyBEEntry = &BackendStatusArray[MaxBackends + MyAuxProcType]; } - /* Initialize SLRU statistics to zero */ - memset(&SLRUStats, 0, sizeof(SLRUStats)); - /* Set up a process-exit hook to clean up */ on_shmem_exit(pgstat_beshutdown_hook, 0); } @@ -6727,6 +6724,12 @@ pgstat_slru_name(int slru_idx) static inline PgStat_MsgSLRU * slru_entry(int slru_idx) { + /* + * The postmaster should never register any SLRU statistics counts; if it + * did, the counts would be duplicated into child processes via fork(). + */ + Assert(IsUnderPostmaster || !IsPostmasterEnvironment); + Assert((slru_idx >= 0) && (slru_idx < SLRU_NUM_ELEMENTS)); return &SLRUStats[slru_idx]; |