diff options
author | Marc G. Fournier <scrappy@hub.org> | 1998-08-25 21:31:20 +0000 |
---|---|---|
committer | Marc G. Fournier <scrappy@hub.org> | 1998-08-25 21:31:20 +0000 |
commit | 53d7d4730206055e660343a7d25d3d90d3569e2e (patch) | |
tree | c2c9c8e589c9d559b97a94fefa32dfd40ec19625 /src/backend/storage/ipc/sinvaladt.c | |
parent | 82555376a1e5502ec2b278293e7390ed83341b58 (diff) |
From: Massimo Dal Zotto <dz@cs.unitn.it>
> sinval.patch
>
> fixes a problem in SI cache which causes table overflow if some
> backend is idle for a long time while other backends keep adding
> entries.
> It uses the new signal handling implemented in tprintf.patch.
> I have also increacasesed the max number of backends from 32 to 64
> and the table size from 1000 to 5000.
> I don't know if anybody is working on SI, but until another
> solution is found this patch fixes the problem. I have received
> messages from other people reporting the same problem which I
> fixed many months ago.
Diffstat (limited to 'src/backend/storage/ipc/sinvaladt.c')
-rw-r--r-- | src/backend/storage/ipc/sinvaladt.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 1d0cedfa3ea..5ddaf3725b1 100644 --- a/src/backend/storage/ipc/sinvaladt.c +++ b/src/backend/storage/ipc/sinvaladt.c @@ -7,11 +7,13 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.12 1998/07/13 16:34:49 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.13 1998/08/25 21:31:18 scrappy Exp $ * *------------------------------------------------------------------------- */ #include <stdio.h> +#include <signal.h> +#include <unistd.h> #include "postgres.h" @@ -20,6 +22,7 @@ #include "storage/sinvaladt.h" #include "storage/lmgr.h" #include "utils/palloc.h" +#include "utils/trace.h" /* ---------------- * global variable notes @@ -357,6 +360,19 @@ SIGetProcStateLimit(SISeg *segP, int i) static bool SIIncNumEntries(SISeg *segP, int num) { + /* + * Try to prevent table overflow. When the table is 70% full send + * a SIGUSR2 to the postmaster which will send it back to all the + * backends. This will be handled by Async_NotifyHandler() with a + * StartTransactionCommand() which will flush unread SI entries for + * each backend. dz - 27 Jan 1998 + */ + if (segP->numEntries == (MAXNUMMESSAGES * 70 / 100)) { + TPRINTF(TRACE_VERBOSE, + "SIIncNumEntries: table is 70%% full, signaling postmaster"); + kill(getppid(), SIGUSR2); + } + if ((segP->numEntries + num) <= MAXNUMMESSAGES) { segP->numEntries = segP->numEntries + num; @@ -655,7 +671,7 @@ SIReadEntryData(SISeg *segP, else { /* backend must not read messages, its own state has to be reset */ - elog(NOTICE, "SIMarkEntryData: cache state reset"); + elog(NOTICE, "SIReadEntryData: cache state reset"); resetFunction(); /* XXXX call it here, parameters? */ /* new valid state--mark all messages "read" */ |