diff options
author | Robert Haas <rhaas@postgresql.org> | 2019-12-19 14:56:20 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2019-12-19 14:56:20 -0500 |
commit | 16a4e4aecd47da7a6c4e1ebc20f6dd1a13f9133b (patch) | |
tree | 598ee1c089f080fde4bcb2e0707bb342fb934aa6 /src/include | |
parent | 9f83468b3536caf6fb7fe8f9dcdbb108a98d1257 (diff) | |
download | postgresql-16a4e4aecd47da7a6c4e1ebc20f6dd1a13f9133b.tar.gz postgresql-16a4e4aecd47da7a6c4e1ebc20f6dd1a13f9133b.zip |
Extend the ProcSignal mechanism to support barriers.
A new function EmitProcSignalBarrier() can be used to emit a global
barrier which all backends that participate in the ProcSignal
mechanism must absorb, and a new function WaitForProcSignalBarrier()
can be used to wait until all relevant backends have in fact
absorbed the barrier.
This can be used to coordinate global state changes, such as turning
checksums on while the system is running.
There's no real client of this mechanism yet, although two are
proposed, but an enum has to have at least one element, so this
includes a placeholder type (PROCSIGNAL_BARRIER_PLACEHOLDER) which
should be replaced by the first real client of this mechanism to
get committed.
Andres Freund and Robert Haas, reviewed by Daniel Gustafsson and,
in earlier versions, by Magnus Hagander.
Discussion: http://postgr.es/m/CA+TgmoZwDk=BguVDVa+qdA6SBKef=PKbaKDQALTC_9qoz1mJqg@mail.gmail.com
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/miscadmin.h | 1 | ||||
-rw-r--r-- | src/include/pgstat.h | 1 | ||||
-rw-r--r-- | src/include/storage/procsignal.h | 14 |
3 files changed, 16 insertions, 0 deletions
diff --git a/src/include/miscadmin.h b/src/include/miscadmin.h index 24f43ad6861..ed80f1d6681 100644 --- a/src/include/miscadmin.h +++ b/src/include/miscadmin.h @@ -82,6 +82,7 @@ extern PGDLLIMPORT volatile sig_atomic_t InterruptPending; extern PGDLLIMPORT volatile sig_atomic_t QueryCancelPending; extern PGDLLIMPORT volatile sig_atomic_t ProcDiePending; extern PGDLLIMPORT volatile sig_atomic_t IdleInTransactionSessionTimeoutPending; +extern PGDLLIMPORT volatile sig_atomic_t ProcSignalBarrierPending; extern PGDLLIMPORT volatile sig_atomic_t ClientConnectionLost; diff --git a/src/include/pgstat.h b/src/include/pgstat.h index fe076d823db..f2e873d048e 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -908,6 +908,7 @@ typedef enum WAIT_EVENT_LOGICAL_REWRITE_SYNC, WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE, WAIT_EVENT_LOGICAL_REWRITE_WRITE, + WAIT_EVENT_PROC_SIGNAL_BARRIER, WAIT_EVENT_RELATION_MAP_READ, WAIT_EVENT_RELATION_MAP_SYNC, WAIT_EVENT_RELATION_MAP_WRITE, diff --git a/src/include/storage/procsignal.h b/src/include/storage/procsignal.h index 05b186a05c2..b7d0d43f0d1 100644 --- a/src/include/storage/procsignal.h +++ b/src/include/storage/procsignal.h @@ -45,6 +45,16 @@ typedef enum NUM_PROCSIGNALS /* Must be last! */ } ProcSignalReason; +typedef enum +{ + /* + * XXX. PROCSIGNAL_BARRIER_PLACEHOLDER should be replaced when the first + * real user of the ProcSignalBarrier mechanism is added. It's just here + * for now because we can't have an empty enum. + */ + PROCSIGNAL_BARRIER_PLACEHOLDER = 0 +} ProcSignalBarrierType; + /* * prototypes for functions in procsignal.c */ @@ -55,6 +65,10 @@ extern void ProcSignalInit(int pss_idx); extern int SendProcSignal(pid_t pid, ProcSignalReason reason, BackendId backendId); +extern uint64 EmitProcSignalBarrier(ProcSignalBarrierType type); +extern void WaitForProcSignalBarrier(uint64 generation); +extern void ProcessProcSignalBarrier(void); + extern void procsignal_sigusr1_handler(SIGNAL_ARGS); #endif /* PROCSIGNAL_H */ |