summaryrefslogtreecommitdiff
path: root/source3/lib/smbldap.c
diff options
context:
space:
mode:
authorVolker Lendecke <vlendec@samba.org>2003-12-25 22:45:15 +0000
committerVolker Lendecke <vlendec@samba.org>2003-12-25 22:45:15 +0000
commit3dba56747d3d34b6ccfeea24f53e38c1554f8f4a (patch)
treebf530070af1fc3f2571e338aa2d679b1d92d9725 /source3/lib/smbldap.c
parentba1d1842fe7c2e35c9a6835bbdbbe7f4616d408c (diff)
downloadsamba-3dba56747d3d34b6ccfeea24f53e38c1554f8f4a.tar.gz
samba-3dba56747d3d34b6ccfeea24f53e38c1554f8f4a.tar.bz2
samba-3dba56747d3d34b6ccfeea24f53e38c1554f8f4a.zip
This is metze's LDAP rebind sleep patch:
When smb.conf tells us to write to a read-only LDAP replica and we are redirected by the LDAP server, the replication might take some seconds, especially over slow links. This patch delays the next read after a rebind for 'ldap rebind sleep' milliseconds. Metze, thanks for your patience. Volker (This used to be commit 7293550e3642e2553684a7011084dabb0b78fd24)
Diffstat (limited to 'source3/lib/smbldap.c')
-rw-r--r--source3/lib/smbldap.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/source3/lib/smbldap.c b/source3/lib/smbldap.c
index 20fa4fbc62..9dca043584 100644
--- a/source3/lib/smbldap.c
+++ b/source3/lib/smbldap.c
@@ -661,6 +661,9 @@ static int rebindproc_with_state (LDAP * ld, char **whop, char **credp,
}
*methodp = LDAP_AUTH_SIMPLE;
}
+
+ gettimeofday(&(ldap_state->last_rebind),NULL);
+
return 0;
}
#endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/
@@ -687,6 +690,8 @@ static int rebindproc_connect_with_state (LDAP *ldap_struct,
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)*/
@@ -909,6 +914,29 @@ int smbldap_search(struct smbldap_state *ldap_state,
SMB_ASSERT(ldap_state);
+ if (ldap_state->last_rebind.tv_sec > 0) {
+ struct timeval tval;
+ int tdiff = 0;
+ int sleep_time = 0;
+
+ 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);
+
+ sleep_time = ((1000*lp_ldap_rebind_sleep())-tdiff)/1000;
+
+ if (sleep_time > 0) {
+ /* we wait for the LDAP replication */
+ DEBUG(5,("smbldap_search: waiting %d milliseconds for LDAP replication.\n",sleep_time));
+ msleep(sleep_time);
+ DEBUG(5,("smbldap_search: go on!\n"));
+ ZERO_STRUCT(ldap_state->last_rebind);
+ }
+ }
+
if (push_utf8_allocate(&utf8_filter, filter) == (size_t)-1) {
return LDAP_NO_MEMORY;
}