]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/pcache.c
Fix cancel cleanup
[openldap] / servers / slapd / overlays / pcache.c
index 3f4ffd31b9009199287611e9fcc0c1c8ce1b2583..b078908da5f287bb588fa237c100b08c9eb055bd 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2004 The OpenLDAP Foundation.
+ * Copyright 2003-2005 The OpenLDAP Foundation.
  * Portions Copyright 2003 IBM Corporation.
  * Portions Copyright 2003 Symas Corporation.
  * All rights reserved.
@@ -1123,12 +1123,12 @@ proxy_cache_response(
                         * wake it back up
                         */
                        if ( cm->cc_paused ) {
-                               ldap_pvt_thread_mutex_lock( &SLAPD_GLOBAL(runqueue).rq_mutex );
+                               ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
                                if ( cm->cc_paused ) {
                                        cm->cc_paused = 0;
-                                       ldap_pvt_runqueue_resched( &SLAPD_GLOBAL(runqueue), cm->cc_arg, 0 );
+                                       ldap_pvt_runqueue_resched( &slapd_rq, cm->cc_arg, 0 );
                                }
-                               ldap_pvt_thread_mutex_unlock( &SLAPD_GLOBAL(runqueue).rq_mutex );
+                               ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
                        }
                }
 
@@ -1410,19 +1410,21 @@ consistency_check(
        slap_overinst *on = rtask->arg;
        cache_manager *cm = on->on_bi.bi_private;
        query_manager *qm = cm->qm;
-       Operation op = {0};
        Connection conn = {0};
+       char opbuf[OPERATION_BUFFER_SIZE];
+       Operation *op;
 
        SlapReply rs = {REP_RESULT};
        CachedQuery* query, *query_prev;
        int i, return_val, pause = 1;
        QueryTemplate* templ;
 
-       connection_fake_init( &conn, &op, ctx );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, ctx );
 
-       op.o_bd = &cm->db;
-       op.o_dn = cm->db.be_rootdn;
-       op.o_ndn = cm->db.be_rootndn;
+       op->o_bd = &cm->db;
+       op->o_dn = cm->db.be_rootdn;
+       op->o_ndn = cm->db.be_rootndn;
 
        cm->cc_arg = arg;
 
@@ -1430,9 +1432,9 @@ consistency_check(
                templ = qm->templates + i;
                query = templ->query_last;
                if ( query ) pause = 0;
-               op.o_time = slap_get_time();
+               op->o_time = slap_get_time();
                ldap_pvt_thread_mutex_lock(&cm->remove_mutex);
-               while (query && (query->expiry_time < op.o_time)) {
+               while (query && (query->expiry_time < op->o_time)) {
                        ldap_pvt_thread_mutex_lock(&qm->lru_mutex);
                        remove_query(qm, query);
                        ldap_pvt_thread_mutex_unlock(&qm->lru_mutex);
@@ -1445,7 +1447,7 @@ consistency_check(
                        Debug( LDAP_DEBUG_ANY, "Unlock CR index = %d\n",
                                        i, 0, 0 );
                        ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);
-                       return_val = remove_query_data(&op, &rs, &query->q_uuid);
+                       return_val = remove_query_data(op, &rs, &query->q_uuid);
                        Debug( LDAP_DEBUG_ANY, "STALE QUERY REMOVED, SIZE=%d\n",
                                                return_val, 0, 0 );
                        ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
@@ -1464,15 +1466,15 @@ consistency_check(
                }
                ldap_pvt_thread_mutex_unlock(&cm->remove_mutex);
        }
-       ldap_pvt_thread_mutex_lock( &SLAPD_GLOBAL(runqueue).rq_mutex );
-       if ( ldap_pvt_runqueue_isrunning( &SLAPD_GLOBAL(runqueue), rtask )) {
-               ldap_pvt_runqueue_stoptask( &SLAPD_GLOBAL(runqueue), rtask );
+       ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+       if ( ldap_pvt_runqueue_isrunning( &slapd_rq, rtask )) {
+               ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
        }
        /* If there were no queries, defer processing for a while */
        cm->cc_paused = pause;
-       ldap_pvt_runqueue_resched( &SLAPD_GLOBAL(runqueue), rtask, pause );
+       ldap_pvt_runqueue_resched( &slapd_rq, rtask, pause );
 
-       ldap_pvt_thread_mutex_unlock( &SLAPD_GLOBAL(runqueue).rq_mutex );
+       ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
        return NULL;
 }
 
@@ -1726,14 +1728,20 @@ proxy_cache_open(
                }
        }
 
+       /* need to inherit something from the original database... */
+       cm->db.be_def_limit = be->be_def_limit;
+       cm->db.be_limits = be->be_limits;
+       cm->db.be_acl = be->be_acl;
+       cm->db.be_dfltaccess = be->be_dfltaccess;
+
        rc = backend_startup_one( &cm->db );
 
        /* There is no runqueue in TOOL mode */
        if ( slapMode & SLAP_SERVER_MODE ) {
-               ldap_pvt_thread_mutex_lock( &SLAPD_GLOBAL(runqueue).rq_mutex );
-               ldap_pvt_runqueue_insert( &SLAPD_GLOBAL(runqueue), cm->cc_period,
+               ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
+               ldap_pvt_runqueue_insert( &slapd_rq, cm->cc_period,
                        consistency_check, on );
-               ldap_pvt_thread_mutex_unlock( &SLAPD_GLOBAL(runqueue).rq_mutex );
+               ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
 
                /* Cached database must have the rootdn */
                if ( BER_BVISNULL( &cm->db.be_rootndn )
@@ -1762,6 +1770,10 @@ proxy_cache_close(
        query_manager *qm = cm->qm;
        int i, j, rc = 0;
 
+       /* cleanup stuff inherited from the original database... */
+       cm->db.be_limits = NULL;
+       cm->db.be_acl = NULL;
+
        if ( cm->db.bd_info->bi_db_close ) {
                rc = cm->db.bd_info->bi_db_close( &cm->db );
        }