mirror of
https://github.com/samba-team/samba.git
synced 2025-08-04 08:22:08 +03:00
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 63ffa770b6
)
This commit is contained in:
@ -138,6 +138,8 @@ struct smbldap_state {
|
|||||||
|
|
||||||
time_t last_use;
|
time_t last_use;
|
||||||
smb_event_id_t event_id;
|
smb_event_id_t event_id;
|
||||||
|
|
||||||
|
struct timeval last_rebind;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* HAVE_LDAP */
|
#endif /* HAVE_LDAP */
|
||||||
|
@ -661,6 +661,9 @@ static int rebindproc_with_state (LDAP * ld, char **whop, char **credp,
|
|||||||
}
|
}
|
||||||
*methodp = LDAP_AUTH_SIMPLE;
|
*methodp = LDAP_AUTH_SIMPLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gettimeofday(&(ldap_state->last_rebind),NULL);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/
|
#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);
|
rc = ldap_simple_bind_s(ldap_struct, ldap_state->bind_dn, ldap_state->bind_secret);
|
||||||
|
|
||||||
|
gettimeofday(&(ldap_state->last_rebind),NULL);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
#endif /*defined(LDAP_API_FEATURE_X_OPENLDAP) && (LDAP_API_VERSION > 2000)*/
|
#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);
|
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) {
|
if (push_utf8_allocate(&utf8_filter, filter) == (size_t)-1) {
|
||||||
return LDAP_NO_MEMORY;
|
return LDAP_NO_MEMORY;
|
||||||
}
|
}
|
||||||
|
@ -233,6 +233,7 @@ typedef struct
|
|||||||
char *szLdapAdminDn;
|
char *szLdapAdminDn;
|
||||||
char *szAclCompat;
|
char *szAclCompat;
|
||||||
int ldap_passwd_sync;
|
int ldap_passwd_sync;
|
||||||
|
int ldap_rebind_sleep;
|
||||||
BOOL ldap_delete_dn;
|
BOOL ldap_delete_dn;
|
||||||
BOOL bMsAddPrinterWizard;
|
BOOL bMsAddPrinterWizard;
|
||||||
BOOL bDNSproxy;
|
BOOL bDNSproxy;
|
||||||
@ -1077,6 +1078,7 @@ static struct parm_struct parm_table[] = {
|
|||||||
{"ldap ssl", P_ENUM, P_GLOBAL, &Globals.ldap_ssl, NULL, enum_ldap_ssl, FLAG_ADVANCED},
|
{"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 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 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},
|
{N_("Miscellaneous Options"), P_SEP, P_SEPARATOR},
|
||||||
{"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED},
|
{"add share command", P_STRING, P_GLOBAL, &Globals.szAddShareCommand, NULL, NULL, FLAG_ADVANCED},
|
||||||
@ -1469,6 +1471,7 @@ static void init_globals(void)
|
|||||||
Globals.ldap_ssl = LDAP_SSL_ON;
|
Globals.ldap_ssl = LDAP_SSL_ON;
|
||||||
Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
|
Globals.ldap_passwd_sync = LDAP_PASSWD_SYNC_OFF;
|
||||||
Globals.ldap_delete_dn = False;
|
Globals.ldap_delete_dn = False;
|
||||||
|
Globals.ldap_rebind_sleep = 1000; /* wait 1 sec for replication */
|
||||||
|
|
||||||
/* these parameters are set to defaults that are more appropriate
|
/* these parameters are set to defaults that are more appropriate
|
||||||
for the increasing samba install base:
|
for the increasing samba install base:
|
||||||
@ -1698,6 +1701,7 @@ FN_GLOBAL_STRING(lp_ldap_admin_dn, &Globals.szLdapAdminDn)
|
|||||||
FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
|
FN_GLOBAL_INTEGER(lp_ldap_ssl, &Globals.ldap_ssl)
|
||||||
FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
|
FN_GLOBAL_INTEGER(lp_ldap_passwd_sync, &Globals.ldap_passwd_sync)
|
||||||
FN_GLOBAL_BOOL(lp_ldap_delete_dn, &Globals.ldap_delete_dn)
|
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_add_share_cmd, &Globals.szAddShareCommand)
|
||||||
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
|
FN_GLOBAL_STRING(lp_change_share_cmd, &Globals.szChangeShareCommand)
|
||||||
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
|
FN_GLOBAL_STRING(lp_delete_share_cmd, &Globals.szDeleteShareCommand)
|
||||||
|
Reference in New Issue
Block a user