Browse Source

Ticket #47377 - make listen backlog size configurable

https://fedorahosted.org/389/ticket/47377
Reviewed by: nkinder (Thanks!)
Branch: master
Fix Description: Add the attribute nsslapd-listen-backlog-size - this controls
the listening socket connection backlog maximum size.  This corresponds to
the backlog parameter of the listen() system call.  The default value is 128.
Platforms tested: RHEL6 x86_64
Flag Day: no
Doc impact: yes - need to doc the new attribute
Rich Megginson 12 years ago
parent
commit
ecaf0677d6

+ 4 - 12
ldap/servers/slapd/daemon.c

@@ -101,14 +101,6 @@
 #include "getsocketpeer.h"
 #include "getsocketpeer.h"
 #endif /* ENABLE_LDAPI */
 #endif /* ENABLE_LDAPI */
 
 
-/*
- * Define the backlog number for use in listen() call.
- * We use the same definition as in ldapserver/include/base/systems.h
- */
-#ifndef DAEMON_LISTEN_SIZE
-#define DAEMON_LISTEN_SIZE 128
-#endif
-
 #if defined (LDAP_IOCP)
 #if defined (LDAP_IOCP)
 #define	SLAPD_WAKEUP_TIMER	250
 #define	SLAPD_WAKEUP_TIMER	250
 #else
 #else
