throw std::runtime_error("mdb_env_create failed: " + MDBError(retCode));
}
+ std::unique_ptr<MDB_env, decltype(&mdb_env_close)> envGuard{env, mdb_env_close};
+
if (int retCode = mdb_env_set_maxdbs(env, 20); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_env_set_maxdbs failed: " + MDBError(retCode));
}
if (int retCode = mdb_env_open(env, filename.c_str(), MDB_NOSUBDIR, 0600); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_env_open failed: " + MDBError(retCode));
}
MDB_txn* txn = nullptr;
if (int retCode = mdb_txn_begin(env, nullptr, 0, &txn); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_txn_begin failed: " + MDBError(retCode));
}
throw std::runtime_error("mdb_env_create failed: " + MDBError(retCode));
}
+ std::unique_ptr<MDB_env, decltype(&mdb_env_close)> shenvGuard{shenv, mdb_env_close};
+
if (int retCode = mdb_env_set_maxdbs(shenv, 8); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_env_set_maxdbs failed: " + MDBError(retCode));
}
if (int retCode = mdb_env_open(shenv, shardfile.c_str(), MDB_NOSUBDIR, 0600); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_env_open failed: " + MDBError(retCode));
}
MDB_txn* shtxn = nullptr;
if (int retCode = mdb_txn_begin(shenv, nullptr, 0, &shtxn); retCode != 0) {
- mdb_env_close(env);
throw std::runtime_error("mdb_txn_begin failed: " + MDBError(retCode));
}
if (dbiOpenRc != 0) {
if (dbiOpenRc == MDB_NOTFOUND) {
mdb_txn_abort(shtxn);
- mdb_env_close(shenv);
continue;
}
mdb_txn_abort(shtxn);
- mdb_env_close(shenv);
throw std::runtime_error("mdb_dbi_open shard records failed: " + MDBError(dbiOpenRc));
}
if (int retCode = MDBDbi::mdb_dbi_open(shtxn, "records_v5", MDB_CREATE, &shdbi2); retCode != 0) {
mdb_dbi_close(shenv, shdbi);
mdb_txn_abort(shtxn);
- mdb_env_close(shenv);
throw std::runtime_error("mdb_dbi_open shard records_v5 failed: " + MDBError(retCode));
}
mdb_dbi_close(shenv, shdbi2);
mdb_dbi_close(shenv, shdbi);
mdb_txn_abort(shtxn);
- mdb_env_close(shenv);
throw std::runtime_error("copyDBIAndAddLSHeader failed");
}
cerr << "shard mbd_drop=" << mdb_drop(shtxn, shdbi, 1) << endl;
mdb_txn_commit(shtxn);
mdb_dbi_close(shenv, shdbi2);
- mdb_env_close(shenv);
}
std::array<MDB_dbi, 4> fromtypeddbi{};
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
if (int retCode = MDBDbi::mdb_dbi_open(txn, dbname.c_str(), 0, &fromtypeddbi[index]); retCode != 0) {
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("MDBDbi::mdb_dbi_open typeddbi failed: " + MDBError(retCode));
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
mdb_dbi_close(env, fromtypeddbi[index]);
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("mdb_dbi_open typeddbi target failed: " + MDBError(retCode));
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
mdb_dbi_close(env, fromtypeddbi[index]);
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("copyTypedDBI failed");
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
if (int retCode = MDBDbi::mdb_dbi_open(txn, fdbname.c_str(), 0, &fromindexdbi[index]); retCode != 0) {
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("mdb_dbi_open indexdbi failed: " + MDBError(retCode));
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
mdb_dbi_close(env, fromindexdbi[index]);
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("mdb_dbi_open indexdbi target failed: " + MDBError(retCode));
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
mdb_dbi_close(env, fromindexdbi[index]);
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("copyIndexDBI failed");
}
// finally, migrate the pdns db
if (int retCode = MDBDbi::mdb_dbi_open(txn, "pdns", 0, &dbi); retCode != 0) {
mdb_txn_abort(txn);
- mdb_env_close(env);
throw std::runtime_error("mdb_dbi_open pdns failed: " + MDBError(retCode));
}
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-constant-array-index)
mdb_dbi_close(env, toindexdbi[i]);
}
- mdb_env_close(env);
cerr << "migration done" << endl;
return true;