To compile the balancer as a slapd module, pass --enable-balancer=mod to ./configure
Use --enable-balancer(=yes) to compile as standalone server.
dnl BALANCER OPTIONS
AC_ARG_ENABLE(balanceroptions,[
LLOADD (Load Balancer Daemon) Options:])
-OL_ARG_ENABLE(balancer,[ --enable-balancer enable building load balancer], auto)dnl
+OL_ARG_ENABLE(balancer, [AS_HELP_STRING([--enable-balancer], [enable load balancer])],
+ no, [no yes mod])
dnl ----------------------------------------------------------------
AC_ARG_ENABLE(xxliboptions,[
eval "ol_enable_$i=no"
fi
done
+
+ if test $ol_enable_balancer = mod ; then
+ AC_MSG_WARN([slapd disabled, ignoring --enable-balancer=mod argument])
+ ol_enable_balancer=no
+ fi
else
dnl If slapd enabled and loadable module support disabled
dnl then require at least one built-in backend
if test $ol_enable_modules = no; then
- for i in backends overlays $Backends $Overlays; do
+ for i in backends overlays balancer $Backends $Overlays; do
eval "ol_tmp=\$ol_enable_$i"
if test -n "$ol_tmp" && test "$ol_tmp" = mod ; then
AC_MSG_ERROR([--enable-$i=mod requires --enable-modules])
ol_enable_dynamic=yes
fi
-if test $ol_enable_balancer = yes ; then
+if test $ol_enable_balancer != no ; then
dnl Load Balancer was specifically enabled
if test $ol_with_threads = no ; then
AC_MSG_ERROR([Load balancer requires threads])
SLAPD_LIBS=
BALANCER_LIBS=
+BALANCER_INCLUDE=
BUILD_SLAPD=no
BUILD_BALANCER=no
if test "$ol_enable_balancer" != no \
-a "$ol_with_threads" != no \
-a "$have_libevent" = yes ; then
- BUILD_BALANCER=yes
+ if test "$ol_enable_balancer" = mod; then
+ BALANCER_INCLUDE=Makefile.module
+ BUILD_BALANCER=mod
+ else
+ BALANCER_INCLUDE=Makefile.server
+ BUILD_BALANCER=yes
+ fi
fi
if test "$ol_enable_slapi" != no ; then
AC_SUBST(WT_INCS)
AC_SUBST(WT_LIBS)
+AC_SUBST(BALANCER_INCLUDE)
+
dnl ----------------------------------------------------------------
dnl final help output
AC_ARG_WITH(xxinstall,[
[servers/slapd/shell-backends/Makefile:build/top.mk:servers/slapd/shell-backends/Makefile.in:build/srv.mk]
[servers/slapd/slapi/Makefile:build/top.mk:servers/slapd/slapi/Makefile.in:build/lib.mk:build/lib-shared.mk]
[servers/slapd/overlays/Makefile:build/top.mk:servers/slapd/overlays/Makefile.in:build/lib.mk]
-[servers/lloadd/Makefile:build/top.mk:servers/lloadd/Makefile.in:build/srv.mk]
+[servers/lloadd/Makefile:build/top.mk:servers/lloadd/Makefile.in]
+[servers/lloadd/Makefile.server:servers/lloadd/Makefile_server.in:build/srv.mk]
+[servers/lloadd/Makefile.module:servers/lloadd/Makefile_module.in:build/mod.mk]
[tests/Makefile:build/top.mk:tests/Makefile.in:build/dir.mk]
[tests/run]
[tests/progs/Makefile:build/top.mk:tests/progs/Makefile.in:build/rules.mk])
.I production
tree in case multiple trees are available.
.RE
+
+.SH RELATION TO SLAPD(8)
+.B Lloadd
+can be compiled as a
+.B slapd
+loadable module. In that case, it can be loaded as such:
+.LP
+.nf
+.ft tt
+ moduleload path/to/lloadd.la lloadd.conf "listening URLs"
+.ft
+.fi
+
+This enables
+.B lloadd
+to provide additional features through the host slapd process like access to
+run-time statistics in
+.B cn=monitor
+and dynamic configuration from
+.BR cn=config .
+
+The listening sockets specified will be under direct control of
+.B lloadd
+and need to be different from the sockets slapd is configured to listen on.
+Clients connecting to these are completely separate from regular LDAP clients
+connecting to the usual
+.B slapd
+sockets -
+.B lloadd
+clients have no access to slapd databases, similarly,
+.B slapd
+client traffic does not propagate to the
+.B lloadd
+backend servers in any way.
+
.SH EXAMPLES
To start
.I lloadd
LIBEXECDIR/lloadd \-f /var/tmp/lloadd.conf \-d 255
.ft
.fi
+.LP
+To start
+.B lloadd
+as a module inside a slapd process listening on ldap://:1389 and ldaps://,
+put the following in your slapd.conf (or its equivalent in cn=config):
+.LP
+.nf
+.ft tt
+ moduleload lloadd.la /var/tmp/lloadd.conf "ldap://:1389 ldaps://"
+.ft
+.fi
.SH "SEE ALSO"
.BR ldap (3),
.BR lloadd.conf (5),
+.BR slapd-config (5),
+.BR slapd-monitor (5),
.BR slapd (8).
.LP
"OpenLDAP Administrator's Guide" (http://www.OpenLDAP.org/doc/admin/)
## top-level directory of the distribution or, alternatively, at
## <http://www.OpenLDAP.org/license.html>.
-PROGRAMS = lloadd
-XPROGRAMS = slloadd
XSRCS = version.c
NT_SRCS = nt_svc.c
NT_OBJS = nt_svc.o ../../libraries/liblutil/slapdmsg.res
-SRCS = main.c globals.c backend.c bind.c config.c connection.c client.c \
- daemon.c ch_malloc.c init.c operation.c user.c sl_malloc.c \
- upstream.c value.c libevent_support.c extended.c \
+SRCS = backend.c bind.c config.c connection.c client.c \
+ daemon.c extended.c operation.c \
+ upstream.c libevent_support.c \
$(@PLAT@_SRCS)
-OBJS = $(patsubst %.c,%.o,$(SRCS)) $(@PLAT@_OBJS)
-LDAP_INCDIR= ../../include -I$(srcdir)
+LDAP_INCDIR= ../../include -I$(srcdir) -I$(srcdir)/../slapd
LDAP_LIBDIR= ../../libraries
-BUILD_OPT = "--enable-balancer"
-BUILD_SRV = @BUILD_BALANCER@
-
-all-local-srv: $(PROGRAMS)
# $(LTHREAD_LIBS) must be last!
XLIBS = $(LLOADD_L)
LLOADD_DEPENDS = $(@PLAT@_DEPENDS)
LLOADD_OBJECTS = $(@PLAT@_OBJECTS)
-lloadd: $(LLOADD_DEPENDS) version.o
- $(LTLINK) -o $@ $(OBJS) version.o $(LIBS)
-
-slloadd: version.o
- $(LTLINK) -static -o $@ $(OBJS) version.o $(LIBS)
-
-version.c: Makefile
- @-$(RM) $@
- $(MKVERSION) -s -n Versionstr lloadd > $@
-
-version.o: version.c $(OBJS) $(LLOADD_L)
+include @BALANCER_INCLUDE@
-install-local-srv: FORCE
- -$(MKDIR) $(DESTDIR)$(libexecdir)
- @-$(INSTALL) -m 700 -d $(DESTDIR)$(localstatedir)/openldap-lloadd
- @( \
- for prg in $(PROGRAMS); do \
- $(LTINSTALL) $(INSTALLFLAGS) $(STRIP) -m 755 $$prg$(EXEEXT) \
- $(DESTDIR)$(libexecdir); \
- done \
- )
--- /dev/null
+# Makefile.in for Load Balancer
+# $OpenLDAP$
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
+##
+## Copyright 1998-2020 The OpenLDAP Foundation.
+## All rights reserved.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted only as authorized by the OpenLDAP
+## Public License.
+##
+## A copy of this license is available in the file LICENSE in the
+## top-level directory of the distribution or, alternatively, at
+## <http://www.OpenLDAP.org/license.html>.
+
+
+XSRCS = version.c
+
+NT_SRCS = nt_svc.c
+NT_OBJS = nt_svc.o ../../libraries/liblutil/slapdmsg.res
+
+SRCS += module_init.c
+
+OBJS = $(patsubst %.c,%.lo,$(SRCS)) $(@PLAT@_OBJS)
+
+BUILD_OPT = "--enable-balancer=mod"
+BUILD_MOD = @BUILD_BALANCER@
+
+LIBBASE=lloadd
+
+# $(LTHREAD_LIBS) must be last!
+XLIBS = $(LLOADD_L)
+XXLIBS = $(LLOADD_LIBS) $(SECURITY_LIBS) $(LUTIL_LIBS)
+XXXLIBS = $(LTHREAD_LIBS)
+
+NT_DEPENDS = slapd.exp
+NT_OBJECTS = slapd.exp symdummy.o $(LLOADD_OBJS) version.o
+
+UNIX_DEPENDS = version.o $(LLOADD_L)
+UNIX_OBJECTS = $(OBJS) version.o
+
+LLOADD_DEPENDS = $(@PLAT@_DEPENDS)
+LLOADD_OBJECTS = $(@PLAT@_OBJECTS)
+LINK_LIBS=$(LLOADD_LIBS)
+MOD_DEFS = -DSLAPD_IMPORT -DBALANCER_MODULE
--- /dev/null
+# Makefile.in for Load Balancer
+# $OpenLDAP$
+## This work is part of OpenLDAP Software <http://www.openldap.org/>.
+##
+## Copyright 1998-2020 The OpenLDAP Foundation.
+## All rights reserved.
+##
+## Redistribution and use in source and binary forms, with or without
+## modification, are permitted only as authorized by the OpenLDAP
+## Public License.
+##
+## A copy of this license is available in the file LICENSE in the
+## top-level directory of the distribution or, alternatively, at
+## <http://www.OpenLDAP.org/license.html>.
+
+PROGRAMS = lloadd
+XPROGRAMS = slloadd
+
+XSRCS = version.c
+
+NT_SRCS = nt_svc.c
+NT_OBJS = nt_svc.o ../../libraries/liblutil/slapdmsg.res
+
+SRCS += main.c init.c value.c \
+ ch_malloc.c sl_malloc.c user.c
+
+OBJS = $(patsubst %.c,%.o,$(SRCS)) $(@PLAT@_OBJS)
+
+BUILD_OPT = "--enable-balancer"
+BUILD_SRV = @BUILD_BALANCER@
+
+all-local-srv: $(PROGRAMS)
+
+# $(LTHREAD_LIBS) must be last!
+XLIBS = $(LLOADD_L)
+XXLIBS = $(LLOADD_LIBS) $(SECURITY_LIBS) $(LUTIL_LIBS)
+XXXLIBS = $(LTHREAD_LIBS)
+
+NT_DEPENDS = slapd.exp
+NT_OBJECTS = slapd.exp symdummy.o $(LLOADD_OBJS) version.o
+
+UNIX_DEPENDS = version.o $(LLOADD_L)
+UNIX_OBJECTS = $(OBJS) version.o
+
+LLOADD_DEPENDS = $(@PLAT@_DEPENDS)
+LLOADD_OBJECTS = $(@PLAT@_OBJECTS)
+
+
+lloadd: $(LLOADD_DEPENDS) version.o
+ $(LTLINK) -o $@ $(OBJS) version.o $(LIBS)
+
+slloadd: version.o
+ $(LTLINK) -static -o $@ $(OBJS) version.o $(LIBS)
+
+version.c: Makefile
+ @-$(RM) $@
+ $(MKVERSION) -s -n Versionstr lloadd > $@
+
+version.o: version.c $(OBJS) $(LLOADD_L)
+
+install-local-srv: FORCE
+ -$(MKDIR) $(DESTDIR)$(libexecdir)
+ @-$(INSTALL) -m 700 -d $(DESTDIR)$(localstatedir)/openldap-lloadd
+ @( \
+ for prg in $(PROGRAMS); do \
+ $(LTINSTALL) $(INSTALLFLAGS) $(STRIP) -m 755 $$prg$(EXEEXT) \
+ $(DESTDIR)$(libexecdir); \
+ done \
+ )
lload_libevent_cond_timedwait
};
+#ifndef BALANCER_MODULE
+ /* only necessary if lload is a server, slapd already calls
+ * ldap_pvt_thread_initialize() */
if ( ldap_pvt_thread_initialize() ) {
return -1;
}
+#endif
evthread_set_lock_callbacks( &cbs );
evthread_set_condition_callbacks( &cond_cbs );
--- /dev/null
+/* module_init.c - module initialization functions */
+/* $OpenLDAP$ */
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2020 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
+ */
+/* Portions Copyright (c) 1995 Regents of the University of Michigan.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of Michigan at Ann Arbor. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific prior written permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
+#include "portable.h"
+
+#include <stdio.h>
+
+#include <ac/socket.h>
+#include <ac/string.h>
+#include <ac/time.h>
+
+#include "../servers/slapd/slap.h"
+
+#include "lload.h"
+#include "lber_pvt.h"
+
+#include "ldap_rq.h"
+
+int
+lload_start_daemon()
+{
+ struct event_base *daemon_base = event_base_new();
+ int rc = 0, i;
+ if ( !daemon_base ) {
+ Debug( LDAP_DEBUG_ANY, "lload_start_daemon: "
+ "main event base allocation failed\n" );
+ rc = 1;
+ return rc;
+ }
+
+ rc = lloadd_daemon( daemon_base );
+ return rc;
+}
+
+/* from init.c */
+int
+lload_conn_pool_init()
+{
+ int rc = 0;
+
+ ldap_pvt_thread_mutex_init( &backend_mutex );
+ ldap_pvt_thread_mutex_init( &clients_mutex );
+
+ lload_exop_init();
+ Debug( LDAP_DEBUG_TRACE, "lload_conn_pool_init: "
+ "mutexes initialized.\n" );
+ return rc;
+}
+
+void *
+lload_module_start_daemon( void *ctx, void *arg )
+{
+ lload_start_daemon();
+ return NULL;
+}
+
+int
+init_module( int argc, char *argv[] )
+{
+ if ( slapMode & SLAP_TOOL_MODE ) {
+ return 0;
+ }
+ if ( lload_libevent_init() ) {
+ return -1;
+ }
+ global_host = ldap_pvt_get_fqdn( NULL );
+#ifdef HAVE_TLS
+ if ( ldap_create( &lload_tls_backend_ld ) ) {
+ return -1;
+ }
+#endif /* HAVE_TLS */
+
+ if ( lloadd_daemon_init( argv[1] ) != 0 ) {
+ return -1;
+ }
+ lload_conn_pool_init();
+
+ if ( lload_read_config( argv[0], NULL ) != 0 ) {
+ return -1;
+ }
+
+ ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+ ldap_pvt_runqueue_insert( &slapd_rq, 0, lload_module_start_daemon, NULL,
+ "lload_module_start_daemon", "lloadd" );
+ ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
+ return 0;
+}
BUILD_MDB=@BUILD_MDB@
BUILD_SQL=@BUILD_SQL@
+BUILD_SLAPD=@BUILD_SLAPD@
BUILD_BALANCER=@BUILD_BALANCER@
# test primary backends (default)
lloadd-no:
@echo "run configure with --enable-balancer to run the Load Balancer tests"
-lloadd-yes: FORCE
+lloadd-yes: lloadd-slapd-$(BUILD_SLAPD)
+
+lloadd-slapd-no:
+ @echo "run configure with --enable-slapd to run the Load Balancer tests"
+
+lloadd-slapd-yes: FORCE
@echo "Initiating LDAP tests for the Load Balancer..."
@$(RUN) lloadd-all