From 53d7d4730206055e660343a7d25d3d90d3569e2e Mon Sep 17 00:00:00 2001
From: "Marc G. Fournier" <scrappy@hub.org>
Date: Tue, 25 Aug 1998 21:31:20 +0000
Subject: [PATCH] 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.
---
 src/backend/storage/ipc/sinval.c    |  5 ++---
 src/backend/storage/ipc/sinvaladt.c | 20 ++++++++++++++++++--
 src/include/storage/sinvaladt.h     |  6 +++---
 3 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 59732f2deb1..c5c011b5d42 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 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" */
diff --git a/src/include/storage/sinvaladt.h b/src/include/storage/sinvaladt.h
index de24ce9e257..93e861ebeec 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
-- 
GitLab