ldap/servers/slapd/daemon.c | 16 ++++------------
ldap/servers/slapd/libglobs.c | 32 ++++++++++++++++++++++++++++++++
ldap/servers/slapd/proto-slap.h | 2 ++
ldap/servers/slapd/slap.h | 10 ++++++++++
4 files changed, 48 insertions(+), 12 deletions(-)
New commits:
commit c886ecf49b2546997c9dc16a4656db70a08336a6
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.0
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 101cd75..d6ed7fa 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 ac664a4..7b2de68 100644
--- a/ldap/servers/slapd/libglobs.c
+++ b/ldap/servers/slapd/libglobs.c
@@ -252,6 +252,7 @@ int init_entryusn_global;
int init_disk_monitoring;
int init_disk_logging_critical;
int init_ndn_cache_enabled;
+int init_listen_backlog_size;
#ifdef MEMPOOL_EXPERIMENTAL
int init_mempool_switch;
@@ -1012,6 +1013,10 @@ static struct config_get_and_set {
(void**)&global_slapdFrontendConfig.sasl_max_bufsize,
CONFIG_INT, (ConfigGetFunc)config_get_sasl_maxbufsize,
DEFAULT_SASL_MAXBUFSIZE},
+ {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,
@@ -1439,6 +1444,7 @@ FrontendConfig_init () {
cfg->ndn_cache_max_size = NDN_DEFAULT_SIZE;
cfg->sasl_max_bufsize = SLAPD_DEFAULT_SASL_MAXBUFSIZE;
+ 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;
@@ -6681,6 +6687,32 @@ config_set_default_naming_context(const char *attrname,
return LDAP_SUCCESS;
}
+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 ) {
+ 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 0a90e92..788cd16 100644
--- a/ldap/servers/slapd/proto-slap.h
+++ b/ldap/servers/slapd/proto-slap.h
@@ -395,6 +395,7 @@ int config_set_auditlog_unhashed_pw(const char *attrname, char *value,
char *err
int config_set_ndn_cache_enabled(const char *attrname, char *value, char *errorbuf, int
apply);
int config_set_ndn_cache_max_size(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 );
@@ -556,6 +557,7 @@ char *config_get_allowed_sasl_mechs();
int config_set_allowed_sasl_mechs(const char *attrname, char *value, char *errorbuf, int
apply);
int config_get_schemamod();
int config_get_sasl_maxbufsize();
+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 4026c37..fb4c5ac 100644
--- a/ldap/servers/slapd/slap.h
+++ b/ldap/servers/slapd/slap.h
@@ -2054,6 +2054,15 @@ typedef struct _slapdEntryPoints {
#define CONFIG_NDN_CACHE_SIZE "nsslapd-ndn-cache-max-size"
#define CONFIG_ALLOWED_SASL_MECHS "nsslapd-allowed-sasl-mechanisms"
#define CONFIG_SASL_MAXBUFSIZE "nsslapd-sasl-max-buffer-size"
+#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"
@@ -2249,6 +2258,7 @@ typedef struct _slapdFrontendConfig {
int 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 */
+ int listen_backlog_size; /* size of backlog parameter to PR_Listen */
#ifndef _WIN32
struct passwd *localuserinfo; /* userinfo of localuser */
#endif /* _WIN32 */