@@ -1085,7 +1077,7 @@ void slapd_daemon( daemon_ports_t *ports )
 	/* We are now ready to accept incoming connections */
 	/* We are now ready to accept incoming connections */
 #if defined( XP_WIN32 )
 #if defined( XP_WIN32 )
 	if ( n_tcps != SLAPD_INVALID_SOCKET
 	if ( n_tcps != SLAPD_INVALID_SOCKET
-				&& listen( n_tcps, DAEMON_LISTEN_SIZE ) == -1 ) {
+				&& listen( n_tcps, config_get_listen_backlog_size() ) == -1 ) {
 		int		oserr = errno;
 		int		oserr = errno;
 		char	addrbuf[ 256 ];
 		char	addrbuf[ 256 ];
 
 
@@ -1101,7 +1093,7 @@ void slapd_daemon( daemon_ports_t *ports )
 		PRFileDesc **fdesp;
 		PRFileDesc **fdesp;
 		PRNetAddr  **nap = ports->n_listenaddr;
 		PRNetAddr  **nap = ports->n_listenaddr;
 		for (fdesp = n_tcps; fdesp && *fdesp; fdesp++, nap++) {
 		for (fdesp = n_tcps; fdesp && *fdesp; fdesp++, nap++) {
-			if ( PR_Listen( *fdesp, DAEMON_LISTEN_SIZE ) == PR_FAILURE ) {
+			if ( PR_Listen( *fdesp, config_get_listen_backlog_size() ) == PR_FAILURE ) {
 				PRErrorCode prerr = PR_GetError();
 				PRErrorCode prerr = PR_GetError();
 				char		addrbuf[ 256 ];
 				char		addrbuf[ 256 ];
 
 
@@ -1121,7 +1113,7 @@ void slapd_daemon( daemon_ports_t *ports )
 		PRFileDesc **fdesp;
 		PRFileDesc **fdesp;
 		PRNetAddr  **sap = ports->s_listenaddr;
 		PRNetAddr  **sap = ports->s_listenaddr;
 		for (fdesp = s_tcps; fdesp && *fdesp; fdesp++, sap++) {
 		for (fdesp = s_tcps; fdesp && *fdesp; fdesp++, sap++) {
-			if ( PR_Listen( *fdesp, DAEMON_LISTEN_SIZE ) == PR_FAILURE ) {
+			if ( PR_Listen( *fdesp, config_get_listen_backlog_size() ) == PR_FAILURE ) {
 				PRErrorCode prerr = PR_GetError();
 				PRErrorCode prerr = PR_GetError();
 				char		addrbuf[ 256 ];
 				char		addrbuf[ 256 ];
 
 
@@ -1142,7 +1134,7 @@ void slapd_daemon( daemon_ports_t *ports )
 		PRFileDesc **fdesp;
 		PRFileDesc **fdesp;
 		PRNetAddr  **iap = ports->i_listenaddr;
 		PRNetAddr  **iap = ports->i_listenaddr;
 		for (fdesp = i_unix; fdesp && *fdesp; fdesp++, iap++) {
 		for (fdesp = i_unix; fdesp && *fdesp; fdesp++, iap++) {
-			if ( PR_Listen(*fdesp, DAEMON_LISTEN_SIZE) == PR_FAILURE) {
+			if ( PR_Listen(*fdesp, config_get_listen_backlog_size()) == PR_FAILURE) {
 				PRErrorCode prerr = PR_GetError();
 				PRErrorCode prerr = PR_GetError();
 				slapi_log_error(SLAPI_LOG_FATAL, "slapd_daemon",
 				slapi_log_error(SLAPI_LOG_FATAL, "slapd_daemon",
 					"listen() on %s failed: error %d (%s)\n",
 					"listen() on %s failed: error %d (%s)\n",

+ 33 - 1
ldap/servers/slapd/libglobs.c

@@ -259,6 +259,7 @@ slapi_onoff_t init_return_orig_type;
 slapi_onoff_t init_enable_turbo_mode;
 slapi_onoff_t init_enable_turbo_mode;
 slapi_onoff_t init_connection_nocanon;
 slapi_onoff_t init_connection_nocanon;
 slapi_int_t init_connection_buffer;
 slapi_int_t init_connection_buffer;
+slapi_int_t init_listen_backlog_size;
 #ifdef MEMPOOL_EXPERIMENTAL
 #ifdef MEMPOOL_EXPERIMENTAL
 slapi_onoff_t init_mempool_switch;
 slapi_onoff_t init_mempool_switch;
 #endif
 #endif
@@ -1057,7 +1058,11 @@ static struct config_get_and_set {
 	{CONFIG_CONNECTION_NOCANON, config_set_connection_nocanon,
 	{CONFIG_CONNECTION_NOCANON, config_set_connection_nocanon,
 	        NULL, 0,
 	        NULL, 0,
 	        (void**)&global_slapdFrontendConfig.connection_nocanon,
 	        (void**)&global_slapdFrontendConfig.connection_nocanon,
-	        CONFIG_ON_OFF, (ConfigGetFunc)config_get_connection_nocanon, &init_connection_nocanon}
+	        CONFIG_ON_OFF, (ConfigGetFunc)config_get_connection_nocanon, &init_connection_nocanon},
+	{CONFIG_LISTEN_BACKLOG_SIZE, config_set_listen_backlog_size,
+		NULL, 0,
+		(void**)&global_slapdFrontendConfig.listen_backlog_size, CONFIG_INT,
+		(ConfigGetFunc)config_get_listen_backlog_size, &init_listen_backlog_size}
 #ifdef MEMPOOL_EXPERIMENTAL
 #ifdef MEMPOOL_EXPERIMENTAL
 	,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
 	,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
 		NULL, 0,
 		NULL, 0,
@@ -1499,6 +1504,7 @@ FrontendConfig_init () {
   init_connection_buffer = cfg->connection_buffer = CONNECTION_BUFFER_ON;
   init_connection_buffer = cfg->connection_buffer = CONNECTION_BUFFER_ON;
   init_connection_nocanon = cfg->connection_nocanon = LDAP_ON;
   init_connection_nocanon = cfg->connection_nocanon = LDAP_ON;
 
 
+  init_listen_backlog_size = cfg->listen_backlog_size = DAEMON_LISTEN_SIZE;
 #ifdef MEMPOOL_EXPERIMENTAL
 #ifdef MEMPOOL_EXPERIMENTAL
   init_mempool_switch = cfg->mempool_switch = LDAP_ON;
   init_mempool_switch = cfg->mempool_switch = LDAP_ON;
   cfg->mempool_maxfreelist = 1024;
   cfg->mempool_maxfreelist = 1024;
@@ -7024,6 +7030,32 @@ config_set_connection_buffer( const char *attrname, char *value,
     return retVal;
     return retVal;
 }
 }
 
 
+int
+config_set_listen_backlog_size( const char *attrname, char *value,
+		char *errorbuf, int apply )
+{
+	slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+	
+	if ( config_value_is_null( attrname, value, errorbuf, 0 )) {
+		return LDAP_OPERATIONS_ERROR;
+	}
+
+	if ( apply ) {
+    		PR_AtomicSet(&slapdFrontendConfig->listen_backlog_size, atoi(value));
+	}
+	return LDAP_SUCCESS;
+}
+
+int
+config_get_listen_backlog_size()
+{
+  slapdFrontendConfig_t *slapdFrontendConfig = getFrontendConfig();
+  int retVal;
+
+  retVal = slapdFrontendConfig->listen_backlog_size;
+  return retVal; 
+}
+
 /*
 /*
  * This function is intended to be used from the dse code modify callback.  It
  * This function is intended to be used from the dse code modify callback.  It
  * is "optimized" for that case because it takes a berval** of values, which is
  * is "optimized" for that case because it takes a berval** of values, which is

+ 2 - 1
ldap/servers/slapd/proto-slap.h

@@ -402,6 +402,7 @@ int config_set_ndn_cache_max_size(const char *attrname, char *value, char *error
 int config_set_unhashed_pw_switch(const char *attrname, char *value, char *errorbuf, int apply); 
 int config_set_unhashed_pw_switch(const char *attrname, char *value, char *errorbuf, int apply); 
 int config_set_return_orig_type_switch(const char *attrname, char *value, char *errorbuf, int apply);
 int config_set_return_orig_type_switch(const char *attrname, char *value, char *errorbuf, int apply);
 int config_set_sasl_maxbufsize(const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_sasl_maxbufsize(const char *attrname, char *value, char *errorbuf, int apply );
+int config_set_listen_backlog_size(const char *attrname, char *value, char *errorbuf, int apply);
 
 
 #if !defined(_WIN32) && !defined(AIX)
 #if !defined(_WIN32) && !defined(AIX)
 int config_set_maxdescriptors( const char *attrname, char *value, char *errorbuf, int apply );
 int config_set_maxdescriptors( const char *attrname, char *value, char *errorbuf, int apply );
@@ -575,7 +576,7 @@ int config_get_connection_buffer();
 int config_set_connection_buffer(const char *attrname, char *value, char *errorbuf, int apply);
 int config_set_connection_buffer(const char *attrname, char *value, char *errorbuf, int apply);
 int config_get_connection_nocanon();
 int config_get_connection_nocanon();
 int config_set_connection_nocanon(const char *attrname, char *value, char *errorbuf, int apply);
 int config_set_connection_nocanon(const char *attrname, char *value, char *errorbuf, int apply);
-
+int config_get_listen_backlog_size(void);
 
 
 PLHashNumber hashNocaseString(const void *key);
 PLHashNumber hashNocaseString(const void *key);
 PRIntn hashNocaseCompare(const void *v1, const void *v2);
 PRIntn hashNocaseCompare(const void *v1, const void *v2);

+ 10 - 0
ldap/servers/slapd/slap.h

@@ -2089,6 +2089,15 @@ typedef struct _slapdEntryPoints {
 #define CONFIG_ENABLE_TURBO_MODE "nsslapd-enable-turbo-mode"
 #define CONFIG_ENABLE_TURBO_MODE "nsslapd-enable-turbo-mode"
 #define CONFIG_CONNECTION_BUFFER "nsslapd-connection-buffer"
 #define CONFIG_CONNECTION_BUFFER "nsslapd-connection-buffer"
 #define CONFIG_CONNECTION_NOCANON "nsslapd-connection-nocanon"
 #define CONFIG_CONNECTION_NOCANON "nsslapd-connection-nocanon"
+#define CONFIG_LISTEN_BACKLOG_SIZE	"nsslapd-listen-backlog-size"
+
+/*
+ * Define the backlog number for use in listen() call.
+ * We use the same definition as in ldapserver/include/base/systems.h
+ */
+#ifndef DAEMON_LISTEN_SIZE
+#define DAEMON_LISTEN_SIZE 128
+#endif
 
 
 #ifdef MEMPOOL_EXPERIMENTAL
 #ifdef MEMPOOL_EXPERIMENTAL
 #define CONFIG_MEMPOOL_SWITCH_ATTRIBUTE "nsslapd-mempool"
 #define CONFIG_MEMPOOL_SWITCH_ATTRIBUTE "nsslapd-mempool"
@@ -2297,6 +2306,7 @@ typedef struct _slapdFrontendConfig {
   slapi_onoff_t minssf_exclude_rootdse; /* ON: minssf is ignored when searching rootdse */
   slapi_onoff_t minssf_exclude_rootdse; /* ON: minssf is ignored when searching rootdse */
   size_t maxsasliosize;         /* limit incoming SASL IO packet size */
   size_t maxsasliosize;         /* limit incoming SASL IO packet size */
   char *anon_limits_dn;		/* template entry for anonymous resource limits */
   char *anon_limits_dn;		/* template entry for anonymous resource limits */
+  slapi_int_t listen_backlog_size;      /* size of backlog parameter to PR_Listen */
 #ifndef _WIN32
 #ifndef _WIN32
   struct passwd *localuserinfo; /* userinfo of localuser */
   struct passwd *localuserinfo; /* userinfo of localuser */
 #endif /* _WIN32 */
 #endif /* _WIN32 */