TODO item:

Administration -
        Reserve last few process slots for super-user if max_connections
        reached


Notes:

Added GUC superuser_reserved_connections such that non-superuser connections
are only acceptable in the first
(max_connections - superuser_reserved_connections) backend slots.

Superuser connections within these first n slots count towards this
non-superuser connection limit. Therefore there can be at most this number
of non-superuser connections but may be less.

In addition, this limit is only checked on initialisation of a backend
process. So reserved slots can be taken by connections that subsequently
lose superuser priviledges thus evading the lower limit on backends.

Passed regression tests, not that it was likely not to.
Behaved as expected in a manual test.


-- 
Nigel J. Andrews
Director

---
Logictree Systems Limited
Computer Consultants
? config.log
? GNUmakefile
? config.status
? src/Makefile.global
? src/include/pg_config.h
? src/include/stamp-h
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/postmaster.c,v
retrieving revision 1.285
diff -c -r1.285 postmaster.c
*** src/backend/postmaster/postmaster.c 2002/08/18 03:03:25     1.285
--- src/backend/postmaster/postmaster.c 2002/08/25 22:27:47
***************
*** 151,156 ****
--- 151,168 ----
   */
  int                   MaxBackends = DEF_MAXBACKENDS;
  
+ /*
+  * ReservedBackends is the number of backends reserved for superuser use.
+  * This number is taken out of the pool size given by MaxBackends so
+  * number of backend slots available to none super users is
+  * (MaxBackends - ReservedBackends). Note, existing super user
+  * connections are not taken into account once this lower limit has
+  * been reached, i.e. superuser connections made before the lower limit
+  * is reached always count towards that limit and are not taken from
+  * ReservedBackends.
+  */
+ int                   ReservedBackends = 2;
+ 
  
  static char *progname = (char *) NULL;
  
***************
*** 566,571 ****
--- 578,591 ----
        SetDataDir(potential_DataDir);
  
        ProcessConfigFile(PGC_POSTMASTER);
+ 
+       /*
+        * Force ReservedBackends is less than MaxBackends if need be.
+        * A cluster only allowing superuser connections seems silly whereas
+        * a cluster reserving none for superusers doesn't.
+        */
+       if (ReservedBackends >= MaxBackends)
+               ReservedBackends = MaxBackends - 1;
  
        /*
         * Now that we are done processing the postmaster arguments, reset
Index: src/backend/utils/init/postinit.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/init/postinit.c,v
retrieving revision 1.109
diff -c -r1.109 postinit.c
*** src/backend/utils/init/postinit.c   2002/07/20 05:16:59     1.109
--- src/backend/utils/init/postinit.c   2002/08/25 22:27:48
***************
*** 402,407 ****
--- 402,417 ----
        /* close the transaction we started above */
        if (!bootstrap)
                CommitTransactionCommand();
+ 
+       /*
+        * Check a normal user hasn't connected to a superuser reserved slot.
+        * Do this here since we need the user information and that only happens
+        * after we've started bringing the shared memory online. So we wait
+        * until we've registered exit handlers and potentially shut an open
+        * transaction down for an as safety conscious rejection as possible.
+        */
+       if (!superuser() && MyBackendId > MaxBackends - ReservedBackends)
+               elog(ERROR, "Normal user limit exceeded");
  }
  
  /*
Index: src/backend/utils/misc/guc.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/utils/misc/guc.c,v
retrieving revision 1.83
diff -c -r1.83 guc.c
*** src/backend/utils/misc/guc.c        2002/08/18 03:03:25     1.83
--- src/backend/utils/misc/guc.c        2002/08/25 22:27:51
***************
*** 537,547 ****
        /*
         * Note: There is some postprocessing done in PostmasterMain() to make
         * sure the buffers are at least twice the number of backends, so the
!        * constraints here are partially unused.
         */
        {
                { "max_connections", PGC_POSTMASTER }, &MaxBackends,
                DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
        },
  
        {
--- 537,553 ----
        /*
         * Note: There is some postprocessing done in PostmasterMain() to make
         * sure the buffers are at least twice the number of backends, so the
!        * constraints here are partially unused. Also the super user reserved
!        * number is forced to less than the max backends number there.
         */
        {
                { "max_connections", PGC_POSTMASTER }, &MaxBackends,
                DEF_MAXBACKENDS, 1, INT_MAX, NULL, NULL
+       },
+ 
+       {
+               { "superuser_reserved_connections", PGC_POSTMASTER }, 
+&ReservedBackends,
+               2, 0, INT_MAX, NULL, NULL
        },
  
        {
Index: src/backend/utils/misc/postgresql.conf.sample
===================================================================
RCS file: 
/projects/cvsroot/pgsql-server/src/backend/utils/misc/postgresql.conf.sample,v
retrieving revision 1.45
diff -c -r1.45 postgresql.conf.sample
*** src/backend/utils/misc/postgresql.conf.sample       2002/08/18 03:03:26     1.45
--- src/backend/utils/misc/postgresql.conf.sample       2002/08/25 22:27:51
***************
*** 31,36 ****
--- 31,37 ----
  #ssl = false
  
  #max_connections = 32
+ #superuser_reserved_connections = 2
  
  #port = 5432 
  #hostname_lookup = false
Index: src/include/miscadmin.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/miscadmin.h,v
retrieving revision 1.106
diff -c -r1.106 miscadmin.h
*** src/include/miscadmin.h     2002/06/20 20:29:42     1.106
--- src/include/miscadmin.h     2002/08/25 22:27:52
***************
*** 179,184 ****
--- 179,185 ----
  extern bool EnableSSL;
  extern bool SilentMode;
  extern int    MaxBackends;
+ extern int    ReservedBackends;
  extern int    NBuffers;
  extern int    PostPortNumber;
  extern int    Unix_socket_permissions;

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]

Reply via email to