aboutsummaryrefslogtreecommitdiff
path: root/src/backend/storage/ipc/sinval.c
diff options
context:
space:
mode:
authorBruce Momjian <bruce@momjian.us>2002-08-29 21:02:12 +0000
committerBruce Momjian <bruce@momjian.us>2002-08-29 21:02:12 +0000
commit626eca697cf4470c44cb76f0603302201538c47e (patch)
tree8acf0b4c0b80977aa189ad75a0434b7f78af80d6 /src/backend/storage/ipc/sinval.c
parent1761990e385c7d761184425c95c8045303b81084 (diff)
downloadpostgresql-626eca697cf4470c44cb76f0603302201538c47e.tar.gz
postgresql-626eca697cf4470c44cb76f0603302201538c47e.zip
This patch reserves the last superuser_reserved_connections slots for
connections by the superuser only. This patch replaces the last patch I sent a couple of days ago. It closes a connection that has not been authorised by a superuser if it would leave less than the GUC variable ReservedBackends (superuser_reserved_connections in postgres.conf) backend process slots free in the SISeg. This differs to the first patch which only reserved the last ReservedBackends slots in the procState array. This has made the free slot test more expensive due to the use of a lock. After thinking about a comment on the first patch I've also made it a fatal error if the number of reserved slots is not less than the maximum number of connections. Nigel J. Andrews
Diffstat (limited to 'src/backend/storage/ipc/sinval.c')
-rw-r--r--src/backend/storage/ipc/sinval.c26
1 files changed, 25 insertions, 1 deletions
diff --git a/src/backend/storage/ipc/sinval.c b/src/backend/storage/ipc/sinval.c
index 940ab32b331..745a9c068de 100644
--- a/src/backend/storage/ipc/sinval.c
+++ b/src/backend/storage/ipc/sinval.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.49 2002/06/20 20:29:35 momjian Exp $
+ * $Header: /cvsroot/pgsql/src/backend/storage/ipc/sinval.c,v 1.50 2002/08/29 21:02:12 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -538,3 +538,27 @@ BackendIdGetProc(BackendId procId)
return NULL;
}
+
+/*
+ * CountEmptyBackendSlots - count empty slots in backend process table
+ *
+ * Doesn't count since the procState array could be large and we've already
+ * allowed for that by running a freeBackends counter in the SI segment.
+ * Unlike CountActiveBackends() we do not need to interrogate the
+ * backends to determine the free slot count.
+ * Goes for a lock despite being a trival look up in case other backends
+ * are busy starting or exiting since there is scope for confusion.
+ */
+int
+CountEmptyBackendSlots(void)
+{
+ int count;
+
+ LWLockAcquire(SInvalLock, LW_SHARED);
+
+ count = shmInvalBuffer->freeBackends;
+
+ LWLockRelease(SInvalLock);
+
+ return count;
+}