Minor improvement in SI overflow logic: try to delete
authorTom Lane
Thu, 9 Sep 1999 14:56:06 +0000 (14:56 +0000)
committerTom Lane
Thu, 9 Sep 1999 14:56:06 +0000 (14:56 +0000)
expired messages before concluding that we really have buffer overflow.

src/backend/storage/ipc/sinvaladt.c

index 99426693cd1b8512e8ad1bc1691e5a13ee65241e..1a91dde9b1cf907c0f8ad9167a6bd16a8cd6dfb2 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.25 1999/09/06 19:37:38 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinvaladt.c,v 1.26 1999/09/09 14:56:06 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -228,9 +228,19 @@ SIInsertDataEntry(SISeg *segP, SharedInvalidData *data)
    /* Is the buffer full? */
    if (numMsgs >= MAXNUMMESSAGES)
    {
-       /* Yes, so force reset */
-       SISetProcStateInvalid(segP);
-       return false;
+       /*
+        * Don't panic just yet: slowest backend might have consumed some
+        * messages but not yet have done SIDelExpiredDataEntries() to
+        * advance minMsgNum.  So, make sure minMsgNum is up-to-date.
+        */
+       SIDelExpiredDataEntries(segP);
+       numMsgs = segP->maxMsgNum - segP->minMsgNum;
+       if (numMsgs >= MAXNUMMESSAGES)
+       {
+           /* Yup, it's definitely full, no choice but to reset */
+           SISetProcStateInvalid(segP);
+           return false;
+       }
    }
 
    /*