diff options
author | Andres Freund <andres@anarazel.de> | 2025-03-15 12:30:07 -0400 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2025-03-15 22:07:48 -0400 |
commit | dd6f2618f681e699cb5f2122a3f036beaa89f992 (patch) | |
tree | 2349ca577965fe2ec074c0eb86aeb4861612adde /src/backend/storage/buffer/bufmgr.c | |
parent | 0762a151b0e018944694ccac07e521adcdf7a06f (diff) | |
download | postgresql-dd6f2618f681e699cb5f2122a3f036beaa89f992.tar.gz postgresql-dd6f2618f681e699cb5f2122a3f036beaa89f992.zip |
localbuf: Introduce TerminateLocalBufferIO()
Previously TerminateLocalBufferIO() was open-coded in multiple places, which
doesn't seem like a great idea. While TerminateLocalBufferIO() currently is
rather simple, an upcoming patch requires additional code to be added to
TerminateLocalBufferIO(), making this modification particularly worthwhile.
For some reason FlushRelationBuffers() previously cleared BM_JUST_DIRTIED,
even though that's never set for temporary buffers. This is not carried over
as part of this change.
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Discussion: https://postgr.es/m/CAAKRu_b9anbWzEs5AAF9WCvcEVmgz-1AkHSQ-CLLy-p7WHzvFw@mail.gmail.com
Diffstat (limited to 'src/backend/storage/buffer/bufmgr.c')
-rw-r--r-- | src/backend/storage/buffer/bufmgr.c | 32 |
1 files changed, 9 insertions, 23 deletions
diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 8243f4b2445..a716074467f 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -1072,19 +1072,11 @@ ZeroAndLockBuffer(Buffer buffer, ReadBufferMode mode, bool already_valid) if (!isLocalBuf) LWLockAcquire(BufferDescriptorGetContentLock(bufHdr), LW_EXCLUSIVE); + /* Set BM_VALID, terminate IO, and wake up any waiters */ if (isLocalBuf) - { - /* Only need to adjust flags */ - uint32 buf_state = pg_atomic_read_u32(&bufHdr->state); - - buf_state |= BM_VALID; - pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); - } + TerminateLocalBufferIO(bufHdr, false, BM_VALID); else - { - /* Set BM_VALID, terminate IO, and wake up any waiters */ TerminateBufferIO(bufHdr, false, BM_VALID, true); - } } else if (!isLocalBuf) { @@ -1554,19 +1546,11 @@ WaitReadBuffers(ReadBuffersOperation *operation) relpath(operation->smgr->smgr_rlocator, forknum).str))); } - /* Terminate I/O and set BM_VALID. */ + /* Set BM_VALID, terminate IO, and wake up any waiters */ if (persistence == RELPERSISTENCE_TEMP) - { - uint32 buf_state = pg_atomic_read_u32(&bufHdr->state); - - buf_state |= BM_VALID; - pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); - } + TerminateLocalBufferIO(bufHdr, false, BM_VALID); else - { - /* Set BM_VALID, terminate IO, and wake up any waiters */ TerminateBufferIO(bufHdr, false, BM_VALID, true); - } /* Report I/Os as completing individually. */ TRACE_POSTGRESQL_BUFFER_READ_DONE(forknum, io_first_block + j, @@ -4501,8 +4485,7 @@ FlushRelationBuffers(Relation rel) IOCONTEXT_NORMAL, IOOP_WRITE, io_start, 1, BLCKSZ); - buf_state &= ~(BM_DIRTY | BM_JUST_DIRTIED); - pg_atomic_unlocked_write_u32(&bufHdr->state, buf_state); + TerminateLocalBufferIO(bufHdr, true, 0); pgBufferUsage.local_blks_written++; @@ -5589,8 +5572,11 @@ TerminateBufferIO(BufferDesc *buf, bool clear_dirty, uint32 set_flag_bits, buf_state = LockBufHdr(buf); Assert(buf_state & BM_IO_IN_PROGRESS); + buf_state &= ~BM_IO_IN_PROGRESS; + + /* Clear earlier errors, if this IO failed, it'll be marked again */ + buf_state &= ~BM_IO_ERROR; - buf_state &= ~(BM_IO_IN_PROGRESS | BM_IO_ERROR); if (clear_dirty && !(buf_state & BM_JUST_DIRTIED)) buf_state &= ~(BM_DIRTY | BM_CHECKPOINT_NEEDED); |