1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-27 12:41:57 +03:00

Use ProcNumbers instead of direct Latch pointers to address other procs

This is in preparation for replacing Latches with a new abstraction.
That's still work in progress, but this seems a little tidier anyway,
so let's get this refactoring out of the way already.

Discussion: https://www.postgresql.org/message-id/391abe21-413e-4d91-a650-b663af49500c%40iki.fi
This commit is contained in:
Heikki Linnakangas
2024-11-01 13:47:20 +02:00
parent e819bbb7c8
commit a9c546a5a3
11 changed files with 72 additions and 55 deletions

View File

@ -30,6 +30,7 @@
#include "pgstat.h"
#include "pqexpbuffer.h"
#include "replication/walreceiver.h"
#include "storage/latch.h"
#include "utils/builtins.h"
#include "utils/memutils.h"
#include "utils/pg_lsn.h"

View File

@ -266,8 +266,8 @@ WalReceiverMain(char *startup_data, size_t startup_data_len)
walrcv->lastMsgSendTime =
walrcv->lastMsgReceiptTime = walrcv->latestWalEndTime = now;
/* Report the latch to use to awaken this process */
walrcv->latch = &MyProc->procLatch;
/* Report our proc number so that others can wake us up */
walrcv->procno = MyProcNumber;
SpinLockRelease(&walrcv->mutex);
@ -819,8 +819,8 @@ WalRcvDie(int code, Datum arg)
Assert(walrcv->pid == MyProcPid);
walrcv->walRcvState = WALRCV_STOPPED;
walrcv->pid = 0;
walrcv->procno = INVALID_PROC_NUMBER;
walrcv->ready_to_display = false;
walrcv->latch = NULL;
SpinLockRelease(&walrcv->mutex);
ConditionVariableBroadcast(&walrcv->walRcvStoppedCV);
@ -1358,15 +1358,15 @@ WalRcvComputeNextWakeup(WalRcvWakeupReason reason, TimestampTz now)
void
WalRcvForceReply(void)
{
Latch *latch;
ProcNumber procno;
WalRcv->force_reply = true;
/* fetching the latch pointer might not be atomic, so use spinlock */
/* fetching the proc number is probably atomic, but don't rely on it */
SpinLockAcquire(&WalRcv->mutex);
latch = WalRcv->latch;
procno = WalRcv->procno;
SpinLockRelease(&WalRcv->mutex);
if (latch)
SetLatch(latch);
if (procno != INVALID_PROC_NUMBER)
SetLatch(&GetPGProcByNumber(procno)->procLatch);
}
/*

View File

@ -27,6 +27,7 @@
#include "pgstat.h"
#include "replication/walreceiver.h"
#include "storage/pmsignal.h"
#include "storage/proc.h"
#include "storage/shmem.h"
#include "utils/timestamp.h"
@ -66,7 +67,7 @@ WalRcvShmemInit(void)
ConditionVariableInit(&WalRcv->walRcvStoppedCV);
SpinLockInit(&WalRcv->mutex);
pg_atomic_init_u64(&WalRcv->writtenUpto, 0);
WalRcv->latch = NULL;
WalRcv->procno = INVALID_PROC_NUMBER;
}
}
@ -248,7 +249,7 @@ RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo,
WalRcvData *walrcv = WalRcv;
bool launch = false;
pg_time_t now = (pg_time_t) time(NULL);
Latch *latch;
ProcNumber walrcv_proc;
/*
* We always start at the beginning of the segment. That prevents a broken
@ -309,14 +310,14 @@ RequestXLogStreaming(TimeLineID tli, XLogRecPtr recptr, const char *conninfo,
walrcv->receiveStart = recptr;
walrcv->receiveStartTLI = tli;
latch = walrcv->latch;
walrcv_proc = walrcv->procno;
SpinLockRelease(&walrcv->mutex);
if (launch)
SendPostmasterSignal(PMSIGNAL_START_WALRECEIVER);
else if (latch)
SetLatch(latch);
else if (walrcv_proc != INVALID_PROC_NUMBER)
SetLatch(&GetPGProcByNumber(walrcv_proc)->procLatch);
}
/*