]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/delete.c
Fix slapadd crash when only a subset of databases have been initialized.
[openldap] / servers / slapd / back-bdb / delete.c
index 2c9bf2af0c2960a2c9242bc722fab5d50e37e6a1..8ad2557473e2af42b75a86c0f22ca8b1a6fd0b69 100644 (file)
@@ -27,17 +27,18 @@ bdb_delete(
        char    *pdn = NULL;
        Entry   *e, *p = NULL;
        int     rc;
-       const char *text = NULL;
+       const char *text;
        int             manageDSAit = get_manageDSAit( op );
        AttributeDescription *children = slap_schema.si_ad_children;
        DB_TXN          *ltid = NULL;
        struct bdb_op_info opinfo;
 
-       Debug(LDAP_DEBUG_ARGS, "==> bdb_delete: %s\n", dn, 0, 0);
+       Debug( LDAP_DEBUG_ARGS, "==> bdb_delete: %s\n", dn, 0, 0 );
 
        if (0) {
-               /* transaction retry */
-retry: rc = txn_abort( ltid );
+retry: /* transaction retry */
+               Debug( LDAP_DEBUG_TRACE, "==> bdb_delete: retrying...\n", 0, 0, 0 );
+               rc = txn_abort( ltid );
                ltid = NULL;
                op->o_private = NULL;
                if( rc != 0 ) {
@@ -49,6 +50,7 @@ retry:        rc = txn_abort( ltid );
 
        /* begin transaction */
        rc = txn_begin( bdb->bi_dbenv, NULL, &ltid, 0 );
+       text = NULL;
        if( rc != 0 ) {
                Debug( LDAP_DEBUG_TRACE,
                        "bdb_delete: txn_begin failed: %s (%d)\n",
@@ -93,6 +95,8 @@ retry:        rc = txn_abort( ltid );
                                ? get_entry_referrals( be, conn, op, matched )
                                : NULL;
                        bdb_entry_return( be, matched );
+                       matched = NULL;
+
                } else {
                        refs = default_referral;
                }
@@ -144,6 +148,7 @@ retry:      rc = txn_abort( ltid );
                        children, NULL, ACL_WRITE );
 
                bdb_entry_return( be, p );
+               p = NULL;
 
                if ( !rc  ) {
                        Debug( LDAP_DEBUG_TRACE,
@@ -264,9 +269,17 @@ return_results:
        send_ldap_result( conn, op, LDAP_SUCCESS,
                NULL, text, NULL, NULL );
 
+       if(rc == LDAP_SUCCESS && bdb->bi_txn_cp ) {
+               ldap_pvt_thread_yield();
+               txn_checkpoint( bdb->bi_dbenv,
+                       bdb->bi_txn_cp_kbyte, bdb->bi_txn_cp_min, 0 );
+       }
+
 done:
        /* free entry */
-       if( e != NULL ) bdb_entry_return( be, e );
+       if( e != NULL ) {
+               bdb_entry_return( be, e );
+       }
 
        if( ltid != NULL ) {
                txn_abort( ltid );