Re: Improve WALRead() to suck data directly from WAL buffers when possible
Jeff Davis <pgsql@j-davis.com>
From: Jeff Davis <pgsql@j-davis.com>
To: Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>
Cc: Andres Freund <andres@anarazel.de>, Dilip Kumar <dilipbalaut@gmail.com>,
Kyotaro Horiguchi <horikyota.ntt@gmail.com>,
pgsql-hackers@lists.postgresql.org, Nathan Bossart
<nathandbossart@gmail.com>, Masahiko Sawada <sawada.mshk@gmail.com>
Date: 2024-01-26T19:34:26Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Add XLogCtl->logInsertResult
- f3ff7bf83bce 17.0 cited
-
Add assert to WALReadFromBuffers().
- 9ecbf54075a9 17.0 landed
-
Read WAL directly from WAL buffers.
- 91f2cae7a4e6 17.0 landed
-
Additional write barrier in AdvanceXLInsertBuffer().
- 766571be1659 17.0 landed
-
Use 64-bit atomics for xlblocks array elements.
- c3a8e2a7cb16 17.0 landed
-
Don't trust unvalidated xl_tot_len.
- bae868caf222 17.0 cited
On Fri, 2024-01-26 at 19:31 +0530, Bharath Rupireddy wrote: > Are you suggesting to error out instead of returning 0? We'd do neither of those things, because no caller should actually call it while RecoveryInProgress() or on a different timeline. > How about > returning a negative value instead of just 0 or returning true/false > just like WALRead? All of these things are functionally equivalent -- the same thing is happening at the end. This is just a discussion about API style and how that will interact with hypothetical callers that don't exist today. And it can also be easily changed later, so we aren't stuck with whatever decision happens here. > > Imagine, implementing an extension (may be for fun or learning or > educational or production purposes) to read unflushed WAL directly > from WAL buffers using XLogReadFromBuffers as page_read callback with > xlogreader facility. That makes sense, I didn't realize you intended to use this fron an extension. I'm fine considering that as a separate patch that could potentially be committed soon after this one. I'd like some more details, but can I please just commit the basic functionality now-ish? > Tried to keep wal_writer quiet with wal_writer_delay=10000ms and > wal_writer_flush_after = 1GB to not to flush WAL in the background. > Also, disabled autovacuum, and set checkpoint_timeout to a higher > value. All of this is done to generate minimal WAL so that WAL > buffers > don't get overwritten. Do you see any problems with it? Maybe check it against pg_current_wal_lsn(), and see if the Write pointer moved ahead? Perhaps even have a (limited) loop that tries again to catch it at the right time? > Can the WAL summarizer ever read the WAL on current TLI? I'm not so > sure about it, I haven't explored it in detail. Let's just not call XLogReadFromBuffers from there. Regards, Jeff Davis