mirror of
https://github.com/postgres/postgres.git
synced 2025-11-25 12:03:53 +03:00
Replace buffer I/O locks with condition variables.
1. Backends waiting for buffer I/O are now interruptible. 2. If something goes wrong in a backend that is currently performing I/O, waiting backends no longer wake up until that backend reaches AbortBufferIO() and broadcasts on the CV. Previously, any waiters would wake up (because the I/O lock was automatically released) and then busy-loop until AbortBufferIO() cleared BM_IO_IN_PROGRESS. 3. LWLockMinimallyPadded is removed, as it would now be unused. Author: Robert Haas <robertmhaas@gmail.com> Reviewed-by: Thomas Munro <thomas.munro@gmail.com> Reviewed-by: Julien Rouhaud <rjuju123@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> (earlier version, 2016) Discussion: https://postgr.es/m/CA%2BhUKGJ8nBFrjLuCTuqKN0pd2PQOwj9b_jnsiGFFMDvUxahj_A%40mail.gmail.com Discussion: https://postgr.es/m/CA+Tgmoaj2aPti0yho7FeEf2qt-JgQPRWb0gci_o1Hfr=C56Xng@mail.gmail.com
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
#include "port/atomics.h"
|
||||
#include "storage/buf.h"
|
||||
#include "storage/bufmgr.h"
|
||||
#include "storage/condition_variable.h"
|
||||
#include "storage/latch.h"
|
||||
#include "storage/lwlock.h"
|
||||
#include "storage/shmem.h"
|
||||
@@ -184,7 +185,6 @@ typedef struct BufferDesc
|
||||
|
||||
int wait_backend_pid; /* backend PID of pin-count waiter */
|
||||
int freeNext; /* link in freelist chain */
|
||||
|
||||
LWLock content_lock; /* to lock access to buffer contents */
|
||||
} BufferDesc;
|
||||
|
||||
@@ -221,12 +221,12 @@ typedef union BufferDescPadded
|
||||
|
||||
#define BufferDescriptorGetBuffer(bdesc) ((bdesc)->buf_id + 1)
|
||||
|
||||
#define BufferDescriptorGetIOLock(bdesc) \
|
||||
(&(BufferIOLWLockArray[(bdesc)->buf_id]).lock)
|
||||
#define BufferDescriptorGetIOCV(bdesc) \
|
||||
(&(BufferIOCVArray[(bdesc)->buf_id]).cv)
|
||||
#define BufferDescriptorGetContentLock(bdesc) \
|
||||
((LWLock*) (&(bdesc)->content_lock))
|
||||
|
||||
extern PGDLLIMPORT LWLockMinimallyPadded *BufferIOLWLockArray;
|
||||
extern PGDLLIMPORT ConditionVariableMinimallyPadded *BufferIOCVArray;
|
||||
|
||||
/*
|
||||
* The freeNext field is either the index of the next freelist entry,
|
||||
|
||||
Reference in New Issue
Block a user