]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/delete.c
ITS#3226: Clear attribute flags after schema_check failed
[openldap] / servers / slapd / back-bdb / delete.c
index b203488a5fb599e20461812e2cab486fe33b69ca..148230ec01419f82c4c69cc716a66853a7647e82 100644 (file)
@@ -71,6 +71,10 @@ retry:       /* transaction retry */
                        bdb_unlocked_cache_return_entry_w(&bdb->bi_cache, e);
                        e = NULL;
                }
+               if( p != NULL ) {
+                       bdb_unlocked_cache_return_entry_r(&bdb->bi_cache, p);
+                       p = NULL;
+               }
 #ifdef NEW_LOGGING
                LDAP_LOG ( OPERATION, DETAIL1, 
                        "==> bdb_delete: retrying...\n", 0, 0, 0 );
@@ -201,7 +205,19 @@ retry:     /* transaction retry */
                goto done;
        }
 
-       bdb_cache_find_id( op, ltid, eip->bei_id, &eip, 0, locker, &plock );
+       rc = bdb_cache_find_id( op, ltid, eip->bei_id, &eip, 0, locker, &plock );
+       switch( rc ) {
+       case DB_LOCK_DEADLOCK:
+       case DB_LOCK_NOTGRANTED:
+               goto retry;
+       case 0:
+       case DB_NOTFOUND:
+               break;
+       default:
+               rs->sr_err = LDAP_OTHER;
+               rs->sr_text = "internal error";
+               goto return_results;
+       }
        if ( eip ) p = eip->bei_e;
 
        if ( pdn.bv_len != 0 ) {
@@ -223,9 +239,6 @@ retry:      /* transaction retry */
                rs->sr_err = access_allowed( op, p,
                        children, NULL, ACL_WRITE, NULL );
 
-               bdb_unlocked_cache_return_entry_r(&bdb->bi_cache, p);
-               p = NULL;
-
                if ( !rs->sr_err  ) {
                        switch( opinfo.boi_err ) {
                        case DB_LOCK_DEADLOCK:
@@ -487,8 +500,6 @@ retry:      /* transaction retry */
                goto return_results;
        }
 
-       bdb_cache_find_id( op, lt2, eip->bei_id, &eip, 0, locker, &plock );
-       if ( eip ) p = eip->bei_e;
        if ( pdn.bv_len != 0 ) {
                parent_is_glue = is_entry_glue(p);
                rs->sr_err = bdb_cache_children( op, lt2, p );
@@ -570,7 +581,18 @@ retry:     /* transaction retry */
                if ( rs->sr_err == LDAP_SUCCESS && !op->o_no_psearch ) {
                        ldap_pvt_thread_rdwr_wlock( &bdb->bi_pslist_rwlock );
                        LDAP_LIST_FOREACH( ps_list, &bdb->bi_psearch_list, o_ps_link ) {
-                               bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_DELETE );
+                               rc = bdb_psearch( op, rs, ps_list, e, LDAP_PSEARCH_BY_DELETE );
+                               if ( rc ) {
+#ifdef NEW_LOGGING
+                                       LDAP_LOG ( OPERATION, ERR,
+                                               "bdb_delete: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#else
+                                       Debug( LDAP_DEBUG_TRACE,
+                                               "bdb_delete: persistent search failed (%d,%d)\n",
+                                               rc, rs->sr_err, 0 );
+#endif
+                               }
                        }
                        ldap_pvt_thread_rdwr_wunlock( &bdb->bi_pslist_rwlock );
                }
@@ -627,6 +649,9 @@ return_results:
        }
 
 done:
+       if ( p )
+               bdb_unlocked_cache_return_entry_r(&bdb->bi_cache, p);
+
        /* free entry */
        if( e != NULL ) {
                if ( rs->sr_err == LDAP_SUCCESS ) {