]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/search.c
Merge remote branch 'origin/mdb.master' into OPENLDAP_REL_ENG_2_4
[openldap] / servers / slapd / back-mdb / search.c
index a0ea03f063c6581801c0c5be3680470352012df3..fda36ebf11d898a312741c75b3a04365987484a0 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2000-2011 The OpenLDAP Foundation.
+ * Copyright 2000-2012 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -98,7 +98,7 @@ static Entry * deref_base (
                        break;
                }
 
-               rs->sr_err = mdb_dn2entry( op, txn, &ndn, &e, 0 );
+               rs->sr_err = mdb_dn2entry( op, txn, NULL, &ndn, &e, 0 );
                if (rs->sr_err) {
                        rs->sr_err = LDAP_ALIAS_PROBLEM;
                        rs->sr_text = "aliasedObject not found";
@@ -160,7 +160,7 @@ static int search_aliases(
        MDB_IDL_ZERO( aliases );
        rs->sr_err = mdb_filter_candidates( op, txn, &af, aliases,
                curscop, visited );
-       if (rs->sr_err != LDAP_SUCCESS) {
+       if (rs->sr_err != LDAP_SUCCESS || MDB_IDL_IS_ZERO( aliases )) {
                return rs->sr_err;
        }
        oldsubs[0] = 1;
@@ -276,6 +276,44 @@ mdb_get_nextid(MDB_cursor *mci, ID *cursor)
        return 0;
 }
 
+static void scope_chunk_free( void *key, void *data )
+{
+       ID2 *p1, *p2;
+       for (p1 = data; p1; p1 = p2) {
+               p2 = p1[0].mval.mv_data;
+               ber_memfree_x(p1, NULL);
+       }
+}
+
+static ID2 *scope_chunk_get( Operation *op )
+{
+       struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
+       ID2 *ret = NULL;
+
+       ldap_pvt_thread_pool_getkey( op->o_threadctx, (void *)scope_chunk_get,
+                       (void *)&ret, NULL );
+       if ( !ret ) {
+               ret = ch_malloc( MDB_IDL_UM_SIZE * sizeof( ID2 ));
+       } else {
+               void *r2 = ret[0].mval.mv_data;
+               ldap_pvt_thread_pool_setkey( op->o_threadctx, (void *)scope_chunk_get,
+                       r2, scope_chunk_free, NULL, NULL );
+       }
+       return ret;
+}
+
+static void scope_chunk_ret( Operation *op, ID2 *scopes )
+{
+       struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
+       void *ret = NULL;
+
+       ldap_pvt_thread_pool_getkey( op->o_threadctx, (void *)scope_chunk_get,
+                       &ret, NULL );
+       scopes[0].mval.mv_data = ret;
+       ldap_pvt_thread_pool_setkey( op->o_threadctx, (void *)scope_chunk_get,
+                       (void *)scopes, scope_chunk_free, NULL, NULL );
+}
+
 int
 mdb_search( Operation *op, SlapReply *rs )
 {
@@ -283,7 +321,7 @@ mdb_search( Operation *op, SlapReply *rs )
        ID              id, cursor;
        ID              lastid = NOID;
        ID              candidates[MDB_IDL_UM_SIZE];
-       ID2             scopes[MDB_IDL_UM_SIZE];
+       ID2             *scopes;
        Entry           *e = NULL, *base = NULL;
        Entry           *matched = NULL;
        AttributeName   *attrs;
@@ -294,7 +332,7 @@ mdb_search( Operation *op, SlapReply *rs )
        IdScopes        isc;
        MDB_cursor      *mci;
 
-       mdb_op_info     opinfo = {0}, *moi = &opinfo;
+       mdb_op_info     opinfo = {{{0}}}, *moi = &opinfo;
        MDB_txn                 *ltid = NULL;
 
        Debug( LDAP_DEBUG_TRACE, "=> " LDAP_XSTRING(mdb_search) "\n", 0, 0, 0);
@@ -312,9 +350,6 @@ mdb_search( Operation *op, SlapReply *rs )
        }
 
        ltid = moi->moi_txn;
-       isc.mt = ltid;
-       isc.mc = NULL;
-       isc.scopes = scopes;
 
        rs->sr_err = mdb_cursor_open( ltid, mdb->mi_id2entry, &mci );
        if ( rs->sr_err ) {
@@ -322,12 +357,17 @@ mdb_search( Operation *op, SlapReply *rs )
                return rs->sr_err;
        }
 
+       scopes = scope_chunk_get( op );
+       isc.mt = ltid;
+       isc.mc = NULL;
+       isc.scopes = scopes;
+
        if ( op->ors_deref & LDAP_DEREF_FINDING ) {
                MDB_IDL_ZERO(candidates);
        }
 dn2entry_retry:
        /* get entry with reader lock */
-       rs->sr_err = mdb_dn2entry( op, ltid, &op->o_req_ndn, &e, 1 );
+       rs->sr_err = mdb_dn2entry( op, ltid, NULL, &op->o_req_ndn, &e, 1 );
 
        switch(rs->sr_err) {
        case MDB_NOTFOUND:
@@ -880,6 +920,7 @@ done:
        }
        if (base)
                mdb_entry_return( op,base);
+       scope_chunk_ret( op, scopes );
 
        return rs->sr_err;
 }