diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c index 59732f2deb1a06b2f0c9f57fa75227b952aeed19..c5c011b5d42c1d6b15798e41b5c4445896ad4432 100644 --- a/src/backend/storage/ipc/sinval.c +++ b/src/backend/storage/ipc/sinval.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.10 1998/06/15 19:29:15 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.11 1998/08/25 21:31:17 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -157,8 +157,7 @@ RegisterSharedInvalid(int cacheId, /* XXX */ /* should be called by a backend */ /****************************************************************************/ void - InvalidateSharedInvalid(void (*invalFunction) (), - void (*resetFunction) ()) +InvalidateSharedInvalid(void (*invalFunction) (), void (*resetFunction) ()) { SpinAcquire(SInvalLock); SIReadEntryData(shmInvalBuffer, MyBackendId, diff --git a/src/backend/storage/ipc/sinvaladt.c b/src/backend/storage/ipc/sinvaladt.c index 1d0cedfa3ea4f21421d7fbeb8ba399dd67a01a3c..5ddaf3725b193b5ace3086156699d53c27cf46a6 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" */ diff --git a/src/include/storage/sinvaladt.h b/src/include/storage/sinvaladt.h index de24ce9e257324325c04d1e56b6d3e539b5c56dd..93e861ebeec604a4ab363dd11eed61bac515727f 100644 --- a/src/include/storage/sinvaladt.h +++ b/src/include/storage/sinvaladt.h @@ -6,7 +6,7 @@ * * Copyright (c) 1994, Regents of the University of California * - * $Id: sinvaladt.h,v 1.8 1998/02/26 04:43:35 momjian Exp $ + * $Id: sinvaladt.h,v 1.9 1998/08/25 21:31:20 scrappy Exp $ * *------------------------------------------------------------------------- */ @@ -44,8 +44,8 @@ C----------------End shared segment ------- */ /* Parameters (configurable) *******************************************/ -#define MaxBackendId 32 /* maximum number of backends */ -#define MAXNUMMESSAGES 1000 /* maximum number of messages in seg */ +#define MaxBackendId 64 /* maximum number of backends */ +#define MAXNUMMESSAGES 4000 /* maximum number of messages in seg */ #define InvalidOffset 1000000000 /* a invalid offset (End of