Hi,

this patch introduces a new configuration flag
replication_reserved_connections to reserve connection slots for
replication in the same way superuser_reserved_connections works for
superusers.

This helps in cases where the application opens connections until
max_connections is reached. A slave would not be able to connect to the
master now and would just be down. With this patch the slave is able to
connect.

This option does not influence the superuser_reserved_connections, so
new slaves are not able to open new connections when the reserved
replication slots are filled.

The only thing this patch is missing are tests. Where should I put them
into the source tree?

thank you,

Stefan Radomski
diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
new file mode 100644
index 6a4d15f..cd6264e
*** a/doc/src/sgml/config.sgml
--- b/doc/src/sgml/config.sgml
*************** include 'filename'
*** 530,535 ****
--- 530,562 ----
        </listitem>
       </varlistentry>
  
+     <varlistentry id="guc-replication_reserved_connections"
+     xreflabel="replication_reserved_connections">
+       <term><varname>replication_reserved_connections</varname></term>
+       (<type>integer</type>)</term>
+       <indexterm>
+        <primary><varname>replication_reserved_connections</> configuration parameter</primary>
+       </indexterm>
+       <listitem>
+        <para>
+         Determines the number of connection <quote>slots</quote> that
+         are reserved for connections by <productname>PostgreSQL</>
+         replication users.  At most <xref linkend="guc-max-connections">
+         connections can ever be active simultaneously.  Whenever the
+         number of active concurrent connections is at least
+         <varname>max_connections</> minus
+         <varname>superuser_reserved_connections</varname> minus
+         <varname>replication_reserved_connections</varname>, new
+         connections will be accepted only for replication and superusers.
+        </para>
+ 
+        <para>
+         The default value is zero connections. The value must be less
+         than the value of <varname>max_connections</varname>. This
+         parameter can only be set at server start.
+        </para>
+     </varlistentry>
+ 
       <varlistentry id="guc-unix-socket-directories" xreflabel="unix_socket_directories">
        <term><varname>unix_socket_directories</varname> (<type>string</type>)</term>
        <indexterm>
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
new file mode 100644
index 496192d..ce37b0d
*** a/src/backend/postmaster/postmaster.c
--- b/src/backend/postmaster/postmaster.c
*************** char	   *ListenAddresses;
*** 224,229 ****
--- 224,238 ----
   * count against the limit.
   */
  int			ReservedBackends;
+ /*
+  * ReservedReplicationBackends is the number of backends reserved for
+  * replication user use. Like ReservedBackends the number will be taken out
+  * of the pool size given by MaxBackends so the number available to
+  * non-superusers is
+  * (MaxBackends - ReservedBackends - ReservedReplicationBackends).
+  * This option does not block superusers.
+  */
+ int			ReservedReplicationBackends;
  
  /* The socket(s) we're listening to. */
  #define MAXLISTEN	64
diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c
new file mode 100644
index 2c7f0f1..d0f8f91
*** a/src/backend/utils/init/postinit.c
--- b/src/backend/utils/init/postinit.c
*************** InitPostgres(const char *in_dbname, Oid 
*** 700,707 ****
  	}
  
  	/*
! 	 * The last few connections slots are reserved for superusers. Although
! 	 * replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
  	 * interactive use.
  	 */
--- 700,716 ----
  	}
  
  	/*
! 	 * The last few connections slots are reserved for superusers and replication.
! 	 */
! 	if (!am_superuser &&
! 		(ReservedReplicationBackends > 0 || ReservedBackends > 0) &&
! 		!HaveNFreeProcs(ReservedReplicationBackends + ReservedBackends))
! 		ereport(FATAL,
! 				(errcode(ERRCODE_TOO_MANY_CONNECTIONS),
! 				 errmsg("remaining connection slots are reserved for replication and superuser connections")));
! 
! 	/*
! 	 * Although replication connections currently require superuser privileges, we
  	 * don't allow them to consume the reserved slots, which are intended for
  	 * interactive use.
  	 */
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
new file mode 100644
index 5aefd1b..b03d722
*** a/src/backend/utils/misc/guc.c
--- b/src/backend/utils/misc/guc.c
*************** static struct config_int ConfigureNamesI
*** 1633,1638 ****
--- 1633,1647 ----
  		3, 0, MAX_BACKENDS,
  		NULL, NULL, NULL
  	},
+ 	{
+ 		{"replication_reserved_connections", PGC_POSTMASTER, CONN_AUTH_SETTINGS,
+ 			gettext_noop("Sets the number of connection slots reserved for replication."),
+ 			NULL
+ 		},
+ 		&ReservedReplicationBackends,
+ 		1, 0, MAX_BACKENDS,
+ 		NULL, NULL, NULL
+ 	},
  
  	/*
  	 * We sometimes multiply the number of shared buffers by two without
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
new file mode 100644
index d69a02b..0be67af
*** a/src/backend/utils/misc/postgresql.conf.sample
--- b/src/backend/utils/misc/postgresql.conf.sample
***************
*** 65,70 ****
--- 65,71 ----
  # Note:  Increasing max_connections costs ~400 bytes of shared memory per
  # connection slot, plus lock space (see max_locks_per_transaction).
  #superuser_reserved_connections = 3	# (change requires restart)
+ #replication_reserved_connections = 0	# (change requires restart)
  #unix_socket_directories = '/tmp'	# comma-separated list of directories
  					# (change requires restart)
  #unix_socket_group = ''			# (change requires restart)
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
new file mode 100644
index c090595..dd2f049
*** a/src/include/postmaster/postmaster.h
--- b/src/include/postmaster/postmaster.h
***************
*** 16,21 ****
--- 16,22 ----
  /* GUC options */
  extern bool EnableSSL;
  extern int	ReservedBackends;
+ extern int	ReservedReplicationBackends;
  extern int	PostPortNumber;
  extern int	Unix_socket_permissions;
  extern char *Unix_socket_group;
-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

Reply via email to