Dear All, I would propose a new function like GetXLogInsertRecPtr(), but with some modifications (please, see the attached patch). The result LSN can be passed to XLogFLush() safely. I believe, it will not raise an error in any case. XLogFlush(GetXLogLastInsertEndRecPtr()) will flush (fsync) all already inserted records at the moment. It is what I would like to get.
I'm not sure, we need a SQL function counterpart for this new C function, but it is not a big deal to implement. With best regards, Vitaly On Monday, August 19, 2024 09:35 MSK, Michael Paquier <mich...@paquier.xyz> wrote: On Wed, Aug 07, 2024 at 06:00:45PM +0300, Aleksander Alekseev wrote: > Assuming the function has value, as you claim, I see no reason not to > expose it similarly to pg_current_wal_*(). On top of that you will > have to test-cover it anyway. The easiest way to do it will be to have > an SQL-wrapper. I cannot be absolutely without seeing a patch, but adding SQL functions in this area is usually very useful for monitoring purposes of external solutions. -- Michael
From ba82d6c6f8570fbbff14b4b52fa7720122bfb8ad Mon Sep 17 00:00:00 2001 From: Vitaly Davydov <v.davy...@postgrespro.ru> Date: Tue, 20 Aug 2024 18:03:11 +0300 Subject: [PATCH] Add function to return the end LSN of the last inserted WAL record --- src/backend/access/transam/xlog.c | 19 +++++++++++++++++++ src/include/access/xlog.h | 1 + 2 files changed, 20 insertions(+) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index ee0fb0e28f..1430aea6d5 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -9425,6 +9425,25 @@ GetXLogWriteRecPtr(void) return LogwrtResult.Write; } +/* + * Get the end pointer of the last inserted WAL record. + * The returned value will differ from the current insert pointer + * returned by GetXLogInsertRecPtr() if the last WAL record ends + * up at a page boundary. + */ +XLogRecPtr +GetXLogLastInsertEndRecPtr(void) +{ + XLogCtlInsert *Insert = &XLogCtl->Insert; + uint64 current_bytepos; + + SpinLockAcquire(&Insert->insertpos_lck); + current_bytepos = Insert->CurrBytePos; + SpinLockRelease(&Insert->insertpos_lck); + + return XLogBytePosToEndRecPtr(current_bytepos); +} + /* * Returns the redo pointer of the last checkpoint or restartpoint. This is * the oldest point in WAL that we still need, if we have to restart recovery. diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h index 083810f5b4..e98a825642 100644 --- a/src/include/access/xlog.h +++ b/src/include/access/xlog.h @@ -226,6 +226,7 @@ extern RecoveryState GetRecoveryState(void); extern bool XLogInsertAllowed(void); extern XLogRecPtr GetXLogInsertRecPtr(void); extern XLogRecPtr GetXLogWriteRecPtr(void); +extern XLogRecPtr GetXLogLastInsertEndRecPtr(void); extern uint64 GetSystemIdentifier(void); extern char *GetMockAuthenticationNonce(void); -- 2.34.1