[PATCH] ldap rebind sleep

Stefan Metzmacher metze at metzemix.de
Tue Nov 11 23:36:44 GMT 2003


Stefan Metzmacher wrote:

> Hi Guenther, Hi Andrew,
>
> here's the ldap rebind sleep patch
>
> gd: can you test it and report if it works ok,
> because I modified my old version a bit.


Here's a new version
it now hold the timestamp of the last rebind and waits before the next 
search
and compares the timestamp with the current time
and use the MIN() of the timediff and lp_ldap_rebind_sleep() as argument 
of msleep()

-- 

metze

-------------------------------------------
Stefan (metze) Metzmacher <metze at metzemix.de>

-------------- next part --------------
Index: include/smbldap.h
===================================================================
RCS file: /cvsroot/samba/source/include/smbldap.h,v
retrieving revision 1.1.2.8
diff -u -r1.1.2.8 smbldap.h
--- include/smbldap.h	18 Sep 2003 23:53:47 -0000	1.1.2.8
+++ include/smbldap.h	11 Nov 2003 23:05:31 -0000
@@ -137,6 +137,8 @@
 
 	time_t last_use;
 	smb_event_id_t event_id;
+	
+	struct timeval last_rebind;
 };
 
 #endif 	/* HAVE_LDAP */
Index: lib/smbldap.c
===================================================================
RCS file: /cvsroot/samba/source/lib/smbldap.c,v
retrieving revision 1.1.2.18
diff -u -r1.1.2.18 smbldap.c
--- lib/smbldap.c	29 Oct 2003 21:27:59 -0000	1.1.2.18
+++ lib/smbldap.c	11 Nov 2003 23:05:34 -0000
@@ -660,6 +660,9 @@
 		}
 		*methodp = LDAP_AUTH_SIMPLE;
 	}
+
+	gettimeofday(&(ldap_state->last_rebind),NULL);
+		
 	return 0;
 }
 #endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/
@@ -685,7 +688,9 @@
 	    username and password to? */
 
 	rc = ldap_simple_bind_s(ldap_struct, ldap_state->bind_dn, ldap_state->bind_secret);
-	
+
+	gettimeofday(&(ldap_state->last_rebind),NULL);
+
 	return rc;
 }
 #endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/
@@ -905,9 +910,28 @@
 	int 		rc = LDAP_SERVER_DOWN;
 	int 		attempts = 0;
 	char           *utf8_filter;
+	struct timeval	tval;
+	int 		tdiff = 0;
+	int		sleep_time = 0;
 
 	SMB_ASSERT(ldap_state);
 
+	ZERO_STRUCT(tval);
+
+	gettimeofday(&tval,NULL);
+
+	tdiff = (1000000 *(tval.tv_sec - ldap_state->last_rebind.tv_sec) + 
+		(tval.tv_usec - ldap_state->last_rebind.tv_usec))/1000;
+
+	sleep_time = MIN(tdiff,lp_ldap_rebind_sleep());
+	
+	if (sleep_time > 0) {
+		/* we wait for the LDAP replication */
+		DEBUG(0,("smbldap_search: waiting %d msec for LDAP replication.\n",sleep_time));
+		msleep(sleep_time);
+		gettimeofday(&(ldap_state->last_rebind),NULL);
+	}
+
 	if (push_utf8_allocate(&utf8_filter, filter) == (size_t)-1) {
 		return LDAP_NO_MEMORY;
 	}
Index: param/loadparm.c
===================================================================
RCS file: /cvsroot/samba/source/param/loadparm.c,v
retrieving revision 1.397.2.106
diff -u -r1.397.2.106 loadparm.c
--- param/loadparm.c	6 Nov 2003 22:07:12 -0000	1.397.2.106
+++ param/loadparm.c	11 Nov 2003 23:05:44 -0000
@@ -233,6 +233,7 @@
 	char *szLdapFilter;
 	char *szLdapAdminDn;
 	char *szAclCompat;
+	int ldap_rebind_sleep;
 	BOOL ldap_delete_dn;
 	BOOL bMsAddPrinterWizard;
 	BOOL bDNSproxy;
@@ -1074,6 +1075,7 @@
 	{"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED}, 
 	{"ldap passwd sync", P_ENUM, P_GLOBAL, &Globals.ldap_passwd_sync, NULL, enum_ldap_passwd_sync, FLAG_ADVANCED}, 
 	{"ldap delete dn", P_BOOL, P_GLOBAL, &Globals.ldap_delete_dn, NULL, NULL, FLAG_ADVANCED}, 
+	{"ldap rebind sleep", P_INTEGER, P_GLOBAL, &Globals.ldap_rebind_sleep, NULL, NULL, FLAG_ADVANCED},
 
 	{N_("Miscellaneous Options"), P_SEP, P_SEPARATOR}, 
 	{"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED}, 
@@ -1465,6 +1467,7 @@
 	Globals.ldap_ssl = LDAP_SSL_ON;
 	Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
 	Globals.ldap_delete_dn = False;
+	Globals.ldap_rebind_sleep = 500; /* wait 5 msec for replication */
 
 /* these parameters are set to defaults that are more appropriate
    for the increasing samba install base:
@@ -1698,6 +1701,7 @@
 FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
 FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
 FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
+FN_GLOBAL_INTEGER(lp_ldap_rebind_sleep, &Globals.ldap_rebind_sleep)
 FN_GLOBAL_STRING(lp_add_share_cmd, &Globals.szAddShareCommand)
 FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
 FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)


More information about the samba-technical mailing list