dnl ----------------------------------------------------------------
dnl Libevent
if test $ol_enable_balancer != no ; then
- AC_CHECK_LIB(event_core, evconnlistener_set_error_cb,
+ AC_CHECK_LIB(event_extra, evdns_base_new,
[have_libevent=yes
- LEVENT_LIBS="$LEVENT_LIBS -levent_core"],
- [AC_CHECK_LIB(event, evconnlistener_set_error_cb,
+ LEVENT_LIBS="$LEVENT_LIBS -levent_core -levent_extra"],
+ [AC_CHECK_LIB(event, evdns_base_new,
[have_libevent=yes
LEVENT_LIBS="$LEVENT_LIBS -levent"],
[have_libevent=no])])
if test $have_libevent = yes ; then
AC_DEFINE(HAVE_LIBEVENT, 1, [define if you have -levent])
- elif test $ol_enable_balancer = yes ; then
- AC_MSG_ERROR([You need libevent 2.0 or later to build the load balancer])
+ else
+ AC_MSG_ERROR([You need libevent 2.0 or later with DNS support to build the load balancer])
fi
fi
#include <ac/unistd.h>
#include <event2/event.h>
+#include <event2/dns.h>
#include <event2/listener.h>
#include "slap.h"
static volatile sig_atomic_t listening = 1; /* 0 when slap_listeners closed */
static ldap_pvt_thread_t listener_tid, *daemon_tid;
+struct evdns_base *dnsbase;
+
#ifndef SLAPD_LISTEN_BACKLOG
#define SLAPD_LISTEN_BACKLOG 1024
#endif /* ! SLAPD_LISTEN_BACKLOG */
{
int rc;
int tid = (ldap_pvt_thread_t *)ptr - daemon_tid;
- struct event_base *base;
+ struct event_base *base = slap_daemon[tid].base;
struct event *event;
- base = event_base_new();
- if ( !base ) {
- Debug( LDAP_DEBUG_ANY, "slapd_daemon_task: "
- "failed to acquire event base\n" );
- return (void *)-1;
- }
- slap_daemon[tid].base = base;
-
event = event_new( base, -1, EV_WRITE, daemon_wakeup_cb, ptr );
if ( !event ) {
Debug( LDAP_DEBUG_ANY, "slapd_daemon_task: "
slapd_daemon( struct event_base *daemon_base )
{
int i, rc;
+ Backend *b;
+ struct event_base *base;
assert( daemon_base != NULL );
+ dnsbase = evdns_base_new( daemon_base,
+ EVDNS_BASE_INITIALIZE_NAMESERVERS |
+ EVDNS_BASE_DISABLE_WHEN_INACTIVE );
+ if ( !dnsbase ) {
+ Debug( LDAP_DEBUG_ANY, "lloadd startup: "
+ "failed to set up for async name resolution\n" );
+ return -1;
+ }
+
if ( slapd_daemon_threads > SLAPD_MAX_DAEMON_THREADS )
slapd_daemon_threads = SLAPD_MAX_DAEMON_THREADS;
}
for ( i = 0; i < slapd_daemon_threads; i++ ) {
+ base = event_base_new();
+ if ( !base ) {
+ Debug( LDAP_DEBUG_ANY, "lloadd startup: "
+ "failed to acquire event base for an I/O thread\n" );
+ return -1;
+ }
+ slap_daemon[i].base = base;
+
ldap_pvt_thread_mutex_init( &slap_daemon[i].sd_mutex );
/* threads that handle client and upstream sockets */
rc = ldap_pvt_thread_create(
}
}
+ LDAP_STAILQ_FOREACH ( b, &backend, b_next ) {
+ rc = backend_connect( b );
+ if ( rc ) {
+ return rc;
+ }
+ }
+
lloadd_inited = 1;
rc = event_base_dispatch( daemon_base );
Debug( LDAP_DEBUG_ANY, "lloadd shutdown: "
errno = save_errno;
}
+struct event_base *
+slap_get_base( ber_socket_t s )
+{
+ int tid = DAEMON_ID(s);
+ return slap_daemon[tid].base;
+}
+
Listener **
slapd_get_listeners( void )
{
struct config_args_s; /* config.h */
struct config_reply_s; /* config.h */
+/*
+ * backend.c
+ */
+
+LDAP_SLAPD_F (int) backend_connect( Backend *b );
+
/*
* ch_malloc.c
*/
*/
LDAP_SLAPD_F (Connection *) connection_init( ber_socket_t s, const char *peername, int use_tls );
LDAP_SLAPD_F (Connection *) client_init( ber_socket_t s, Listener *url, const char *peername, struct event_base *base, int use_tls );
+LDAP_SLAPD_F (Connection *) upstream_init( ber_socket_t s, Backend *b );
LDAP_SLAPD_F (void) connection_destroy( Connection *c );
/*
LDAP_SLAPD_F (int) slapd_daemon_destroy( void );
LDAP_SLAPD_F (int) slapd_daemon( struct event_base *daemon_base );
LDAP_SLAPD_F (Listener **) slapd_get_listeners( void );
+LDAP_SLAPD_F (struct event_base *) slap_get_base( ber_socket_t s );
LDAP_SLAPD_F (void) slap_sig_shutdown( evutil_socket_t sig, short what, void *arg );
+LDAP_SLAPD_V (struct evdns_base *) dnsbase;
LDAP_SLAPD_V (volatile sig_atomic_t) slapd_shutdown;
LDAP_SLAPD_V (int) lloadd_inited;
LDAP_SLAPD_V (struct runqueue_s) slapd_rq;