Databases need to be dropped to be converted to dupsort.

This commit is contained in:
clemahieu 2017-06-22 13:43:49 -05:00
commit 5f196ee751
4 changed files with 80 additions and 1 deletions

View file

@ -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);
}
}

View file

@ -1331,7 +1331,7 @@ TEST (rpc, version)
ASSERT_EQ (200, response1.status);
ASSERT_EQ ("1", response1.json.get <std::string> ("rpc_version"));
ASSERT_EQ (200, response1.status);
ASSERT_EQ ("7", response1.json.get <std::string> ("store_version"));
ASSERT_EQ ("8", response1.json.get <std::string> ("store_version"));
ASSERT_EQ (boost::str (boost::format ("RaiBlocks %1%.%2%.%3%") % RAIBLOCKS_VERSION_MAJOR % RAIBLOCKS_VERSION_MINOR % RAIBLOCKS_VERSION_PATCH), response1.json.get <std::string> ("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"); }));

View file

@ -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);

View file

@ -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);