You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by mi...@apache.org on 2001/08/18 21:18:12 UTC
cvs commit: httpd-2.0/modules/ldap util_ldap.c
minfrin 01/08/18 12:18:12
Modified: . CHANGES
include util_ldap.h
modules/ldap util_ldap.c
Log:
Fixed LDAP cleanup on graceful restarts. LDAP connections are now
cleaned up when the connection pool pool is cleaned up.
Revision Changes Path
1.311 +4 -0 httpd-2.0/CHANGES
Index: CHANGES
===================================================================
RCS file: /home/cvs/httpd-2.0/CHANGES,v
retrieving revision 1.310
retrieving revision 1.311
diff -u -r1.310 -r1.311
--- CHANGES 2001/08/18 17:36:26 1.310
+++ CHANGES 2001/08/18 19:18:12 1.311
@@ -1,5 +1,9 @@
Changes with Apache 2.0.25-dev
+ *) Fixed LDAP cleanup on graceful restarts. LDAP connections are now
+ cleaned up when the connection pool pool is cleaned up.
+ [Graham Leggett]
+
*) Fix a minor issue with Jeff Trawick's mod_include
patch. Without this patch, the code will just allocate
more bytes in get_combined_directive than are needed.
1.2 +12 -1 httpd-2.0/include/util_ldap.h
Index: util_ldap.h
===================================================================
RCS file: /home/cvs/httpd-2.0/include/util_ldap.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- util_ldap.h 2001/08/18 16:52:02 1.1
+++ util_ldap.h 2001/08/18 19:18:12 1.2
@@ -90,6 +90,7 @@
/* Structure representing an LDAP connection */
typedef struct util_ldap_connection_t {
LDAP *ldap;
+ apr_pool_t *pool; /* Pool from which this connection is created */
apr_lock_t *lock; /* Lock to indicate this connection is in use */
int bound; /* Flag to indicate whether this connection is bound yet */
@@ -145,13 +146,23 @@
/**
* Close a connection to an LDAP server
* @param ldc A structure containing the expanded details of the server
- that was connected.
+ * that was connected.
* @tip This function unbinds from the LDAP server, and clears ldc->ldap.
* It is possible to rebind to this server again using the same ldc
* structure, using apr_ldap_open_connection().
* @deffunc util_ldap_close_connection(util_ldap_connection_t *ldc)
*/
void util_ldap_connection_close(util_ldap_connection_t *ldc);
+
+/**
+ * Destroy a connection to an LDAP server
+ * @param ldc A structure containing the expanded details of the server
+ * that was connected.
+ * @tip This function is registered with the pool cleanup to close down the
+ * LDAP connections when the server is finished with them.
+ * @deffunc apr_status_t util_ldap_connection_destroy(util_ldap_connection_t *ldc)
+ */
+apr_status_t util_ldap_connection_destroy(void *param);
/**
* Find a connection in a list of connections
1.2 +26 -14 httpd-2.0/modules/ldap/util_ldap.c
Index: util_ldap.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/ldap/util_ldap.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- util_ldap.c 2001/08/18 16:43:27 1.1
+++ util_ldap.c 2001/08/18 19:18:12 1.2
@@ -182,14 +182,9 @@
/*
- * Closes an LDAP connection by unbinding. Sets the boundas value for the
- * http connection config record and clears the bound dn string in the
- * global connection record. The next time util_ldap_connection_open() is
- * called, the connection will be recreated.
- *
- * If the log parameter is set, adds a debug entry to the log that the
- * server was down and it's reconnecting.
- *
+ * Closes an LDAP connection by unlocking it. The next time
+ * util_ldap_connection_find() is called this connection will be
+ * available for reuse.
*/
void util_ldap_connection_close(util_ldap_connection_t *ldc)
{
@@ -205,19 +200,32 @@
* we don't have to...
*/
- /* unbinding from the LDAP server */
-/* FIXME: add this to pool cleanup instead */
+ /* mark our connection as available for reuse */
+ apr_lock_release(ldc->lock);
+
+}
+
+
/*
+ * Destroys an LDAP connection by unbinding. This function is registered
+ * with the pool cleanup function - causing the LDAP connections to be
+ * shut down cleanly on thread exit.
+ */
+apr_status_t util_ldap_connection_destroy(void *param)
+{
+ util_ldap_connection_t *ldc = param;
+
+ /* unbinding from the LDAP server */
if (ldc->ldap) {
ldap_unbind_s(ldc->ldap);
ldc->bound = 0;
ldc->ldap = NULL;
}
-*/
- /* mark our connection as available for reuse */
+ /* release the lock we were using */
apr_lock_release(ldc->lock);
+ return APR_SUCCESS;
}
@@ -226,8 +234,6 @@
* connected (i.e. ldc->ldap is non-NULL.) Does not bind if already bound.
*
* Returns LDAP_SUCCESS on success; and an error code on failure
- * XXX FIXME: Make these APR error codes, not LDAP error codes
- *
*/
int util_ldap_connection_open(util_ldap_connection_t *ldc)
{
@@ -251,6 +257,11 @@
return -1;
}
+ /* add the cleanup to the pool */
+ apr_pool_cleanup_register(ldc->pool, ldc,
+ util_ldap_connection_destroy,
+ apr_pool_cleanup_null);
+
/* Set the alias dereferencing option */
#if LDAP_VERSION_MAX == 2
ldc->ldap->ld_deref = ldc->deref;
@@ -443,6 +454,7 @@
l = apr_pcalloc(st->pool, sizeof(util_ldap_connection_t));
apr_lock_create(&l->lock, APR_MUTEX, APR_INTRAPROCESS, NULL, st->pool);
apr_lock_acquire(l->lock);
+ l->pool = st->pool;
l->bound = 0;
l->host = apr_pstrdup(st->pool, host);
l->port = port;