From: Massimo Dal Zotto
authorMarc G. Fournier
Tue, 25 Aug 1998 21:31:20 +0000 (21:31 +0000)
committerMarc G. Fournier
Tue, 25 Aug 1998 21:31:20 +0000 (21:31 +0000)
> 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
src/backend/storage/ipc/sinvaladt.c
src/include/storage/sinvaladt.h

index 59732f2deb1a06b2f0c9f57fa75227b952aeed19..c5c011b5d42c1d6b15798e41b5c4445896ad4432 100644 (file)
@@ -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,
index 1d0cedfa3ea4f21421d7fbeb8ba399dd67a01a3c..5ddaf3725b193b5ace3086156699d53c27cf46a6 100644 (file)
@@ -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 
+#include 
+#include 
 
 #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" */
index de24ce9e257324325c04d1e56b6d3e539b5c56dd..93e861ebeec604a4ab363dd11eed61bac515727f 100644 (file)
@@ -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