aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/async.c29
-rw-r--r--src/backend/postmaster/pgstat.c9
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];