mirror of
https://github.com/postgres/postgres.git
synced 2025-08-25 20:23:07 +03:00
Rewrite the sinval messaging mechanism to reduce contention and avoid
unnecessary cache resets. The major changes are: * When the queue overflows, we only issue a cache reset to the specific backend or backends that still haven't read the oldest message, rather than resetting everyone as in the original coding. * When we observe backend(s) falling well behind, we signal SIGUSR1 to only one backend, the one that is furthest behind and doesn't already have a signal outstanding for it. When it finishes catching up, it will in turn signal SIGUSR1 to the next-furthest-back guy, if there is one that is far enough behind to justify a signal. The PMSIGNAL_WAKEN_CHILDREN mechanism is removed. * We don't attempt to clean out dead messages after every message-receipt operation; rather, we do it on the insertion side, and only when the queue fullness passes certain thresholds. * Split SInvalLock into SInvalReadLock and SInvalWriteLock so that readers don't block writers nor vice versa (except during the infrequent queue cleanout operations). * Transfer multiple sinval messages for each acquisition of a read or write lock.
This commit is contained in:
@@ -1,12 +1,13 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* sinvaladt.h
|
||||
* POSTGRES shared cache invalidation segment definitions.
|
||||
* POSTGRES shared cache invalidation data manager.
|
||||
*
|
||||
* The shared cache invalidation manager is responsible for transmitting
|
||||
* invalidation messages between backends. Any message sent by any backend
|
||||
* must be delivered to all already-running backends before it can be
|
||||
* forgotten.
|
||||
* forgotten. (If we run out of space, we instead deliver a "RESET"
|
||||
* message to backends that have fallen too far behind.)
|
||||
*
|
||||
* The struct type SharedInvalidationMessage, defining the contents of
|
||||
* a single message, is defined in sinval.h.
|
||||
@@ -14,7 +15,7 @@
|
||||
* Portions Copyright (c) 1996-2008, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/storage/sinvaladt.h,v 1.47 2008/03/17 11:50:27 alvherre Exp $
|
||||
* $PostgreSQL: pgsql/src/include/storage/sinvaladt.h,v 1.48 2008/06/19 21:32:56 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -23,7 +24,6 @@
|
||||
|
||||
#include "storage/sinval.h"
|
||||
|
||||
|
||||
/*
|
||||
* prototypes for functions in sinvaladt.c
|
||||
*/
|
||||
@@ -31,9 +31,9 @@ extern Size SInvalShmemSize(void);
|
||||
extern void CreateSharedInvalidationState(void);
|
||||
extern void SharedInvalBackendInit(void);
|
||||
|
||||
extern bool SIInsertDataEntry(SharedInvalidationMessage *data);
|
||||
extern int SIGetDataEntry(int backendId, SharedInvalidationMessage *data);
|
||||
extern void SIDelExpiredDataEntries(bool locked);
|
||||
extern void SIInsertDataEntries(const SharedInvalidationMessage *data, int n);
|
||||
extern int SIGetDataEntries(SharedInvalidationMessage *data, int datasize);
|
||||
extern void SICleanupQueue(bool callerHasWriteLock, int minFree);
|
||||
|
||||
extern LocalTransactionId GetNextLocalTransactionId(void);
|
||||
|
||||
|
Reference in New Issue
Block a user