[Date Prev][Date Next]
[Chronological]
[Thread]
[Top]
Multiple master LDAP servers
> Hi,
> I have modified OpenLDAP-1.02 to support multiple master LDAP
> servers.
> I did this by changing slapd to monitor a second port that will
> not log entries to
> the replog. Each slurpd daemon is then pointed to the secondary
> port so that
> no replication entries will be made. This resloves the problem
> of one LDAP server
> sending the same changes back to the originator.
>
> slapd performs exactly as before if no replicant port is
> specified.
>
>
> slapd -p 389 -r 390 -f slapd.conf
>
> No replication entries will be made for any changes made on port
> 390.
> The replicant port must be specified on the command line for
> slapd to
> open the second port.
>
> Below is the context diff from release version 1.02
>
> Any comments or suggestions?
> Since this is my first time sending out code modifications.
>
> rwroth@netdox.com
>
>
>
>
>
>
> diff -c servers/slapd/add.c ../myldap/servers/slapd/add.c
> *** servers/slapd/add.c Tue Aug 18 18:30:57 1998
> --- ../myldap/servers/slapd/add.c Mon Oct 5 09:51:03 1998
> ***************
> *** 25,30 ****
> --- 25,34 ----
> extern pthread_mutex_t currenttime_mutex;
> extern int global_lastmod;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + extern int Replicantport;
> + /* End rwroth */
> +
> static void add_created_attrs();
>
> void
> ***************
> *** 126,132 ****
> add_created_attrs( op, e );
> }
> if ( (*be->be_add)( be, conn, op, e ) == 0 ) {
> ! replog( be, LDAP_REQ_ADD, e->e_dn, e, 0
> );
> }
>
> } else {
> --- 130,140 ----
> add_created_attrs( op, e );
> }
> if ( (*be->be_add)( be, conn, op, e ) == 0 ) {
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( conn->port != Replicantport )
> ! /* End rwroth */
> ! replog( be, LDAP_REQ_ADD,
> e->e_dn,
> ! e, 0 );
> }
>
> } else {
> diff -c servers/slapd/daemon.c ../myldap/servers/slapd/daemon.c
> *** servers/slapd/daemon.c Sat Sep 5 12:39:31 1998
> --- ../myldap/servers/slapd/daemon.c Tue Oct 6 10:36:00 1998
> ***************
> *** 55,60 ****
> --- 55,64 ----
> extern int g_argc;
> extern char **g_argv;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + extern int Replicantport;
> + /* End rwroth */
> +
> int dtblsize;
> Connection *c;
>
> ***************
> *** 76,81 ****
> --- 80,94 ----
> fd_set writefds;
> FILE *fp;
> int on = 1;
> + /*
> + * rwroth@netdox.com 10/05/1998
> + * tcpr- Replicant tcp socket, tcpc Current socket connection
> + * source = replicant or slapd (for debug messages)
> + */
> + int tcpr, tcpc;
> + char *source;
> + struct sockaddr_in raddr;
> + /* End rwroth */
>
> #ifdef USE_SYSCONF
> dtblsize = sysconf( _SC_OPEN_MAX );
> ***************
> *** 148,153 ****
> --- 161,211 ----
> exit( 1 );
> }
>
> + /* rwroth@netdox.com 10/05/1998 */
> + if ( Replicantport ) {
> + if ( (tcpr = socket( AF_INET, SOCK_STREAM, 0 )) == -1 )
> {
> + Debug( LDAP_DEBUG_ANY,
> + "replicant: socket() failed errno %d (%s)",
> + errno, errno > -1 && errno < sys_nerr ?
> + sys_errlist[errno] : "unknown", 0 );
> +
> + exit( 1 );
> + }
> +
> + i = 1;
> + if ( setsockopt( tcpr, SOL_SOCKET, SO_REUSEADDR, (char
> *) &i,
> + sizeof(i) ) == -1 ) {
> + Debug( LDAP_DEBUG_ANY,
> + "replicant: setsockopt() failed errno %d
> (%s)",
> + errno, errno > -1 && errno < sys_nerr ?
> + sys_errlist[errno] : "unknown", 0 );
> + }
> +
> + (void) memset( (void *) &raddr, '\0', sizeof(addr) );
> + raddr.sin_family = AF_INET;
> + raddr.sin_addr.s_addr = INADDR_ANY;
> + raddr.sin_port = htons( Replicantport );
> + if ( bind( tcpr, (struct sockaddr *) &raddr,
> + sizeof(raddr) ) == -1 ) {
> + Debug( LDAP_DEBUG_ANY,
> + "replicant: bind() failed errno %d (%s)\n",
> + errno, errno > -1 && errno < sys_nerr ?
> + sys_errlist[errno] : "unknown", 0 );
> +
> + exit( 1 );
> + }
> +
> + if ( listen( tcpr, 5 ) == -1 ) {
> + Debug( LDAP_DEBUG_ANY,
> + "replicant: listen() failed errno %d (%s)",
> + errno, errno > -1 && errno < sys_nerr ?
> + sys_errlist[errno] : "unknown", 0 );
> +
> + exit( 1 );
> + }
> + }
> + /* End rwroth */
> +
> (void) SIGNAL( SIGPIPE, SIG_IGN );
> #ifdef linux
> /*
> ***************
> *** 164,170 ****
> (void) SIGNAL( SIGINT, (void *) set_shutdown );
> (void) SIGNAL( SIGHUP, (void *) set_shutdown );
>
> ! Debug( LDAP_DEBUG_ANY, "slapd starting\n", 0, 0, 0 );
> #ifdef SLAPD_PIDFILE
> if ( (fp = fopen( SLAPD_PIDFILE, "w" )) != NULL ) {
> fprintf( fp, "%d\n", getpid() );
> --- 222,238 ----
> (void) SIGNAL( SIGINT, (void *) set_shutdown );
> (void) SIGNAL( SIGHUP, (void *) set_shutdown );
>
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( Replicantport ) {
> ! Debug( LDAP_DEBUG_ANY,
> ! "slapd starting port %d, Replicant port %d\n",
> ! port, Replicantport, 0 );
> ! }
> ! else {
> ! Debug( LDAP_DEBUG_ANY, "slapd starting port %d\n", port,
> 0, 0 );
> ! }
> ! /* End rwroth */
> !
> #ifdef SLAPD_PIDFILE
> if ( (fp = fopen( SLAPD_PIDFILE, "w" )) != NULL ) {
> fprintf( fp, "%d\n", getpid() );
> ***************
> *** 195,205 ****
> FD_ZERO( &readfds );
> FD_SET( tcps, &readfds );
>
> pthread_mutex_lock( &active_threads_mutex );
> - Debug( LDAP_DEBUG_CONNS,
> - "listening for connections on %d, activity on:",
> - tcps, 0, 0 );
>
> pthread_mutex_lock( &new_conn_mutex );
> for ( i = 0; i < dtblsize; i++ ) {
> if ( c[i].c_sb.sb_sd != -1 ) {
> --- 263,289 ----
> FD_ZERO( &readfds );
> FD_SET( tcps, &readfds );
>
> + /* rwroth@netdox.com 10/05/1998 */
> + if ( Replicantport ) {
> + FD_SET( tcpr, &readfds );
> + }
> + /* End rwroth */
> +
> pthread_mutex_lock( &active_threads_mutex );
>
> + /* rwroth@netdox.com 10/05/1998 */
> + if ( Replicantport ) {
> + Debug( LDAP_DEBUG_CONNS,
> + "listening for connections on %d/%d,
> activity on:",
> + tcps, tcpr, 0 );
> + }
> + else {
> + Debug( LDAP_DEBUG_CONNS,
> + "listening for connections on %d, activity
> on:",
> + tcps, 0, 0 );
> + }
> + /* End rwroth */
> +
> pthread_mutex_lock( &new_conn_mutex );
> for ( i = 0; i < dtblsize; i++ ) {
> if ( c[i].c_sb.sb_sd != -1 ) {
> ***************
> *** 217,222 ****
> --- 301,307 ----
>
> zero.tv_sec = 0;
> zero.tv_usec = 0;
> +
> Debug( LDAP_DEBUG_CONNS, "before select active_threads
> %d\n",
> active_threads, 0, 0 );
> #if defined(PTHREAD_PREEMPTIVE) || defined(NO_THREADS)
> ***************
> *** 250,275 ****
>
> /* new connection */
> pthread_mutex_lock( &new_conn_mutex );
> if ( FD_ISSET( tcps, &readfds ) ) {
> len = sizeof(from);
> ! if ( (ns = accept( tcps, (struct sockaddr *)
> &from,
> &len )) == -1 ) {
> Debug( LDAP_DEBUG_ANY,
> ! "accept() failed errno %d (%s)",
> errno,
> errno > -1 && errno < sys_nerr ?
> ! sys_errlist[errno] : "unknown", 0 );
> pthread_mutex_unlock( &new_conn_mutex );
> continue;
> }
> if ( ioctl( ns, FIONBIO, (caddr_t) &on ) == -1 )
> {
> Debug( LDAP_DEBUG_ANY,
> ! "FIONBIO ioctl on %d failed\n", ns,
> 0, 0 );
> }
>
> c[ns].c_sb.sb_sd = ns;
> - Debug( LDAP_DEBUG_CONNS, "new connection on
> %d\n", ns,
> - 0, 0 );
>
> pthread_mutex_lock( &ops_mutex );
> c[ns].c_connid = num_conns++;
> pthread_mutex_unlock( &ops_mutex );
> --- 335,394 ----
>
> /* new connection */
> pthread_mutex_lock( &new_conn_mutex );
> +
> + /* rwroth@netdox.com 10/05/1998 */
> + tcpc = (int)NULL;
> + /* End rwroth */
> if ( FD_ISSET( tcps, &readfds ) ) {
> + tcpc = tcps;
> + source = "slapd";
> + }
> + /* rwroth@netdox.com 10/05/1998 */
> + else if ( Replicantport ) {
> + if ( FD_ISSET( tcpr, &readfds ) ) {
> + tcpc = tcpr;
> + source = "replicant";
> + }
> + }
> +
> + if ( tcpc ) {
> + /* End rwroth */
> len = sizeof(from);
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( (ns = accept( tcpc, (struct sockaddr *)
> &from,
> &len )) == -1 ) {
> Debug( LDAP_DEBUG_ANY,
> ! "%s: accept() failed errno %d (%s)",
> ! source, errno,
> errno > -1 && errno < sys_nerr ?
> ! sys_errlist[errno] : "unknown" );
> ! /* End rwroth */
> !
> pthread_mutex_unlock( &new_conn_mutex );
> continue;
> }
> if ( ioctl( ns, FIONBIO, (caddr_t) &on ) == -1 )
> {
> +
> + /* rwroth@netdox.com 10/05/1998 */
> Debug( LDAP_DEBUG_ANY,
> ! "%s: FIONBIO ioctl on %d failed\n",
> ! source, ns, 0 );
> ! /* End rwroth */
> }
> + /* rwroth@netdox.com 10/05/1998 */
> + if ( tcpc == tcpr )
> + c[ns].port = Replicantport;
> + else
> + c[ns].port = port;
> + /* End rwroth */
>
> c[ns].c_sb.sb_sd = ns;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + Debug( LDAP_DEBUG_CONNS,
> + "%s: new connection on %d\n", source, ns, 0
> );
> + /* End rwroth */
> +
> pthread_mutex_lock( &ops_mutex );
> c[ns].c_connid = num_conns++;
> pthread_mutex_unlock( &ops_mutex );
> ***************
> *** 311,323 ****
> STRING_UNKNOWN))
> {
> /* DENY ACCESS */
> Statslog( LDAP_DEBUG_STATS,
> ! "conn=%d fd=%d connection from %s (%s)
> denied.\n",
> c[ns].c_connid, ns,
> ! client_name == NULL ?
> "unknown" : client_name,
> ! client_addr == NULL ?
> "unknown" : client_addr,
> ! 0 );
>
> close(ns);
> pthread_mutex_unlock( &new_conn_mutex );
> continue;
> --- 430,447 ----
> STRING_UNKNOWN))
> {
> /* DENY ACCESS */
> + /* rwroth@netdox.com 10/05/1998 */
> Statslog( LDAP_DEBUG_STATS,
> ! "%s: conn=%d fd=%d connection from %s
> (%s) denied.\n",
> ! source,
> c[ns].c_connid, ns,
> ! client_name == NULL ?
> ! "unknown" : client_name,
> ! client_addr == NULL ?
> ! "unknown" : client_addr, );
>
> + /* End rwroth */
> +
> close(ns);
> pthread_mutex_unlock( &new_conn_mutex );
> continue;
> ***************
> *** 324,336 ****
> }
> #endif /* TCP_WRAPPERS */
>
> Statslog( LDAP_DEBUG_STATS,
> ! "conn=%d fd=%d connection from %s (%s)
> accepted.\n",
> c[ns].c_connid, ns,
> ! client_name == NULL ? "unknown"
> : client_name,
> ! client_addr == NULL ? "unknown"
> : client_addr,
> ! 0 );
>
> if ( c[ns].c_addr != NULL ) {
> free( c[ns].c_addr );
> }
> --- 448,463 ----
> }
> #endif /* TCP_WRAPPERS */
>
> + /* rwroth@netdox.com 10/05/1998 */
> Statslog( LDAP_DEBUG_STATS,
> ! "%s: conn=%d fd=%d connection from %s (%s)
> accepted.\n",
> ! source,
> c[ns].c_connid, ns,
> ! client_name == NULL ? "unknown" :
> client_name,
> ! client_addr == NULL ? "unknown" :
> client_addr );
>
> + /* End rwroth */
> +
> if ( c[ns].c_addr != NULL ) {
> free( c[ns].c_addr );
> }
> ***************
> *** 355,367 ****
> }
> pthread_mutex_unlock( &new_conn_mutex );
>
> ! Debug( LDAP_DEBUG_CONNS, "activity on:", 0, 0, 0 );
> for ( i = 0; i < dtblsize; i++ ) {
> int r, w;
>
> r = FD_ISSET( i, &readfds );
> w = FD_ISSET( i, &writefds );
> ! if ( i != tcps && (r || w) ) {
> Debug( LDAP_DEBUG_CONNS, " %d%s%s", i,
> r ? "r" : "", w ? "w" : "" );
> }
> --- 482,499 ----
> }
> pthread_mutex_unlock( &new_conn_mutex );
>
> ! /* rwroth@netdox.com 10/05/1998 */
> ! Debug( LDAP_DEBUG_CONNS, "%s: activity on:", source, 0,
> 0 );
> ! /* End rwroth */
> !
> for ( i = 0; i < dtblsize; i++ ) {
> int r, w;
>
> r = FD_ISSET( i, &readfds );
> w = FD_ISSET( i, &writefds );
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( i != tcpc && (r || w) ) {
> ! /* End rwroth */
> Debug( LDAP_DEBUG_CONNS, " %d%s%s", i,
> r ? "r" : "", w ? "w" : "" );
> }
> ***************
> *** 369,382 ****
> Debug( LDAP_DEBUG_CONNS, "\n", 0, 0, 0 );
>
> for ( i = 0; i < dtblsize; i++ ) {
> ! if ( i == tcps || (! FD_ISSET( i, &readfds ) &&
> ! FD_ISSET( i, &writefds )) ) {
> continue;
> }
>
> if ( FD_ISSET( i, &writefds ) ) {
> Debug( LDAP_DEBUG_CONNS,
> ! "signaling write waiter on %d\n", i,
> 0, 0 );
>
> pthread_mutex_lock(
> &active_threads_mutex );
> pthread_cond_signal( &c[i].c_wcv );
> --- 501,519 ----
> Debug( LDAP_DEBUG_CONNS, "\n", 0, 0, 0 );
>
> for ( i = 0; i < dtblsize; i++ ) {
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( i == tcpc || (! FD_ISSET( i, &readfds ) &&
> ! /* End rwroth */
> ! FD_ISSET( i, &writefds )) ) {
> continue;
> }
>
> if ( FD_ISSET( i, &writefds ) ) {
> + /* rwroth@netdox.com 10/05/1998 */
> Debug( LDAP_DEBUG_CONNS,
> ! "%s: signaling write waiter on
> %d\n",
> ! source, i, 0 );
> ! /* End rwroth */
>
> pthread_mutex_lock(
> &active_threads_mutex );
> pthread_cond_signal( &c[i].c_wcv );
> ***************
> *** 386,393 ****
> }
>
> if ( FD_ISSET( i, &readfds ) ) {
> Debug( LDAP_DEBUG_CONNS,
> ! "read activity on %d\n", i, 0, 0 );
>
> connection_activity( &c[i] );
> }
> --- 523,532 ----
> }
>
> if ( FD_ISSET( i, &readfds ) ) {
> + /* rwroth@netdox.com 10/05/1998 */
> Debug( LDAP_DEBUG_CONNS,
> ! "%s: read activity on %d\n", source,
> i, 0 );
> ! /* End rwroth */
>
> connection_activity( &c[i] );
> }
> ***************
> *** 397,402 ****
> --- 536,547 ----
> }
>
> close( tcps );
> + /* rwroth@netdox.com 10/05/1998 */
> + if ( Replicantport )
> + close( tcpr );
> +
> + /* End rwroth */
> +
> pthread_mutex_lock( &active_threads_mutex );
> Debug( LDAP_DEBUG_ANY,
> "slapd shutting down - waiting for %d threads to
> terminate\n",
> diff -c servers/slapd/delete.c ../myldap/servers/slapd/delete.c
> *** servers/slapd/delete.c Sat Aug 8 17:43:13 1998
> --- ../myldap/servers/slapd/delete.c Mon Oct 5 09:51:11 1998
> ***************
> *** 20,25 ****
> --- 20,29 ----
>
> extern char *default_referral;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + extern int Replicantport;
> + /* End rwroth */
> +
> void
> do_delete(
> Connection *conn,
> ***************
> *** 73,79 ****
> if ( be->be_updatedn == NULL || strcasecmp(
> be->be_updatedn,
> op->o_dn ) == 0 ) {
> if ( (*be->be_delete)( be, conn, op, dn ) == 0 )
> {
> ! replog( be, LDAP_REQ_DELETE, odn, NULL,
> 0 );
> }
> } else {
> send_ldap_result( conn, op,
> LDAP_PARTIAL_RESULTS, NULL,
> --- 77,87 ----
> if ( be->be_updatedn == NULL || strcasecmp(
> be->be_updatedn,
> op->o_dn ) == 0 ) {
> if ( (*be->be_delete)( be, conn, op, dn ) == 0 )
> {
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( conn->port != Replicantport )
> ! /* End rwroth */
> ! replog( be, LDAP_REQ_DELETE,
> ! odn, NULL, 0 );
> }
> } else {
> send_ldap_result( conn, op,
> LDAP_PARTIAL_RESULTS, NULL,
> diff -c servers/slapd/main.c ../myldap/servers/slapd/main.c
> *** servers/slapd/main.c Thu Aug 20 23:33:42 1998
> --- ../myldap/servers/slapd/main.c Mon Oct 5 09:39:49 1998
> ***************
> *** 19,25 ****
> --- 19,31 ----
> /*
> * read-only global variables or variables only written by the
> listener
> * thread (after they are initialized) - no need to protect them
> with a mutex.
> + * slurpd non replication
> */
> +
> + /* rwroth@netdox.com 10/05/1998 */
> + int Replicantport = 0;
> + /* End rwroth */
> +
> int ldap_debug = 0;
> #ifdef LDAP_DEBUG
> int ldap_syslog = LDAP_DEBUG_STATS;
> ***************
> *** 81,87 ****
> g_argc = argc;
> g_argv = argv;
>
> ! while ( (i = getopt( argc, argv, "d:f:ip:s:u" )) != EOF ) {
> switch ( i ) {
> #ifdef LDAP_DEBUG
> case 'd': /* turn on debugging */
> --- 87,93 ----
> g_argc = argc;
> g_argv = argv;
>
> ! while ( (i = getopt( argc, argv, "d:f:ip:r:s:u" )) != EOF ) {
> switch ( i ) {
> #ifdef LDAP_DEBUG
> case 'd': /* turn on debugging */
> ***************
> *** 138,143 ****
> --- 144,156 ----
> port = atoi( optarg );
> break;
>
> + /*
> + * RWR 10/05/1998 rwroth@netdox.com
> + */
> + case 'r': /* slurpd replicant port on which to
> listen */
> + Replicantport = atoi( optarg );
> + break;
> +
> case 's': /* set syslog level */
> ldap_syslog = atoi( optarg );
> break;
> diff -c servers/slapd/modify.c ../myldap/servers/slapd/modify.c
> *** servers/slapd/modify.c Tue Aug 18 18:30:57 1998
> --- ../myldap/servers/slapd/modify.c Mon Oct 5 09:51:18 1998
> ***************
> *** 25,30 ****
> --- 25,34 ----
> extern pthread_mutex_t currenttime_mutex;
> extern int global_lastmod;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + extern int Replicantport;
> + /* End rwroth */
> +
> static void modlist_free();
> static void add_lastmods();
>
> ***************
> *** 163,169 ****
> add_lastmods( op, &mods );
> }
> if ( (*be->be_modify)( be, conn, op, odn, mods )
> == 0 ) {
> ! replog( be, LDAP_REQ_MODIFY, dn, mods, 0
> );
> }
>
> /* send a referral */
> --- 167,177 ----
> add_lastmods( op, &mods );
> }
> if ( (*be->be_modify)( be, conn, op, odn, mods )
> == 0 ) {
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( conn->port != Replicantport )
> ! /* End rwroth */
> ! replog( be, LDAP_REQ_MODIFY,
> ! dn, mods, 0 );
> }
>
> /* send a referral */
> diff -c servers/slapd/modrdn.c ../myldap/servers/slapd/modrdn.c
> *** servers/slapd/modrdn.c Sat Aug 8 17:43:13 1998
> --- ../myldap/servers/slapd/modrdn.c Mon Oct 5 09:51:24 1998
> ***************
> *** 20,25 ****
> --- 20,29 ----
>
> extern char *default_referral;
>
> + /* rwroth@netdox.com 10/05/1998 */
> + extern int Replicantport;
> + /* End rwroth */
> +
> void
> do_modrdn(
> Connection *conn,
> ***************
> *** 84,91 ****
> op->o_dn ) == 0 ) {
> if ( (*be->be_modrdn)( be, conn, op, dn, newrdn,
> deloldrdn ) == 0 ) {
> ! replog( be, LDAP_REQ_MODRDN, odn,
> newrdn,
> ! deloldrdn );
> }
> } else {
> send_ldap_result( conn, op,
> LDAP_PARTIAL_RESULTS, NULL,
> --- 88,98 ----
> op->o_dn ) == 0 ) {
> if ( (*be->be_modrdn)( be, conn, op, dn, newrdn,
> deloldrdn ) == 0 ) {
> ! /* rwroth@netdox.com 10/05/1998 */
> ! if ( conn->port != Replicantport )
> ! /* End rwroth */
> ! replog( be, LDAP_REQ_MODRDN,
> ! odn, newrdn, deloldrdn );
> }
> } else {
> send_ldap_result( conn, op,
> LDAP_PARTIAL_RESULTS, NULL,
> diff -c servers/slapd/slap.h ../myldap/servers/slapd/slap.h
> *** servers/slapd/slap.h Thu Aug 20 23:33:42 1998
> --- ../myldap/servers/slapd/slap.h Mon Oct 5 09:29:58 1998
> ***************
> *** 238,243 ****
> --- 238,244 ----
> */
>
> typedef struct conn {
> + int port; /* rwroth@netdox.com 10/05/1998
> */
> Sockbuf c_sb; /* ber connection stuff
> */
> char *c_dn; /* current DN bound to this conn
> */
> pthread_mutex_t c_dnmutex; /* mutex for c_dn field
> */