]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ndb/delete.cpp
ITS#8043 don't leave dangling syncops
[openldap] / servers / slapd / back-ndb / delete.cpp
index 6c969abe3f7173575d68cb992321ef0a4db882c9..c53bb20a82a519b58bb2b81afa489f755304ee55 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2008 The OpenLDAP Foundation.
+ * Copyright 2008-2014 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -58,7 +58,7 @@ ndb_back_delete( Operation *op, SlapReply *rs )
        /* allocate CSN */
        if ( BER_BVISNULL( &op->o_csn ) ) {
                struct berval csn;
-               char csnbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
+               char csnbuf[LDAP_PVT_CSNSTR_BUFSIZE];
 
                csn.bv_val = csnbuf;
                csn.bv_len = sizeof(csnbuf);
@@ -110,7 +110,7 @@ retry:      /* transaction retry */
        }
 
        /* get entry */
-       rs->sr_err = ndb_entry_get_info( op->o_bd, &NA, 1, &matched );
+       rs->sr_err = ndb_entry_get_info( op, &NA, 1, &matched );
        switch( rs->sr_err ) {
        case 0:
        case LDAP_NO_SUCH_OBJECT:
@@ -137,6 +137,8 @@ retry:      /* transaction retry */
 
                if ( rs->sr_err == LDAP_NO_SUCH_OBJECT ) {
                        rs->sr_matched = matched.bv_val;
+                       if ( NA.ocs )
+                               ndb_check_referral( op, rs, &NA );
                } else {
                        rs->sr_matched = p.e_name.bv_val;
                        rs->sr_err = LDAP_NO_SUCH_OBJECT;
@@ -157,7 +159,7 @@ retry:      /* transaction retry */
                goto return_results;
        }
 
-       rs->sr_err = ndb_entry_get_data( op->o_bd, &NA, 1 );
+       rs->sr_err = ndb_entry_get_data( op, &NA, 1 );
 
        rs->sr_err = access_allowed( op, &e,
                entry, NULL, ACL_WDEL, NULL );
@@ -256,13 +258,15 @@ retry:    /* transaction retry */
        }
 
        if( op->o_noop ) {
-               if (( rs->sr_err=NA.txn->execute( Rollback )) != 0 ) {
+               if (( rs->sr_err=NA.txn->execute( NdbTransaction::Rollback,
+                       NdbOperation::AbortOnError, 1 )) != 0 ) {
                        rs->sr_text = "txn (no-op) failed";
                } else {
                        rs->sr_err = LDAP_X_NO_OPERATION;
                }
        } else {
-               if(( rs->sr_err=NA.txn->execute( Commit )) != 0 ) {
+               if (( rs->sr_err=NA.txn->execute( NdbTransaction::Commit,
+                       NdbOperation::AbortOnError, 1 )) != 0 ) {
                        rs->sr_text = "txn_commit failed";
                } else {
                        rs->sr_err = LDAP_SUCCESS;
@@ -292,7 +296,7 @@ retry:      /* transaction retry */
 
 return_results:
        if ( NA.ocs ) {
-               ber_bvarray_free( NA.ocs );
+               ber_bvarray_free_x( NA.ocs, op->o_tmpmemctx );
                NA.ocs = NULL;
        }