]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-mdb/referral.c
fix opinfo
[openldap] / servers / slapd / back-mdb / referral.c
index 242fe3ab7999aefc7a4bb945c865383749ffd360..be74c48492c675aa25be77288c2d377b6e6bb90a 100644 (file)
@@ -25,11 +25,10 @@ mdb_referrals( Operation *op, SlapReply *rs )
 {
        struct mdb_info *mdb = (struct mdb_info *) op->o_bd->be_private;
        Entry *e = NULL;
-       EntryInfo *ei;
        int rc = LDAP_SUCCESS;
 
-       DB_TXN          *rtxn;
-       DB_LOCK         lock;
+       MDB_txn         *rtxn;
+       mdb_op_info     opinfo = {0}, *moi = &opinfo;
 
        if( op->o_tag == LDAP_REQ_SEARCH ) {
                /* let search take care of itself */
@@ -41,7 +40,7 @@ mdb_referrals( Operation *op, SlapReply *rs )
                return rc;
        } 
 
-       rc = mdb_reader_get(op, mdb->bi_dbenv, &rtxn);
+       rc = mdb_opinfo_get(op, mdb, 1, &moi);
        switch(rc) {
        case 0:
                break;
@@ -49,37 +48,29 @@ mdb_referrals( Operation *op, SlapReply *rs )
                return LDAP_OTHER;
        }
 
-dn2entry_retry:
-       /* get entry */
-       rc = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &ei, 1, &lock );
+       rtxn = moi->moi_txn;
 
-       /* mdb_dn2entry() may legally leave ei == NULL
-        * if rc != 0 and rc != DB_NOTFOUND
-        */
-       if ( ei ) {
-               e = ei->bei_e;
-       }
+       /* get entry */
+       rc = mdb_dn2entry( op, rtxn, &op->o_req_ndn, &e, 1 );
 
        switch(rc) {
-       case DB_NOTFOUND:
+       case MDB_NOTFOUND:
        case 0:
                break;
        case LDAP_BUSY:
                rs->sr_text = "ldap server busy";
-               return LDAP_BUSY;
-       case DB_LOCK_DEADLOCK:
-       case DB_LOCK_NOTGRANTED:
-               goto dn2entry_retry;
+               goto done;
        default:
                Debug( LDAP_DEBUG_TRACE,
                        LDAP_XSTRING(mdb_referrals)
                        ": dn2entry failed: %s (%d)\n",
-                       db_strerror(rc), rc, 0 ); 
+                       mdb_strerror(rc), rc, 0 );
                rs->sr_text = "internal error";
-               return LDAP_OTHER;
+               rc = LDAP_OTHER;
+               goto done;
        }
 
-       if ( rc == DB_NOTFOUND ) {
+       if ( rc == MDB_NOTFOUND ) {
                rc = LDAP_SUCCESS;
                rs->sr_matched = NULL;
                if ( e != NULL ) {
@@ -100,7 +91,7 @@ dn2entry_retry:
                                }
                        }
 
-                       mdb_cache_return_entry_r (mdb, e, &lock);
+                       mdb_entry_return( e );
                        e = NULL;
                }
 
@@ -118,7 +109,7 @@ dn2entry_retry:
                        op->o_tmpfree( (char *)rs->sr_matched, op->o_tmpmemctx );
                        rs->sr_matched = NULL;
                }
-               return rc;
+               goto done;
        }
 
        if ( is_entry_referral( e ) ) {
@@ -147,6 +138,12 @@ dn2entry_retry:
                ber_bvarray_free( refs );
        }
 
-       mdb_cache_return_entry_r(mdb, e, &lock);
+done:
+       if ( moi == &opinfo ) {
+               mdb_txn_reset( moi->moi_txn );
+               LDAP_SLIST_REMOVE( &op->o_extra, &moi->moi_oe, OpExtra, oe_next );
+       }
+       if ( e )
+               mdb_entry_return( e );
        return rc;
 }