diff --git a/rai/core_test/block_store.cpp b/rai/core_test/block_store.cpp index a5699c2d..7f2345c7 100644 --- a/rai/core_test/block_store.cpp +++ b/rai/core_test/block_store.cpp @@ -782,3 +782,72 @@ TEST (block_store, upgrade_v6_v7) ASSERT_EQ (store.unchecked_end (), store.unchecked_begin (transaction)); } +// Databases need to be dropped in order to convert to dupsort compatible +TEST (block_store, change_dupsort) +{ + auto path (rai::unique_path ()); + bool init (false); + rai::block_store store (init, path); + rai::transaction transaction (store.environment, nullptr, true); + ASSERT_EQ (0, mdb_drop (transaction, store.unchecked, 1)); + ASSERT_EQ (0, mdb_dbi_open (transaction, "unchecked", MDB_CREATE, &store.unchecked)); + rai::send_block send1 (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::send_block send2 (1, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + ASSERT_NE (send1.hash (), send2.hash ()); + store.unchecked_put (transaction, send1.hash (), send1); + store.unchecked_put (transaction, send1.hash (), send2); + { + auto iterator1 (store.unchecked_begin (transaction)); + ++iterator1; + ASSERT_EQ (store.unchecked_end (), iterator1); + } + ASSERT_EQ (0, mdb_drop (transaction, store.unchecked, 0)); + mdb_dbi_close (store.environment, store.unchecked); + ASSERT_EQ (0, mdb_dbi_open (transaction, "unchecked", MDB_CREATE | MDB_DUPSORT, &store.unchecked)); + store.unchecked_put (transaction, send1.hash (), send1); + store.unchecked_put (transaction, send1.hash (), send2); + { + auto iterator1 (store.unchecked_begin (transaction)); + ++iterator1; + ASSERT_EQ (store.unchecked_end (), iterator1); + } + ASSERT_EQ (0, mdb_drop (transaction, store.unchecked, 1)); + ASSERT_EQ (0, mdb_dbi_open (transaction, "unchecked", MDB_CREATE | MDB_DUPSORT, &store.unchecked)); + store.unchecked_put (transaction, send1.hash (), send1); + store.unchecked_put (transaction, send1.hash (), send2); + { + auto iterator1 (store.unchecked_begin (transaction)); + ++iterator1; + ASSERT_NE (store.unchecked_end (), iterator1); + ++iterator1; + ASSERT_EQ (store.unchecked_end (), iterator1); + } +} + +TEST (block_store, upgrade_v7_v8) +{ + auto path (rai::unique_path ()); + { + bool init (false); + rai::block_store store (init, path); + rai::transaction transaction (store.environment, nullptr, true); + ASSERT_EQ (0, mdb_drop (transaction, store.unchecked, 1)); + ASSERT_EQ (0, mdb_dbi_open (transaction, "unchecked", MDB_CREATE, &store.unchecked)); + store.version_put (transaction, 7); + } + bool init (false); + rai::block_store store (init, path); + ASSERT_FALSE (init); + rai::transaction transaction (store.environment, nullptr, true); + rai::send_block send1 (0, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + rai::send_block send2 (1, 0, 0, rai::test_genesis_key.prv, rai::test_genesis_key.pub, 0); + store.unchecked_put (transaction, send1.hash (), send1); + store.unchecked_put (transaction, send1.hash (), send2); + { + auto iterator1 (store.unchecked_begin (transaction)); + ++iterator1; + ASSERT_NE (store.unchecked_end (), iterator1); + ++iterator1; + ASSERT_EQ (store.unchecked_end (), iterator1); + } +} diff --git a/rai/core_test/rpc.cpp b/rai/core_test/rpc.cpp index df49cb48..fb3d2ce0 100644 --- a/rai/core_test/rpc.cpp +++ b/rai/core_test/rpc.cpp @@ -1331,7 +1331,7 @@ TEST (rpc, version) ASSERT_EQ (200, response1.status); ASSERT_EQ ("1", response1.json.get ("rpc_version")); ASSERT_EQ (200, response1.status); - ASSERT_EQ ("7", response1.json.get ("store_version")); + ASSERT_EQ ("8", response1.json.get ("store_version")); ASSERT_EQ (boost::str (boost::format ("RaiBlocks %1%.%2%.%3%") % RAIBLOCKS_VERSION_MAJOR % RAIBLOCKS_VERSION_MINOR % RAIBLOCKS_VERSION_PATCH), response1.json.get ("node_vendor")); auto & headers (response1.resp.fields); auto access_control (std::find_if (headers.begin (), headers.end (), [] (decltype (*headers.begin ()) & header_a) { return boost::iequals (header_a.first, "Access-Control-Allow-Origin"); })); diff --git a/rai/secure.cpp b/rai/secure.cpp index abada52a..556d9581 100644 --- a/rai/secure.cpp +++ b/rai/secure.cpp @@ -1599,6 +1599,8 @@ void rai::block_store::do_upgrades (MDB_txn * transaction_a) case 6: upgrade_v6_to_v7 (transaction_a); case 7: + upgrade_v7_to_v8 (transaction_a); + case 8: break; default: assert (false); @@ -1774,6 +1776,13 @@ void rai::block_store::upgrade_v6_to_v7 (MDB_txn * transaction_a) mdb_drop (transaction_a, unchecked, 0); } +void rai::block_store::upgrade_v7_to_v8 (MDB_txn * transaction_a) +{ + version_put (transaction_a, 8); + mdb_drop (transaction_a, unchecked, 1); + mdb_dbi_open (transaction_a, "unchecked", MDB_CREATE | MDB_DUPSORT, &unchecked); +} + void rai::block_store::clear (MDB_dbi db_a) { rai::transaction transaction (environment, nullptr, true); diff --git a/rai/secure.hpp b/rai/secure.hpp index c75bead7..4c4c558b 100644 --- a/rai/secure.hpp +++ b/rai/secure.hpp @@ -395,6 +395,7 @@ public: void upgrade_v4_to_v5 (MDB_txn *); void upgrade_v5_to_v6 (MDB_txn *); void upgrade_v6_to_v7 (MDB_txn *); + void upgrade_v7_to_v8 (MDB_txn *); void clear (MDB_dbi);