Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove unchecked_cache #1187

Merged
merged 7 commits into from
Sep 15, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 51 additions & 0 deletions rai/core_test/block_store.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,57 @@ TEST (unchecked, double_put)
ASSERT_EQ (block3.size (), 1);
}

TEST (unchecked, multiple_get)
{
bool init (false);
rai::mdb_store store (init, rai::unique_path ());
ASSERT_TRUE (!init);
auto block1 (std::make_shared<rai::send_block> (4, 1, 2, rai::keypair ().prv, 4, 5));
auto block2 (std::make_shared<rai::send_block> (3, 1, 2, rai::keypair ().prv, 4, 5));
auto block3 (std::make_shared<rai::send_block> (5, 1, 2, rai::keypair ().prv, 4, 5));
{
auto transaction (store.tx_begin (true));
store.unchecked_put (transaction, block1->previous (), block1); // unchecked1
store.unchecked_put (transaction, block1->hash (), block1); // unchecked2
store.unchecked_put (transaction, block2->previous (), block2); // unchecked3
store.unchecked_put (transaction, block1->previous (), block2); // unchecked1
store.unchecked_put (transaction, block1->hash (), block2); // unchecked2
store.unchecked_put (transaction, block3->previous (), block3);
store.unchecked_put (transaction, block3->hash (), block3); // unchecked4
store.unchecked_put (transaction, block1->previous (), block3); // unchecked1
}
auto transaction (store.tx_begin ());
auto unchecked_count (store.unchecked_count (transaction));
ASSERT_EQ (unchecked_count, 8);
std::vector<rai::block_hash> unchecked1;
auto unchecked1_blocks (store.unchecked_get (transaction, block1->previous ()));
ASSERT_EQ (unchecked1_blocks.size (), 3);
for (auto & i : unchecked1_blocks)
{
unchecked1.push_back (i->hash ());
}
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block1->hash ()) != unchecked1.end ());
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block2->hash ()) != unchecked1.end ());
ASSERT_TRUE (std::find (unchecked1.begin (), unchecked1.end (), block3->hash ()) != unchecked1.end ());
std::vector<rai::block_hash> unchecked2;
auto unchecked2_blocks (store.unchecked_get (transaction, block1->hash ()));
ASSERT_EQ (unchecked2_blocks.size (), 2);
for (auto & i : unchecked2_blocks)
{
unchecked2.push_back (i->hash ());
}
ASSERT_TRUE (std::find (unchecked2.begin (), unchecked2.end (), block1->hash ()) != unchecked2.end ());
ASSERT_TRUE (std::find (unchecked2.begin (), unchecked2.end (), block2->hash ()) != unchecked2.end ());
auto unchecked3 (store.unchecked_get (transaction, block2->previous ()));
ASSERT_EQ (unchecked3.size (), 1);
ASSERT_EQ (unchecked3[0]->hash (), block2->hash ());
auto unchecked4 (store.unchecked_get (transaction, block3->hash ()));
ASSERT_EQ (unchecked4.size (), 1);
ASSERT_EQ (unchecked4[0]->hash (), block3->hash ());
auto unchecked5 (store.unchecked_get (transaction, block2->hash ()));
ASSERT_EQ (unchecked5.size (), 0);
}

