ldap/servers/slapd/daemon.c | 16 ++++------------
ldap/servers/slapd/libglobs.c | 34 +++++++++++++++++++++++++++++++++-
ldap/servers/slapd/proto-slap.h | 2 ++
ldap/servers/slapd/slap.h | 10 ++++++++++
4 files changed, 49 insertions(+), 13 deletions(-)
New commits:
commit 5fae016b4bf70bac303b1a4477ccf5e53aabc89b
Author: Rich Megginson <rmeggins(a)redhat.com>
Date: Tue Apr 16 08:26:03 2013 -0600
Ticket #47377 - make listen backlog size configurable
https://fedorahosted.org/389/ticket/47377
Reviewed by: nkinder (Thanks!)
Branch: 389-ds-base-1.3.1
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
diff --git a/ldap/servers/slapd/daemon.c b/ldap/servers/slapd/daemon.c
index eadb4b5..ea31e30 100644
--- a/ldap/servers/slapd/daemon.c
+++ b/ldap/servers/slapd/daemon.c
@@ -101,14 +101,6 @@
#include "getsocketpeer.h"
#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)
#define SLAPD_WAKEUP_TIMER 250
#else
@@ -1085,7 +1077,7 @@ void slapd_daemon( daemon_ports_t *ports )
/* We are now ready to accept incoming connections */
#if defined( XP_WIN32 )
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;
char addrbuf[ 256 ];
@@ -1101,7 +1093,7 @@ void slapd_daemon( daemon_ports_t *ports )
PRFileDesc **fdesp;
PRNetAddr **nap = ports->n_listenaddr;
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();
char addrbuf[ 256 ];
@@ -1121,7 +1113,7 @@ void slapd_daemon( daemon_ports_t *ports )
PRFileDesc **fdesp;
PRNetAddr **sap = ports->s_listenaddr;
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();
char addrbuf[ 256 ];
@@ -1142,7 +1134,7 @@ void slapd_daemon( daemon_ports_t *ports )
PRFileDesc **fdesp;
PRNetAddr **iap = ports->i_listenaddr;
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();
slapi_log_error(SLAPI_LOG_FATAL, "slapd_daemon",
"listen() on %s failed: error %d (%s)\n",
diff --git a/ldap/servers/slapd/libglobs.c b/ldap/servers/slapd/libglobs.c
index 67f0b3a..dbdf5c2 100644
--- a/ldap/servers/slapd/libglobs.c
+++ b/ldap/servers/slapd/libglobs.c
@@ -256,6 +256,7 @@ slapi_onoff_t init_ndn_cache_enabled;
slapi_onoff_t init_sasl_mapping_fallback;
slapi_onoff_t init_return_orig_type;
slapi_onoff_t init_enable_turbo_mode;
+slapi_int_t init_listen_backlog_size;
#ifdef MEMPOOL_EXPERIMENTAL
slapi_onoff_t init_mempool_switch;
#endif
@@ -1042,7 +1043,11 @@ static struct config_get_and_set {
{CONFIG_ENABLE_TURBO_MODE, config_set_enable_turbo_mode,
NULL, 0,
(void**)&global_slapdFrontendConfig.enable_turbo_mode,
- CONFIG_ON_OFF, (ConfigGetFunc)config_get_enable_turbo_mode,
&init_enable_turbo_mode}
+ CONFIG_ON_OFF, (ConfigGetFunc)config_get_enable_turbo_mode,
&init_enable_turbo_mode},
+ {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
,{CONFIG_MEMPOOL_SWITCH_ATTRIBUTE, config_set_mempool_switch,
NULL, 0,
@@ -1482,6 +1487,7 @@ FrontendConfig_init () {
init_return_orig_type = cfg->return_orig_type = LDAP_OFF;
init_enable_turbo_mode = cfg->enable_turbo_mode = LDAP_ON;
+ init_listen_backlog_size = cfg->listen_backlog_size = DAEMON_LISTEN_SIZE;
#ifdef MEMPOOL_EXPERIMENTAL
init_mempool_switch = cfg->mempool_switch = LDAP_ON;
cfg->mempool_maxfreelist = 1024;
@@ -6912,6 +6918,32 @@ config_set_enable_turbo_mode( const char *attrname, char *value,
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
* is "optimized" for that case because it takes a berval** of values, which
is
diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h
index fff3e7c..2b973be 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -401,6 +401,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_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_listen_backlog_size(const char *attrname, char *value, char *errorbuf, int
apply);
#if !defined(_WIN32) && !defined(AIX)
int config_set_maxdescriptors( const char *attrname, char *value, char *errorbuf, int
apply );
@@ -570,6 +571,7 @@ int config_get_unhashed_pw_switch();
int config_get_sasl_maxbufsize();
int config_get_enable_turbo_mode();
int config_set_enable_turbo_mode(const char *attrname, char *value, char *errorbuf, int
apply);
+int config_get_listen_backlog_size(void);
PLHashNumber hashNocaseString(const void *key);
PRIntn hashNocaseCompare(const void *v1, const void *v2);
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h
index 2d4b108..1420316 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -2077,6 +2077,15 @@ typedef struct _slapdEntryPoints {
#define CONFIG_SASL_MAXBUFSIZE "nsslapd-sasl-max-buffer-size"
#define CONFIG_SEARCH_RETURN_ORIGINAL_TYPE
"nsslapd-search-return-original-type-switch"
#define CONFIG_ENABLE_TURBO_MODE "nsslapd-enable-turbo-mode"
+#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
#define CONFIG_MEMPOOL_SWITCH_ATTRIBUTE "nsslapd-mempool"
@@ -2284,6 +2293,7 @@ typedef struct _slapdFrontendConfig {
slapi_onoff_t minssf_exclude_rootdse; /* ON: minssf is ignored when searching rootdse
*/
size_t maxsasliosize; /* limit incoming SASL IO packet size */
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
struct passwd *localuserinfo; /* userinfo of localuser */
#endif /* _WIN32 */