SIBackendInit returns a flag indicating whether it worked or not. Since
there is only one caller and it dies with a FATAL error when
SIBackendInit failed, it seems better to move the elog and remove the
return value, per this patch.
--
Alvaro Herrera http://www.amazon.com/gp/registry/5ZYLFMCVHXC
"Always assume the user will do much worse than the stupidest thing
you can imagine." (Julien PUYDT)
Index: src/backend/storage/ipc/sinval.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/storage/ipc/sinval.c,v
retrieving revision 1.82
diff -c -p -r1.82 sinval.c
*** src/backend/storage/ipc/sinval.c 5 Jan 2007 22:19:38 -0000 1.82
--- src/backend/storage/ipc/sinval.c 25 Jun 2007 17:33:06 -0000
*************** CreateSharedInvalidationState(void)
*** 67,83 ****
void
InitBackendSharedInvalidationState(void)
{
- int flag;
-
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
! flag = SIBackendInit(shmInvalBuffer);
LWLockRelease(SInvalLock);
- if (flag < 0) /* unexpected problem */
- elog(FATAL, "shared cache invalidation initialization failed");
- if (flag == 0) /* expected problem: MaxBackends exceeded */
- ereport(FATAL,
- (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
- errmsg("sorry, too many clients already")));
}
/*
--- 67,75 ----
void
InitBackendSharedInvalidationState(void)
{
LWLockAcquire(SInvalLock, LW_EXCLUSIVE);
! SIBackendInit(shmInvalBuffer);
LWLockRelease(SInvalLock);
}
/*
Index: src/backend/storage/ipc/sinvaladt.c
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/backend/storage/ipc/sinvaladt.c,v
retrieving revision 1.63
diff -c -p -r1.63 sinvaladt.c
*** src/backend/storage/ipc/sinvaladt.c 5 Jan 2007 22:19:38 -0000 1.63
--- src/backend/storage/ipc/sinvaladt.c 25 Jun 2007 17:33:51 -0000
*************** SIBufferInit(void)
*** 79,96 ****
/*
* SIBackendInit
! * Initialize a new backend to operate on the sinval buffer
! *
! * Returns:
! * >0 A-OK
! * 0 Failed to find a free procState slot (ie, MaxBackends exceeded)
! * <0 Some other failure (not currently used)
*
* NB: this routine, and all following ones, must be executed with the
* SInvalLock lock held, since there may be multiple backends trying
* to access the buffer.
*/
! int
SIBackendInit(SISeg *segP)
{
int index;
--- 79,92 ----
/*
* SIBackendInit
! * Initialize a new backend to operate on the sinval buffer. It fails
! * with a FATAL error if there are no free procState slots.
*
* NB: this routine, and all following ones, must be executed with the
* SInvalLock lock held, since there may be multiple backends trying
* to access the buffer.
*/
! void
SIBackendInit(SISeg *segP)
{
int index;
*************** SIBackendInit(SISeg *segP)
*** 117,124 ****
else
{
/* out of procState slots */
! MyBackendId = InvalidBackendId;
! return 0;
}
}
--- 113,121 ----
else
{
/* out of procState slots */
! ereport(FATAL,
! (errcode(ERRCODE_TOO_MANY_CONNECTIONS),
! errmsg("sorry, too many clients already")));
}
}
*************** SIBackendInit(SISeg *segP)
*** 137,144 ****
/* register exit routine to mark my entry inactive at exit */
on_shmem_exit(CleanupInvalidationState, PointerGetDatum(segP));
-
- return 1;
}
/*
--- 134,139 ----
Index: src/include/storage/sinvaladt.h
===================================================================
RCS file: /home/alvherre/Code/cvs/pgsql/src/include/storage/sinvaladt.h,v
retrieving revision 1.42
diff -c -p -r1.42 sinvaladt.h
*** src/include/storage/sinvaladt.h 5 Jan 2007 22:19:58 -0000 1.42
--- src/include/storage/sinvaladt.h 25 Jun 2007 17:32:49 -0000
*************** extern SISeg *shmInvalBuffer; /* pointer
*** 107,113 ****
* prototypes for functions in sinvaladt.c
*/
extern void SIBufferInit(void);
! extern int SIBackendInit(SISeg *segP);
extern bool SIInsertDataEntry(SISeg *segP, SharedInvalidationMessage *data);
extern int SIGetDataEntry(SISeg *segP, int backendId,
--- 107,113 ----
* prototypes for functions in sinvaladt.c
*/
extern void SIBufferInit(void);
! extern void SIBackendInit(SISeg *segP);
extern bool SIInsertDataEntry(SISeg *segP, SharedInvalidationMessage *data);
extern int SIGetDataEntry(SISeg *segP, int backendId,
---------------------------(end of broadcast)---------------------------
TIP 5: don't forget to increase your free space map settings