/* Cleanup loose ends after Modify completes */ static int mdb_cf_cleanup( ConfigArgs *c ) { struct mdb_info *mdb = c->be->be_private; int rc = 0; if ( mdb->mi_flags & MDB_DEL_INDEX ) { mdb_attr_flush( mdb ); mdb->mi_flags ^= MDB_DEL_INDEX; } if ( mdb->mi_flags & MDB_RE_OPEN ) { mdb->mi_flags ^= MDB_RE_OPEN; rc = c->be->bd_info->bi_db_close( c->be, &c->reply ); if ( rc == 0 ) rc = c->be->bd_info->bi_db_open( c->be, &c->reply ); /* If this fails, we need to restart */ if ( rc ) { slapd_shutdown = 2; snprintf( c->cr_msg, sizeof( c->cr_msg ), "failed to reopen database, rc=%d", rc ); Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_cf_cleanup) ": %s\n", c->cr_msg, 0, 0 ); rc = LDAP_OTHER; } } if ( mdb->mi_flags & MDB_OPEN_INDEX ) { rc = mdb_attr_dbs_open( c->be, NULL, &c->reply ); if ( rc ) rc = LDAP_OTHER; } return rc; }
/* Open all un-opened index DB handles */ int mdb_attr_dbs_open( BackendDB *be, MDB_txn *tx0, ConfigReply *cr ) { struct mdb_info *mdb = (struct mdb_info *) be->be_private; MDB_txn *txn; MDB_dbi *dbis = NULL; int i, flags; int rc; txn = tx0; if ( txn == NULL ) { rc = mdb_txn_begin( mdb->mi_dbenv, NULL, 0, &txn ); if ( rc ) { snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " "txn_begin failed: %s (%d).", be->be_suffix[0].bv_val, mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_attr_dbs) ": %s\n", cr->msg, 0, 0 ); return rc; } dbis = ch_calloc( 1, mdb->mi_nattrs * sizeof(MDB_dbi) ); } else { rc = 0; } flags = MDB_DUPSORT|MDB_DUPFIXED|MDB_INTEGERDUP; if ( !(slapMode & SLAP_TOOL_READONLY) ) flags |= MDB_CREATE; for ( i=0; i<mdb->mi_nattrs; i++ ) { if ( mdb->mi_attrs[i]->ai_dbi ) /* already open */ continue; rc = mdb_dbi_open( txn, mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val, flags, &mdb->mi_attrs[i]->ai_dbi ); if ( rc ) { snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " "mdb_dbi_open(%s) failed: %s (%d).", be->be_suffix[0].bv_val, mdb->mi_attrs[i]->ai_desc->ad_type->sat_cname.bv_val, mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_attr_dbs) ": %s\n", cr->msg, 0, 0 ); break; } /* Remember newly opened DBI handles */ if ( dbis ) dbis[i] = mdb->mi_attrs[i]->ai_dbi; } /* Only commit if this is our txn */ if ( tx0 == NULL ) { if ( !rc ) { rc = mdb_txn_commit( txn ); if ( rc ) { snprintf( cr->msg, sizeof(cr->msg), "database \"%s\": " "txn_commit failed: %s (%d).", be->be_suffix[0].bv_val, mdb_strerror(rc), rc ); Debug( LDAP_DEBUG_ANY, LDAP_XSTRING(mdb_attr_dbs) ": %s\n", cr->msg, 0, 0 ); } } else { mdb_txn_abort( txn ); } /* Something failed, forget anything we just opened */ if ( rc ) { for ( i=0; i<mdb->mi_nattrs; i++ ) { if ( dbis[i] ) { mdb->mi_attrs[i]->ai_dbi = 0; mdb->mi_attrs[i]->ai_indexmask |= MDB_INDEX_DELETING; } } mdb_attr_flush( mdb ); } ch_free( dbis ); } return rc; }