diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index d15fa7c8a7e8d22ffad8af0d5ccf2cf183466bc5..42e33824b106515c932775d752dee80b3af58b89 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -6696,6 +6696,7 @@ int mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del) if (!rc) mdb_close(txn->mt_env, dbi); } else { + /* reset the DB record, mark it dirty */ txn->mt_dbflags[dbi] |= DB_DIRTY; txn->mt_dbs[dbi].md_depth = 0; txn->mt_dbs[dbi].md_branch_pages = 0; @@ -6703,6 +6704,20 @@ int mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del) txn->mt_dbs[dbi].md_overflow_pages = 0; txn->mt_dbs[dbi].md_entries = 0; txn->mt_dbs[dbi].md_root = P_INVALID; + + if (!txn->mt_u.dirty_list[0].mid) { + MDB_cursor m2; + MDB_val key, data; + /* make sure we have at least one dirty page in this txn + * otherwise these changes will be ignored. + */ + key.mv_size = sizeof(txnid_t); + key.mv_data = &txn->mt_txnid; + data.mv_size = sizeof(MDB_ID); + data.mv_data = txn->mt_free_pgs; + mdb_cursor_init(&m2, txn, FREE_DBI, NULL); + rc = mdb_cursor_put(&m2, &key, &data, 0); + } } leave: mdb_cursor_close(mc);