1
0
mirror of https://github.com/samba-team/samba.git synced 2025-03-27 22:50:26 +03:00

Disconnect an idle LDAP connection after 150 seconds.

Not strictly a bugfix, but it should considerably reduce the load we
put on LDAP servers given that at least nss_ldap on Linux keeps a
connection open.

And it should also stress our reconnect-code a bit more ;-)

Thanks to metze for this!

Volker
(This used to be commit e68d8eabeb9c64dc45d057619f9b3dd0cd507444)
This commit is contained in:
Volker Lendecke 2003-07-17 11:24:54 +00:00
parent 0fe05982cd
commit 9ec9df5fe4
2 changed files with 46 additions and 1 deletions

View File

@ -132,6 +132,9 @@ struct smbldap_state {
char *bind_secret;
unsigned int num_failures;
time_t last_use;
smb_event_id_t event_id;
};
#endif /* HAVE_LDAP */

View File

@ -5,7 +5,7 @@
Copyright (C) Gerald Carter 2001-2003
Copyright (C) Shahms King 2001
Copyright (C) Andrew Bartlett 2002-2003
Copyright (C) Stefan (metze) Metzmacher 2002
Copyright (C) Stefan (metze) Metzmacher 2002-2003
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -35,6 +35,8 @@
#define SMBLDAP_DONT_PING_TIME 10 /* ping only all 10 seconds */
#define SMBLDAP_NUM_RETRIES 8 /* retry only 8 times */
#define SMBLDAP_IDLE_TIME 150 /* After 2.5 minutes disconnect */
/* attributes used by Samba 2.2 */
@ -925,6 +927,8 @@ int smbldap_search(struct smbldap_state *ldap_state,
smbldap_close(ldap_state);
}
ldap_state->last_use = time(NULL);
SAFE_FREE(utf8_filter);
return rc;
}
@ -954,6 +958,8 @@ int smbldap_modify(struct smbldap_state *ldap_state, const char *dn, LDAPMod *at
smbldap_close(ldap_state);
}
ldap_state->last_use = time(NULL);
SAFE_FREE(utf8_dn);
return rc;
}
@ -983,6 +989,8 @@ int smbldap_add(struct smbldap_state *ldap_state, const char *dn, LDAPMod *attrs
smbldap_close(ldap_state);
}
ldap_state->last_use = time(NULL);
SAFE_FREE(utf8_dn);
return rc;
}
@ -1012,6 +1020,8 @@ int smbldap_delete(struct smbldap_state *ldap_state, const char *dn)
smbldap_close(ldap_state);
}
ldap_state->last_use = time(NULL);
SAFE_FREE(utf8_dn);
return rc;
}
@ -1041,6 +1051,8 @@ int smbldap_extended_operation(struct smbldap_state *ldap_state,
smbldap_close(ldap_state);
}
ldap_state->last_use = time(NULL);
return rc;
}
@ -1071,6 +1083,24 @@ int smbldap_search_suffix (struct smbldap_state *ldap_state, const char *filter,
return rc;
}
static void smbldap_idle_fn(void **data, time_t *interval, time_t now)
{
struct smbldap_state *state = (struct smbldap_state *)(*data);
if (state->ldap_struct == NULL) {
DEBUG(10,("ldap connection not connected...\n"));
return;
}
if ((state->last_use+SMBLDAP_IDLE_TIME) > now) {
DEBUG(10,("ldap connection not idle...\n"));
return;
}
DEBUG(7,("ldap connection idle...closing connection\n"));
smbldap_close(state);
}
/**********************************************************************
Housekeeping
*********************************************************************/
@ -1086,6 +1116,8 @@ void smbldap_free_struct(struct smbldap_state **ldap_state)
SAFE_FREE((*ldap_state)->bind_dn);
SAFE_FREE((*ldap_state)->bind_secret);
smb_unregister_idle_event((*ldap_state)->event_id);
*ldap_state = NULL;
/* No need to free any further, as it is talloc()ed */
@ -1109,6 +1141,16 @@ NTSTATUS smbldap_init(TALLOC_CTX *mem_ctx, const char *location, struct smbldap_
} else {
(*smbldap_state)->uri = "ldap://localhost";
}
(*smbldap_state)->event_id =
smb_register_idle_event(smbldap_idle_fn, (void *)(*smbldap_state),
SMBLDAP_IDLE_TIME);
if ((*smbldap_state)->event_id == SMB_EVENT_ID_INVALID) {
DEBUG(0,("Failed to register LDAP idle event!\n"));
return NT_STATUS_INVALID_HANDLE;
}
return NT_STATUS_OK;
}