TEST (checksum, simple)
{
bool init (false);
Expand Down
54 changes: 5 additions & 49 deletions rai/node/lmdb.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -471,17 +471,6 @@ bool rai::mdb_iterator<T, U>::operator== (rai::store_iterator_impl<T, U> const &
return result;
}

template <typename T, typename U>
void rai::mdb_iterator<T, U>::next_dup ()
{
assert (cursor != nullptr);
auto status (mdb_cursor_get (cursor, &current.first.value, &current.second.value, MDB_NEXT_DUP));
if (status == MDB_NOTFOUND)
{
clear ();
}
}

template <typename T, typename U>
void rai::mdb_iterator<T, U>::clear ()
{
Expand Down Expand Up @@ -570,12 +559,6 @@ rai::store_iterator_impl<T, U> & rai::mdb_merge_iterator<T, U>::operator++ ()
return *this;
}

template <typename T, typename U>
void rai::mdb_merge_iterator<T, U>::next_dup ()
{
least_iterator ().next_dup ();
}

template <typename T, typename U>
bool rai::mdb_merge_iterator<T, U>::is_end_sentinal () const
{
Expand Down Expand Up @@ -1763,8 +1746,9 @@ void rai::mdb_store::unchecked_put (rai::transaction const & transaction_a, rai:
// Inserting block if it wasn't found in database
if (!exists)
{
std::lock_guard<std::mutex> lock (cache_mutex);
unchecked_cache.insert (std::make_pair (hash_a, block_a));
mdb_val block (block_a);
auto status (mdb_put (env.tx (transaction_a), unchecked, rai::mdb_val (hash_a), block, 0));
assert (status == 0);
}
}

Expand All @@ -1786,15 +1770,9 @@ std::shared_ptr<rai::vote> rai::mdb_store::vote_get (rai::transaction const & tr
std::vector<std::shared_ptr<rai::block>> rai::mdb_store::unchecked_get (rai::transaction const & transaction_a, rai::block_hash const & hash_a)
{
std::vector<std::shared_ptr<rai::block>> result;
for (auto i (unchecked_begin (transaction_a, hash_a)), n (unchecked_begin (transaction_a, hash_a.number () + 1)); i != n; ++i)
{
std::lock_guard<std::mutex> lock (cache_mutex);
for (auto i (unchecked_cache.find (hash_a)), n (unchecked_cache.end ()); i != n && i->first == hash_a; ++i)
{
result.push_back (i->second);
}
}
for (auto i (unchecked_begin (transaction_a, hash_a)), n (unchecked_end ()); i != n && rai::block_hash (i->first) == hash_a; i.next_dup ())
{
assert (rai::block_hash (i->first) == hash_a);
std::shared_ptr<rai::block> block (i->second);
result.push_back (block);
}
Expand All @@ -1803,20 +1781,6 @@ std::vector<std::shared_ptr<rai::block>> rai::mdb_store::unchecked_get (rai::tra

void rai::mdb_store::unchecked_del (rai::transaction const & transaction_a, rai::block_hash const & hash_a, std::shared_ptr<rai::block> block_a)
{
{
std::lock_guard<std::mutex> lock (cache_mutex);
for (auto i (unchecked_cache.find (hash_a)), n (unchecked_cache.end ()); i != n && i->first == hash_a;)
{
if (*i->second == *block_a)
{
i = unchecked_cache.erase (i);
}
else
{
++i;
}
}
}
rai::mdb_val block (block_a);
auto status (mdb_del (env.tx (transaction_a), unchecked, rai::mdb_val (hash_a), block));
assert (status == 0 || status == MDB_NOTFOUND);
Expand Down Expand Up @@ -1868,17 +1832,9 @@ void rai::mdb_store::checksum_del (rai::transaction const & transaction_a, uint6
void rai::mdb_store::flush (rai::transaction const & transaction_a)
{
std::unordered_map<rai::account, std::shared_ptr<rai::vote>> sequence_cache_l;
std::unordered_multimap<rai::block_hash, std::shared_ptr<rai::block>> unchecked_cache_l;
{
std::lock_guard<std::mutex> lock (cache_mutex);
sequence_cache_l.swap (vote_cache);
unchecked_cache_l.swap (unchecked_cache);
}
for (auto & i : unchecked_cache_l)
{
mdb_val block (i.second);
auto status (mdb_put (env.tx (transaction_a), unchecked, rai::mdb_val (i.first), block, 0));
assert (status == 0);
}
for (auto i (sequence_cache_l.begin ()), n (sequence_cache_l.end ()); i != n; ++i)
{
Expand Down
3 changes: 0 additions & 3 deletions rai/node/lmdb.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -158,7 +158,6 @@ class mdb_iterator : public store_iterator_impl<T, U>
rai::store_iterator_impl<T, U> & operator++ () override;
std::pair<rai::mdb_val, rai::mdb_val> * operator-> ();
bool operator== (rai::store_iterator_impl<T, U> const & other_a) const override;
void next_dup () override;
bool is_end_sentinal () const override;
void fill (std::pair<T, U> &) const override;
void clear ();
Expand Down Expand Up @@ -187,7 +186,6 @@ class mdb_merge_iterator : public store_iterator_impl<T, U>
rai::store_iterator_impl<T, U> & operator++ () override;
std::pair<rai::mdb_val, rai::mdb_val> * operator-> ();
bool operator== (rai::store_iterator_impl<T, U> const &) const override;
void next_dup () override;
bool is_end_sentinal () const override;
void fill (std::pair<T, U> &) const override;
void clear ();
Expand Down Expand Up @@ -282,7 +280,6 @@ class mdb_store : public block_store
rai::store_iterator<rai::block_hash, std::shared_ptr<rai::block>> unchecked_begin (rai::transaction const &, rai::block_hash const &) override;
rai::store_iterator<rai::block_hash, std::shared_ptr<rai::block>> unchecked_end () override;
size_t unchecked_count (rai::transaction const &) override;
std::unordered_multimap<rai::block_hash, std::shared_ptr<rai::block>> unchecked_cache;

void checksum_put (rai::transaction const &, uint64_t, uint8_t, rai::checksum const &) override;
bool checksum_get (rai::transaction const &, uint64_t, uint8_t, rai::checksum &) override;
Expand Down
5 changes: 0 additions & 5 deletions rai/secure/blockstore.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ class store_iterator_impl
virtual ~store_iterator_impl () = default;
virtual rai::store_iterator_impl<T, U> & operator++ () = 0;
virtual bool operator== (rai::store_iterator_impl<T, U> const & other_a) const = 0;
virtual void next_dup () = 0;
virtual bool is_end_sentinal () const = 0;
virtual void fill (std::pair<T, U> &) const = 0;
rai::store_iterator_impl<T, U> & operator= (rai::store_iterator_impl<T, U> const &) = delete;
Expand Down Expand Up @@ -69,10 +68,6 @@ class store_iterator
{
return !(*this == other_a);
}
void next_dup ()
{
impl->next_dup ();
}

private:
std::pair<T, U> current;
Expand Down