Add db backend namespaces (#3784)
* Add an empty namespace rocksdb to nano:: which forces references to the rocksdb library to use a globally scoped qualified name. This allows rocksdb to be used as a namespace within nano. * Moving lmdb and rocksdb classes in to their own namespaces intsead of suffixing class names.
This commit is contained in:
		
					parent
					
						
							
								e9eb258ab0
							
						
					
				
			
			
				commit
				
					
						596e9a22df
					
				
			
		
					 50 changed files with 793 additions and 726 deletions
				
			
		| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
#include <nano/node/lmdb/account_store.hpp>
 | 
			
		||||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::account_store_mdb::account_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::account_store::account_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store (store_a){};
 | 
			
		||||
 | 
			
		||||
void nano::account_store_mdb::put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info)
 | 
			
		||||
void nano::lmdb::account_store::put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::accounts, account, info);
 | 
			
		||||
	store.release_assert_success (status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::account_store_mdb::get (nano::transaction const & transaction, nano::account const & account, nano::account_info & info)
 | 
			
		||||
bool nano::lmdb::account_store::get (nano::transaction const & transaction, nano::account const & account, nano::account_info & info)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	auto status1 (store.get (transaction, tables::accounts, account, value));
 | 
			
		||||
| 
						 | 
				
			
			@ -24,44 +24,44 @@ bool nano::account_store_mdb::get (nano::transaction const & transaction, nano::
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::account_store_mdb::del (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
void nano::lmdb::account_store::del (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::accounts, account_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::account_store_mdb::exists (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
bool nano::lmdb::account_store::exists (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, account_a));
 | 
			
		||||
	return iterator != end () && nano::account (iterator->first) == account_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::account_store_mdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
size_t nano::lmdb::account_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::accounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_mdb::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::lmdb::account_store::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction, tables::accounts, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::lmdb::account_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction, tables::accounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_mdb::rbegin (nano::transaction const & transaction_a) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::lmdb::account_store::rbegin (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction_a, tables::accounts, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::lmdb::account_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::account, nano::account_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::account_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::account_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class account_store_mdb : public account_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class account_store : public nano::account_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit account_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::account_info & info_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit account_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::account_info & info_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ namespace nano
 | 
			
		|||
class block_predecessor_mdb_set : public nano::block_visitor
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	block_predecessor_mdb_set (nano::write_transaction const & transaction_a, nano::block_store_mdb & block_store_a);
 | 
			
		||||
	block_predecessor_mdb_set (nano::write_transaction const & transaction_a, nano::lmdb::block_store & block_store_a);
 | 
			
		||||
	virtual ~block_predecessor_mdb_set () = default;
 | 
			
		||||
	void fill_value (nano::block const & block_a);
 | 
			
		||||
	void send_block (nano::send_block const & block_a) override;
 | 
			
		||||
| 
						 | 
				
			
			@ -18,14 +18,14 @@ public:
 | 
			
		|||
	void change_block (nano::change_block const & block_a) override;
 | 
			
		||||
	void state_block (nano::state_block const & block_a) override;
 | 
			
		||||
	nano::write_transaction const & transaction;
 | 
			
		||||
	nano::block_store_mdb & block_store;
 | 
			
		||||
	nano::lmdb::block_store & block_store;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_store_mdb::block_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::block_store::block_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::block const & block)
 | 
			
		||||
void nano::lmdb::block_store::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::block const & block)
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (block.sideband ().successor.is_zero () || exists (transaction, block.sideband ().successor));
 | 
			
		||||
	std::vector<uint8_t> vector;
 | 
			
		||||
| 
						 | 
				
			
			@ -40,14 +40,14 @@ void nano::block_store_mdb::put (nano::write_transaction const & transaction, na
 | 
			
		|||
	debug_assert (block.previous ().is_zero () || successor (transaction, block.previous ()) == hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::lmdb::block_store::raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value{ data.size (), (void *)data.data () };
 | 
			
		||||
	auto status = store.put (transaction_a, tables::blocks, hash_a, value);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_hash nano::block_store_mdb::successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
nano::block_hash nano::lmdb::block_store::successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	block_raw_get (transaction_a, hash_a, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ nano::block_hash nano::block_store_mdb::successor (nano::transaction const & tra
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::successor_clear (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
void nano::lmdb::block_store::successor_clear (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ void nano::block_store_mdb::successor_clear (nano::write_transaction const & tra
 | 
			
		|||
	raw_put (transaction, data, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_mdb::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
std::shared_ptr<nano::block> nano::lmdb::block_store::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ std::shared_ptr<nano::block> nano::block_store_mdb::get (nano::transaction const
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_mdb::get_no_sideband (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
std::shared_ptr<nano::block> nano::lmdb::block_store::get_no_sideband (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ std::shared_ptr<nano::block> nano::block_store_mdb::get_no_sideband (nano::trans
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_mdb::random (nano::transaction const & transaction)
 | 
			
		||||
std::shared_ptr<nano::block> nano::lmdb::block_store::random (nano::transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	nano::block_hash hash;
 | 
			
		||||
	nano::random_pool::generate_block (hash.bytes.data (), hash.bytes.size ());
 | 
			
		||||
| 
						 | 
				
			
			@ -127,32 +127,32 @@ std::shared_ptr<nano::block> nano::block_store_mdb::random (nano::transaction co
 | 
			
		|||
	return existing->second.block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::lmdb::block_store::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::blocks, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::block_store_mdb::exists (nano::transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
bool nano::lmdb::block_store::exists (nano::transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val junk;
 | 
			
		||||
	block_raw_get (transaction, hash, junk);
 | 
			
		||||
	return junk.size () != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::block_store_mdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
uint64_t nano::lmdb::block_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::blocks);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::block_store_mdb::account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
nano::account nano::lmdb::block_store::account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto block (get (transaction_a, hash_a));
 | 
			
		||||
	debug_assert (block != nullptr);
 | 
			
		||||
	return account_calculated (*block);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::block_store_mdb::account_calculated (nano::block const & block_a) const
 | 
			
		||||
nano::account nano::lmdb::block_store::account_calculated (nano::block const & block_a) const
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (block_a.has_sideband ());
 | 
			
		||||
	nano::account result (block_a.account ());
 | 
			
		||||
| 
						 | 
				
			
			@ -164,22 +164,22 @@ nano::account nano::block_store_mdb::account_calculated (nano::block const & blo
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::lmdb::block_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::block_w_sideband> (transaction, tables::blocks);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_mdb::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::lmdb::block_store::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::block_w_sideband> (transaction, tables::blocks, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::lmdb::block_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, nano::block_w_sideband> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::uint128_t nano::block_store_mdb::balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
nano::uint128_t nano::lmdb::block_store::balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto block (get (transaction_a, hash_a));
 | 
			
		||||
	release_assert (block);
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +187,7 @@ nano::uint128_t nano::block_store_mdb::balance (nano::transaction const & transa
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::uint128_t nano::block_store_mdb::balance_calculated (std::shared_ptr<nano::block> const & block_a) const
 | 
			
		||||
nano::uint128_t nano::lmdb::block_store::balance_calculated (std::shared_ptr<nano::block> const & block_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::uint128_t result;
 | 
			
		||||
	switch (block_a->type ())
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ nano::uint128_t nano::block_store_mdb::balance_calculated (std::shared_ptr<nano:
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::epoch nano::block_store_mdb::version (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
nano::epoch nano::lmdb::block_store::version (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto block = get (transaction_a, hash_a);
 | 
			
		||||
	if (block && block->type () == nano::block_type::state)
 | 
			
		||||
| 
						 | 
				
			
			@ -222,7 +222,7 @@ nano::epoch nano::block_store_mdb::version (nano::transaction const & transactio
 | 
			
		|||
	return nano::epoch::epoch_0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::block_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			@ -232,30 +232,30 @@ void nano::block_store_mdb::for_each_par (std::function<void (nano::read_transac
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Converts a block hash to a block height
 | 
			
		||||
uint64_t nano::block_store_mdb::account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
uint64_t nano::lmdb::block_store::account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto block = get (transaction_a, hash_a);
 | 
			
		||||
	return block->sideband ().height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_mdb::block_raw_get (nano::transaction const & transaction, nano::block_hash const & hash, nano::mdb_val & value) const
 | 
			
		||||
void nano::lmdb::block_store::block_raw_get (nano::transaction const & transaction, nano::block_hash const & hash, nano::mdb_val & value) const
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.get (transaction, tables::blocks, hash, value);
 | 
			
		||||
	release_assert (store.success (status) || store.not_found (status));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::block_store_mdb::block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const
 | 
			
		||||
size_t nano::lmdb::block_store::block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const
 | 
			
		||||
{
 | 
			
		||||
	return entry_size_a - nano::block_sideband::size (type_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_type nano::block_store_mdb::block_type_from_raw (void * data_a)
 | 
			
		||||
nano::block_type nano::lmdb::block_store::block_type_from_raw (void * data_a)
 | 
			
		||||
{
 | 
			
		||||
	// The block type is the first byte
 | 
			
		||||
	return static_cast<nano::block_type> ((reinterpret_cast<uint8_t const *> (data_a))[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_predecessor_mdb_set::block_predecessor_mdb_set (nano::write_transaction const & transaction_a, nano::block_store_mdb & block_store_a) :
 | 
			
		||||
nano::block_predecessor_mdb_set::block_predecessor_mdb_set (nano::write_transaction const & transaction_a, nano::lmdb::block_store & block_store_a) :
 | 
			
		||||
	transaction{ transaction_a },
 | 
			
		||||
	block_store{ block_store_a }
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,38 +7,41 @@ namespace nano
 | 
			
		|||
class mdb_store;
 | 
			
		||||
using mdb_val = db_val<MDB_val>;
 | 
			
		||||
class block_predecessor_mdb_set;
 | 
			
		||||
class block_store_mdb : public block_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
	friend class block_predecessor_mdb_set;
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class block_store : public nano::block_store
 | 
			
		||||
	{
 | 
			
		||||
		friend class nano::block_predecessor_mdb_set;
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit block_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a, nano::block const & block_a) override;
 | 
			
		||||
	void raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a) override;
 | 
			
		||||
	nano::block_hash successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	void successor_clear (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	std::shared_ptr<nano::block> get (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	std::shared_ptr<nano::block> get_no_sideband (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	std::shared_ptr<nano::block> random (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	nano::account account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::account account_calculated (nano::block const & block_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> end () const override;
 | 
			
		||||
	nano::uint128_t balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	nano::uint128_t balance_calculated (std::shared_ptr<nano::block> const & block_a) const override;
 | 
			
		||||
	nano::epoch version (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const override;
 | 
			
		||||
	// Converts a block hash to a block height
 | 
			
		||||
	uint64_t account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	public:
 | 
			
		||||
		explicit block_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a, nano::block const & block_a) override;
 | 
			
		||||
		void raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a) override;
 | 
			
		||||
		nano::block_hash successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		void successor_clear (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		std::shared_ptr<nano::block> get (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		std::shared_ptr<nano::block> get_no_sideband (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		std::shared_ptr<nano::block> random (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		nano::account account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::account account_calculated (nano::block const & block_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> end () const override;
 | 
			
		||||
		nano::uint128_t balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		nano::uint128_t balance_calculated (std::shared_ptr<nano::block> const & block_a) const override;
 | 
			
		||||
		nano::epoch version (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const override;
 | 
			
		||||
		// Converts a block hash to a block height
 | 
			
		||||
		uint64_t account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void block_raw_get (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::mdb_val & value) const;
 | 
			
		||||
	size_t block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const;
 | 
			
		||||
	static nano::block_type block_type_from_raw (void * data_a);
 | 
			
		||||
};
 | 
			
		||||
	protected:
 | 
			
		||||
		void block_raw_get (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::mdb_val & value) const;
 | 
			
		||||
		size_t block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const;
 | 
			
		||||
		static nano::block_type block_type_from_raw (void * data_a);
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,18 @@
 | 
			
		|||
#include <nano/node/lmdb/confirmation_height_store.hpp>
 | 
			
		||||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::confirmation_height_store_mdb::confirmation_height_store_mdb (nano::mdb_store & store) :
 | 
			
		||||
nano::lmdb::confirmation_height_store::confirmation_height_store (nano::mdb_store & store) :
 | 
			
		||||
	store{ store }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_mdb::put (nano::write_transaction const & transaction, nano::account const & account, nano::confirmation_height_info const & confirmation_height_info)
 | 
			
		||||
void nano::lmdb::confirmation_height_store::put (nano::write_transaction const & transaction, nano::account const & account, nano::confirmation_height_info const & confirmation_height_info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::confirmation_height, account, confirmation_height_info);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::confirmation_height_store_mdb::get (nano::transaction const & transaction, nano::account const & account, nano::confirmation_height_info & confirmation_height_info)
 | 
			
		||||
bool nano::lmdb::confirmation_height_store::get (nano::transaction const & transaction, nano::account const & account, nano::confirmation_height_info & confirmation_height_info)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	auto status = store.get (transaction, tables::confirmation_height, account, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -32,48 +32,48 @@ bool nano::confirmation_height_store_mdb::get (nano::transaction const & transac
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::confirmation_height_store_mdb::exists (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
bool nano::lmdb::confirmation_height_store::exists (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction, tables::confirmation_height, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_mdb::del (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
void nano::lmdb::confirmation_height_store::del (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::confirmation_height, account);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::confirmation_height_store_mdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
uint64_t nano::lmdb::confirmation_height_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_mdb::clear (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
void nano::lmdb::confirmation_height_store::clear (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	del (transaction_a, account_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_mdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::lmdb::confirmation_height_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	store.drop (transaction_a, nano::tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_mdb::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::lmdb::confirmation_height_store::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::confirmation_height_info> (transaction, tables::confirmation_height, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::lmdb::confirmation_height_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::confirmation_height_info> (transaction, tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::lmdb::confirmation_height_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::account, nano::confirmation_height_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::confirmation_height_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class confirmation_height_store_mdb : public confirmation_height_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class confirmation_height_store : public nano::confirmation_height_store
 | 
			
		||||
	{
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit confirmation_height_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info const & confirmation_height_info_a) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info & confirmation_height_info_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit confirmation_height_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info const & confirmation_height_info_a) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info & confirmation_height_info_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
#include <nano/node/lmdb/final_vote_store.hpp>
 | 
			
		||||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::final_vote_store_mdb::final_vote_store_mdb (nano::mdb_store & store) :
 | 
			
		||||
nano::lmdb::final_vote_store::final_vote_store (nano::mdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
bool nano::final_vote_store_mdb::put (nano::write_transaction const & transaction, nano::qualified_root const & root, nano::block_hash const & hash)
 | 
			
		||||
bool nano::lmdb::final_vote_store::put (nano::write_transaction const & transaction, nano::qualified_root const & root, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	auto status = store.get (transaction, tables::final_votes, root, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ bool nano::final_vote_store_mdb::put (nano::write_transaction const & transactio
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<nano::block_hash> nano::final_vote_store_mdb::get (nano::transaction const & transaction, nano::root const & root_a)
 | 
			
		||||
std::vector<nano::block_hash> nano::lmdb::final_vote_store::get (nano::transaction const & transaction, nano::root const & root_a)
 | 
			
		||||
{
 | 
			
		||||
	std::vector<nano::block_hash> result;
 | 
			
		||||
	nano::qualified_root key_start{ root_a.raw, 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ std::vector<nano::block_hash> nano::final_vote_store_mdb::get (nano::transaction
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_mdb::del (nano::write_transaction const & transaction, nano::root const & root)
 | 
			
		||||
void nano::lmdb::final_vote_store::del (nano::write_transaction const & transaction, nano::root const & root)
 | 
			
		||||
{
 | 
			
		||||
	std::vector<nano::qualified_root> final_vote_qualified_roots;
 | 
			
		||||
	for (auto i = begin (transaction, nano::qualified_root{ root.raw, 0 }), n = end (); i != n && nano::qualified_root{ i->first }.root () == root; ++i)
 | 
			
		||||
| 
						 | 
				
			
			@ -48,37 +48,37 @@ void nano::final_vote_store_mdb::del (nano::write_transaction const & transactio
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::final_vote_store_mdb::count (nano::transaction const & transaction_a) const
 | 
			
		||||
size_t nano::lmdb::final_vote_store::count (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_mdb::clear (nano::write_transaction const & transaction_a, nano::root const & root_a)
 | 
			
		||||
void nano::lmdb::final_vote_store::clear (nano::write_transaction const & transaction_a, nano::root const & root_a)
 | 
			
		||||
{
 | 
			
		||||
	del (transaction_a, root_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_mdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::lmdb::final_vote_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	store.drop (transaction_a, nano::tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_mdb::begin (nano::transaction const & transaction, nano::qualified_root const & root) const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::lmdb::final_vote_store::begin (nano::transaction const & transaction, nano::qualified_root const & root) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::qualified_root, nano::block_hash> (transaction, tables::final_votes, root);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::lmdb::final_vote_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::qualified_root, nano::block_hash> (transaction, tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::lmdb::final_vote_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::qualified_root, nano::block_hash> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::final_vote_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class final_vote_store_mdb : public final_vote_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class final_vote_store : public nano::final_vote_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit final_vote_store_mdb (nano::mdb_store & store);
 | 
			
		||||
	bool put (nano::write_transaction const & transaction_a, nano::qualified_root const & root_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	std::vector<nano::block_hash> get (nano::transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a, nano::qualified_root const & root_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit final_vote_store (nano::mdb_store & store);
 | 
			
		||||
		bool put (nano::write_transaction const & transaction_a, nano::qualified_root const & root_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		std::vector<nano::block_hash> get (nano::transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a, nano::qualified_root const & root_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,18 @@
 | 
			
		|||
#include <nano/node/lmdb/frontier_store.hpp>
 | 
			
		||||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::frontier_store_mdb::frontier_store_mdb (nano::mdb_store & store) :
 | 
			
		||||
nano::lmdb::frontier_store::frontier_store (nano::mdb_store & store) :
 | 
			
		||||
	store{ store }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_mdb::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::account const & account)
 | 
			
		||||
void nano::lmdb::frontier_store::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::account const & account)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::frontiers, hash, account);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::frontier_store_mdb::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::account nano::lmdb::frontier_store::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::db_val<MDB_val> value;
 | 
			
		||||
	auto status = store.get (transaction, tables::frontiers, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -25,28 +25,28 @@ nano::account nano::frontier_store_mdb::get (nano::transaction const & transacti
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_mdb::del (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
void nano::lmdb::frontier_store::del (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::frontiers, hash);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::lmdb::frontier_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::account> (transaction, tables::frontiers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_mdb::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::lmdb::frontier_store::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::account> (transaction, tables::frontiers, nano::db_val<MDB_val> (hash));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::lmdb::frontier_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, nano::account> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::frontier_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,20 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class frontier_store_mdb : public frontier_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	frontier_store_mdb (nano::mdb_store & store);
 | 
			
		||||
	void put (nano::write_transaction const &, nano::block_hash const &, nano::account const &) override;
 | 
			
		||||
	nano::account get (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
	void del (nano::write_transaction const &, nano::block_hash const &) override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
};
 | 
			
		||||
	class frontier_store : public nano::frontier_store
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		frontier_store (nano::mdb_store & store);
 | 
			
		||||
		void put (nano::write_transaction const &, nano::block_hash const &, nano::account const &) override;
 | 
			
		||||
		nano::account get (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
		void del (nano::write_transaction const &, nano::block_hash const &) override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const override;
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -48,29 +48,29 @@ class transaction;
 | 
			
		|||
class mdb_store : public store_partial<MDB_val, mdb_store>
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::block_store_mdb block_store;
 | 
			
		||||
	nano::frontier_store_mdb frontier_store;
 | 
			
		||||
	nano::account_store_mdb account_store;
 | 
			
		||||
	nano::pending_store_mdb pending_store;
 | 
			
		||||
	nano::unchecked_store_mdb unchecked_store;
 | 
			
		||||
	nano::online_weight_store_mdb online_weight_store;
 | 
			
		||||
	nano::pruned_store_mdb pruned_store;
 | 
			
		||||
	nano::peer_store_mdb peer_store;
 | 
			
		||||
	nano::confirmation_height_store_mdb confirmation_height_store;
 | 
			
		||||
	nano::final_vote_store_mdb final_vote_store;
 | 
			
		||||
	nano::version_store_mdb version_store;
 | 
			
		||||
	nano::lmdb::account_store account_store;
 | 
			
		||||
	nano::lmdb::block_store block_store;
 | 
			
		||||
	nano::lmdb::confirmation_height_store confirmation_height_store;
 | 
			
		||||
	nano::lmdb::final_vote_store final_vote_store;
 | 
			
		||||
	nano::lmdb::frontier_store frontier_store;
 | 
			
		||||
	nano::lmdb::online_weight_store online_weight_store;
 | 
			
		||||
	nano::lmdb::peer_store peer_store;
 | 
			
		||||
	nano::lmdb::pending_store pending_store;
 | 
			
		||||
	nano::lmdb::pruned_store pruned_store;
 | 
			
		||||
	nano::lmdb::unchecked_store unchecked_store;
 | 
			
		||||
	nano::lmdb::version_store version_store;
 | 
			
		||||
 | 
			
		||||
	friend class nano::account_store_mdb;
 | 
			
		||||
	friend class nano::block_store_mdb;
 | 
			
		||||
	friend class nano::confirmation_height_store_mdb;
 | 
			
		||||
	friend class nano::final_vote_store_mdb;
 | 
			
		||||
	friend class nano::frontier_store_mdb;
 | 
			
		||||
	friend class nano::online_weight_store_mdb;
 | 
			
		||||
	friend class nano::peer_store_mdb;
 | 
			
		||||
	friend class nano::pending_store_mdb;
 | 
			
		||||
	friend class nano::pruned_store_mdb;
 | 
			
		||||
	friend class nano::unchecked_store_mdb;
 | 
			
		||||
	friend class nano::version_store_mdb;
 | 
			
		||||
	friend class nano::lmdb::account_store;
 | 
			
		||||
	friend class nano::lmdb::block_store;
 | 
			
		||||
	friend class nano::lmdb::confirmation_height_store;
 | 
			
		||||
	friend class nano::lmdb::final_vote_store;
 | 
			
		||||
	friend class nano::lmdb::frontier_store;
 | 
			
		||||
	friend class nano::lmdb::online_weight_store;
 | 
			
		||||
	friend class nano::lmdb::peer_store;
 | 
			
		||||
	friend class nano::lmdb::pending_store;
 | 
			
		||||
	friend class nano::lmdb::pruned_store;
 | 
			
		||||
	friend class nano::lmdb::unchecked_store;
 | 
			
		||||
	friend class nano::lmdb::version_store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	mdb_store (nano::logger_mt &, boost::filesystem::path const &, nano::ledger_constants & constants, nano::txn_tracking_config const & txn_tracking_config_a = nano::txn_tracking_config{}, std::chrono::milliseconds block_processor_batch_max_time_a = std::chrono::milliseconds (5000), nano::lmdb_config const & lmdb_config_a = nano::lmdb_config{}, bool backup_before_upgrade = false);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,44 +1,44 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/online_weight_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::online_weight_store_mdb::online_weight_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::online_weight_store::online_weight_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store{ store_a }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_mdb::put (nano::write_transaction const & transaction, uint64_t time, nano::amount const & amount)
 | 
			
		||||
void nano::lmdb::online_weight_store::put (nano::write_transaction const & transaction, uint64_t time, nano::amount const & amount)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::online_weight, time, amount);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_mdb::del (nano::write_transaction const & transaction, uint64_t time)
 | 
			
		||||
void nano::lmdb::online_weight_store::del (nano::write_transaction const & transaction, uint64_t time)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::online_weight, time);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::lmdb::online_weight_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<uint64_t, nano::amount> (transaction, tables::online_weight);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_mdb::rbegin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::lmdb::online_weight_store::rbegin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<uint64_t, nano::amount> (transaction, tables::online_weight, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::lmdb::online_weight_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<uint64_t, nano::amount> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::online_weight_store_mdb::count (nano::transaction const & transaction) const
 | 
			
		||||
size_t nano::lmdb::online_weight_store::count (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction, tables::online_weight);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_mdb::clear (nano::write_transaction const & transaction)
 | 
			
		||||
void nano::lmdb::online_weight_store::clear (nano::write_transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction, tables::online_weight);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,19 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class online_weight_store_mdb : public online_weight_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class online_weight_store : public nano::online_weight_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit online_weight_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, uint64_t time_a, nano::amount const & amount_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, uint64_t time_a) override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> end () const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit online_weight_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, uint64_t time_a, nano::amount const & amount_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, uint64_t time_a) override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> end () const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,43 +1,43 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/peer_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::peer_store_mdb::peer_store_mdb (nano::mdb_store & store) :
 | 
			
		||||
nano::lmdb::peer_store::peer_store (nano::mdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_mdb::put (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
void nano::lmdb::peer_store::put (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put_key (transaction, tables::peers, endpoint);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_mdb::del (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
void nano::lmdb::peer_store::del (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::peers, endpoint);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::peer_store_mdb::exists (nano::transaction const & transaction, nano::endpoint_key const & endpoint) const
 | 
			
		||||
bool nano::lmdb::peer_store::exists (nano::transaction const & transaction, nano::endpoint_key const & endpoint) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction, tables::peers, endpoint);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::peer_store_mdb::count (nano::transaction const & transaction) const
 | 
			
		||||
size_t nano::lmdb::peer_store::count (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction, tables::peers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_mdb::clear (nano::write_transaction const & transaction)
 | 
			
		||||
void nano::lmdb::peer_store::clear (nano::write_transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction, tables::peers);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::peer_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::lmdb::peer_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::endpoint_key, nano::no_value> (transaction, tables::peers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::peer_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::lmdb::peer_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::endpoint_key, nano::no_value> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,19 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class peer_store_mdb : public peer_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class peer_store : public nano::peer_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit peer_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::endpoint_key const & endpoint_a) const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::endpoint_key, nano::no_value> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::endpoint_key, nano::no_value> end () const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit peer_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::endpoint_key const & endpoint_a) const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::endpoint_key, nano::no_value> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::endpoint_key, nano::no_value> end () const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,22 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/pending_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::pending_store_mdb::pending_store_mdb (nano::mdb_store & store) :
 | 
			
		||||
nano::lmdb::pending_store::pending_store (nano::mdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_mdb::put (nano::write_transaction const & transaction, nano::pending_key const & key, nano::pending_info const & pending)
 | 
			
		||||
void nano::lmdb::pending_store::put (nano::write_transaction const & transaction, nano::pending_key const & key, nano::pending_info const & pending)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::pending, key, pending);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_mdb::del (nano::write_transaction const & transaction, nano::pending_key const & key)
 | 
			
		||||
void nano::lmdb::pending_store::del (nano::write_transaction const & transaction, nano::pending_key const & key)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::pending, key);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_mdb::get (nano::transaction const & transaction, nano::pending_key const & key, nano::pending_info & pending_a)
 | 
			
		||||
bool nano::lmdb::pending_store::get (nano::transaction const & transaction, nano::pending_key const & key, nano::pending_info & pending_a)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	auto status1 = store.get (transaction, tables::pending, key, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -30,34 +30,34 @@ bool nano::pending_store_mdb::get (nano::transaction const & transaction, nano::
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_mdb::exists (nano::transaction const & transaction_a, nano::pending_key const & key_a)
 | 
			
		||||
bool nano::lmdb::pending_store::exists (nano::transaction const & transaction_a, nano::pending_key const & key_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, key_a));
 | 
			
		||||
	return iterator != end () && nano::pending_key (iterator->first) == key_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_mdb::any (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
bool nano::lmdb::pending_store::any (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, nano::pending_key (account_a, 0)));
 | 
			
		||||
	return iterator != end () && nano::pending_key (iterator->first).account == account_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_mdb::begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::lmdb::pending_store::begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::pending_key, nano::pending_info> (transaction_a, tables::pending, key_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_mdb::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::lmdb::pending_store::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::pending_key, nano::pending_info> (transaction_a, tables::pending);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::lmdb::pending_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::pending_key, nano::pending_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::pending_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,21 +5,24 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class pending_store_mdb : public pending_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class pending_store : public nano::pending_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit pending_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info const & pending_info_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info & pending_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
	bool any (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit pending_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info const & pending_info_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info & pending_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
		bool any (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,27 +1,27 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/pruned_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::pruned_store_mdb::pruned_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::pruned_store::pruned_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_mdb::put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::lmdb::pruned_store::put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put_key (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_mdb::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::lmdb::pruned_store::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pruned_store_mdb::exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
bool nano::lmdb::pruned_store::exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_hash nano::pruned_store_mdb::random (nano::transaction const & transaction)
 | 
			
		||||
nano::block_hash nano::lmdb::pruned_store::random (nano::transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	nano::block_hash random_hash;
 | 
			
		||||
	nano::random_pool::generate_block (random_hash.bytes.data (), random_hash.bytes.size ());
 | 
			
		||||
| 
						 | 
				
			
			@ -33,33 +33,33 @@ nano::block_hash nano::pruned_store_mdb::random (nano::transaction const & trans
 | 
			
		|||
	return existing != end () ? existing->first : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::pruned_store_mdb::count (nano::transaction const & transaction_a) const
 | 
			
		||||
size_t nano::lmdb::pruned_store::count (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::pruned);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_mdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::lmdb::pruned_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction_a, tables::pruned);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_mdb::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::lmdb::pruned_store::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, std::nullptr_t> (transaction, tables::pruned, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::lmdb::pruned_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, std::nullptr_t> (transaction, tables::pruned);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::lmdb::pruned_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, std::nullptr_t> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::pruned_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class pruned_store_mdb : public pruned_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class pruned_store : public nano::pruned_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit pruned_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::block_hash random (nano::transaction const & transaction_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit pruned_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::block_hash random (nano::transaction const & transaction_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,22 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/unchecked_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::unchecked_store_mdb::unchecked_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::unchecked_store::unchecked_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store (store_a){};
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_mdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::lmdb::unchecked_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction_a, tables::unchecked);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_mdb::put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info)
 | 
			
		||||
void nano::lmdb::unchecked_store::put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction_a, tables::unchecked, nano::unchecked_key{ dependency, info.block->hash () }, info);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::unchecked_store_mdb::exists (nano::transaction const & transaction_a, nano::unchecked_key const & key)
 | 
			
		||||
bool nano::lmdb::unchecked_store::exists (nano::transaction const & transaction_a, nano::unchecked_key const & key)
 | 
			
		||||
{
 | 
			
		||||
	nano::mdb_val value;
 | 
			
		||||
	auto status = store.get (transaction_a, tables::unchecked, key, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,33 +24,33 @@ bool nano::unchecked_store_mdb::exists (nano::transaction const & transaction_a,
 | 
			
		|||
	return store.success (status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_mdb::del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a)
 | 
			
		||||
void nano::lmdb::unchecked_store::del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status (store.del (transaction_a, tables::unchecked, key_a));
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_mdb::end () const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::lmdb::unchecked_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::unchecked_key, nano::unchecked_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_mdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::lmdb::unchecked_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::unchecked_key, nano::unchecked_info> (transaction, tables::unchecked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_mdb::lower_bound (nano::transaction const & transaction, nano::unchecked_key const & key) const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::lmdb::unchecked_store::lower_bound (nano::transaction const & transaction, nano::unchecked_key const & key) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::unchecked_key, nano::unchecked_info> (transaction, tables::unchecked, key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::unchecked_store_mdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
size_t nano::lmdb::unchecked_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::unchecked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_mdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const
 | 
			
		||||
void nano::lmdb::unchecked_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class unchecked_store_mdb : public unchecked_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class unchecked_store : public nano::unchecked_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	unchecked_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	public:
 | 
			
		||||
		unchecked_store (nano::mdb_store & store_a);
 | 
			
		||||
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::unchecked_key const & unchecked_key_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a) override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> end () const override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> lower_bound (nano::transaction const & transaction_a, nano::unchecked_key const & key_a) const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::unchecked_key const & unchecked_key_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a) override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> end () const override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> lower_bound (nano::transaction const & transaction_a, nano::unchecked_key const & key_a) const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
#include <nano/node/lmdb/lmdb.hpp>
 | 
			
		||||
#include <nano/node/lmdb/version_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::version_store_mdb::version_store_mdb (nano::mdb_store & store_a) :
 | 
			
		||||
nano::lmdb::version_store::version_store (nano::mdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::version_store_mdb::put (nano::write_transaction const & transaction_a, int version)
 | 
			
		||||
void nano::lmdb::version_store::put (nano::write_transaction const & transaction_a, int version)
 | 
			
		||||
{
 | 
			
		||||
	nano::uint256_union version_key{ 1 };
 | 
			
		||||
	nano::uint256_union version_value (version);
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ void nano::version_store_mdb::put (nano::write_transaction const & transaction_a
 | 
			
		|||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nano::version_store_mdb::get (nano::transaction const & transaction_a) const
 | 
			
		||||
int nano::lmdb::version_store::get (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::uint256_union version_key{ 1 };
 | 
			
		||||
	nano::mdb_val data;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,14 +5,17 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class version_store_mdb : public version_store
 | 
			
		||||
namespace lmdb
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
	nano::mdb_store & store;
 | 
			
		||||
	class version_store : public nano::version_store
 | 
			
		||||
	{
 | 
			
		||||
	protected:
 | 
			
		||||
		nano::mdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit version_store_mdb (nano::mdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, int version_a) override;
 | 
			
		||||
	int get (nano::transaction const & transaction_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit version_store (nano::mdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, int version_a) override;
 | 
			
		||||
		int get (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,6 +43,9 @@
 | 
			
		|||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
} // Declare a namespace rocksdb inside nano so all references to the rocksdb library need to be globally scoped e.g. ::rocksdb::Slice
 | 
			
		||||
namespace websocket
 | 
			
		||||
{
 | 
			
		||||
	class listener;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,16 @@
 | 
			
		|||
#include <nano/node/rocksdb/account_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::account_store_rocksdb::account_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::account_store::account_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store (store_a){};
 | 
			
		||||
 | 
			
		||||
void nano::account_store_rocksdb::put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info)
 | 
			
		||||
void nano::rocksdb::account_store::put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::accounts, account, info);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::account_store_rocksdb::get (nano::transaction const & transaction, nano::account const & account, nano::account_info & info)
 | 
			
		||||
bool nano::rocksdb::account_store::get (nano::transaction const & transaction, nano::account const & account, nano::account_info & info)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	auto status1 (store.get (transaction, tables::accounts, account, value));
 | 
			
		||||
| 
						 | 
				
			
			@ -24,44 +24,44 @@ bool nano::account_store_rocksdb::get (nano::transaction const & transaction, na
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::account_store_rocksdb::del (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
void nano::rocksdb::account_store::del (nano::write_transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::accounts, account_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::account_store_rocksdb::exists (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
bool nano::rocksdb::account_store::exists (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, account_a));
 | 
			
		||||
	return iterator != end () && nano::account (iterator->first) == account_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::account_store_rocksdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
size_t nano::rocksdb::account_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::accounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_rocksdb::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::rocksdb::account_store::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction, tables::accounts, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::rocksdb::account_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction, tables::accounts);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_rocksdb::rbegin (nano::transaction const & transaction_a) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::rocksdb::account_store::rbegin (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::account_info> (transaction_a, tables::accounts, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::account_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::account, nano::account_info> nano::rocksdb::account_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::account, nano::account_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::account_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::account_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class account_store_rocksdb : public account_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class account_store : public nano::account_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit account_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::account_info & info_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::account_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit account_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction, nano::account const & account, nano::account_info const & info) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::account_info & info_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::account_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::account_info>, nano::store_iterator<nano::account, nano::account_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,7 +9,7 @@ namespace nano
 | 
			
		|||
class block_predecessor_rocksdb_set : public nano::block_visitor
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	block_predecessor_rocksdb_set (nano::write_transaction const & transaction_a, nano::block_store_rocksdb & block_store_a);
 | 
			
		||||
	block_predecessor_rocksdb_set (nano::write_transaction const & transaction_a, nano::rocksdb::block_store & block_store_a);
 | 
			
		||||
	virtual ~block_predecessor_rocksdb_set () = default;
 | 
			
		||||
	void fill_value (nano::block const & block_a);
 | 
			
		||||
	void send_block (nano::send_block const & block_a) override;
 | 
			
		||||
| 
						 | 
				
			
			@ -18,14 +18,14 @@ public:
 | 
			
		|||
	void change_block (nano::change_block const & block_a) override;
 | 
			
		||||
	void state_block (nano::state_block const & block_a) override;
 | 
			
		||||
	nano::write_transaction const & transaction;
 | 
			
		||||
	nano::block_store_rocksdb & block_store;
 | 
			
		||||
	nano::rocksdb::block_store & block_store;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_store_rocksdb::block_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::block_store::block_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::block const & block)
 | 
			
		||||
void nano::rocksdb::block_store::put (nano::write_transaction const & transaction, nano::block_hash const & hash, nano::block const & block)
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (block.sideband ().successor.is_zero () || exists (transaction, block.sideband ().successor));
 | 
			
		||||
	std::vector<uint8_t> vector;
 | 
			
		||||
| 
						 | 
				
			
			@ -40,14 +40,14 @@ void nano::block_store_rocksdb::put (nano::write_transaction const & transaction
 | 
			
		|||
	debug_assert (block.previous ().is_zero () || successor (transaction, block.previous ()) == hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::rocksdb::block_store::raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value{ data.size (), (void *)data.data () };
 | 
			
		||||
	auto status = store.put (transaction_a, tables::blocks, hash_a, value);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_hash nano::block_store_rocksdb::successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
nano::block_hash nano::rocksdb::block_store::successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	block_raw_get (transaction_a, hash_a, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ nano::block_hash nano::block_store_rocksdb::successor (nano::transaction const &
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::successor_clear (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
void nano::rocksdb::block_store::successor_clear (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -79,7 +79,7 @@ void nano::block_store_rocksdb::successor_clear (nano::write_transaction const &
 | 
			
		|||
	raw_put (transaction, data, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_rocksdb::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
std::shared_ptr<nano::block> nano::rocksdb::block_store::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -100,7 +100,7 @@ std::shared_ptr<nano::block> nano::block_store_rocksdb::get (nano::transaction c
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_rocksdb::get_no_sideband (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
std::shared_ptr<nano::block> nano::rocksdb::block_store::get_no_sideband (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	block_raw_get (transaction, hash, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ std::shared_ptr<nano::block> nano::block_store_rocksdb::get_no_sideband (nano::t
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> nano::block_store_rocksdb::random (nano::transaction const & transaction)
 | 
			
		||||
std::shared_ptr<nano::block> nano::rocksdb::block_store::random (nano::transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	nano::block_hash hash;
 | 
			
		||||
	nano::random_pool::generate_block (hash.bytes.data (), hash.bytes.size ());
 | 
			
		||||
| 
						 | 
				
			
			@ -127,32 +127,32 @@ std::shared_ptr<nano::block> nano::block_store_rocksdb::random (nano::transactio
 | 
			
		|||
	return existing->second.block;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::rocksdb::block_store::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::blocks, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::block_store_rocksdb::exists (nano::transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
bool nano::rocksdb::block_store::exists (nano::transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val junk;
 | 
			
		||||
	block_raw_get (transaction, hash, junk);
 | 
			
		||||
	return junk.size () != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::block_store_rocksdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
uint64_t nano::rocksdb::block_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::blocks);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::block_store_rocksdb::account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
nano::account nano::rocksdb::block_store::account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto block (get (transaction_a, hash_a));
 | 
			
		||||
	debug_assert (block != nullptr);
 | 
			
		||||
	return account_calculated (*block);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::block_store_rocksdb::account_calculated (nano::block const & block_a) const
 | 
			
		||||
nano::account nano::rocksdb::block_store::account_calculated (nano::block const & block_a) const
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (block_a.has_sideband ());
 | 
			
		||||
	nano::account result (block_a.account ());
 | 
			
		||||
| 
						 | 
				
			
			@ -164,22 +164,22 @@ nano::account nano::block_store_rocksdb::account_calculated (nano::block const &
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::rocksdb::block_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::block_w_sideband> (transaction, tables::blocks);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_rocksdb::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::rocksdb::block_store::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::block_w_sideband> (transaction, tables::blocks, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::block_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::block_w_sideband> nano::rocksdb::block_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, nano::block_w_sideband> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::uint128_t nano::block_store_rocksdb::balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
nano::uint128_t nano::rocksdb::block_store::balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto block (get (transaction_a, hash_a));
 | 
			
		||||
	release_assert (block);
 | 
			
		||||
| 
						 | 
				
			
			@ -187,7 +187,7 @@ nano::uint128_t nano::block_store_rocksdb::balance (nano::transaction const & tr
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::uint128_t nano::block_store_rocksdb::balance_calculated (std::shared_ptr<nano::block> const & block_a) const
 | 
			
		||||
nano::uint128_t nano::rocksdb::block_store::balance_calculated (std::shared_ptr<nano::block> const & block_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::uint128_t result;
 | 
			
		||||
	switch (block_a->type ())
 | 
			
		||||
| 
						 | 
				
			
			@ -211,7 +211,7 @@ nano::uint128_t nano::block_store_rocksdb::balance_calculated (std::shared_ptr<n
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::epoch nano::block_store_rocksdb::version (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
nano::epoch nano::rocksdb::block_store::version (nano::transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto block = get (transaction_a, hash_a);
 | 
			
		||||
	if (block && block->type () == nano::block_type::state)
 | 
			
		||||
| 
						 | 
				
			
			@ -222,7 +222,7 @@ nano::epoch nano::block_store_rocksdb::version (nano::transaction const & transa
 | 
			
		|||
	return nano::epoch::epoch_0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::block_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			@ -232,30 +232,30 @@ void nano::block_store_rocksdb::for_each_par (std::function<void (nano::read_tra
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
// Converts a block hash to a block height
 | 
			
		||||
uint64_t nano::block_store_rocksdb::account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
uint64_t nano::rocksdb::block_store::account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto block = get (transaction_a, hash_a);
 | 
			
		||||
	return block->sideband ().height;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::block_store_rocksdb::block_raw_get (nano::transaction const & transaction, nano::block_hash const & hash, nano::rocksdb_val & value) const
 | 
			
		||||
void nano::rocksdb::block_store::block_raw_get (nano::transaction const & transaction, nano::block_hash const & hash, nano::rocksdb_val & value) const
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.get (transaction, tables::blocks, hash, value);
 | 
			
		||||
	release_assert (store.success (status) || store.not_found (status));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::block_store_rocksdb::block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const
 | 
			
		||||
size_t nano::rocksdb::block_store::block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const
 | 
			
		||||
{
 | 
			
		||||
	return entry_size_a - nano::block_sideband::size (type_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_type nano::block_store_rocksdb::block_type_from_raw (void * data_a)
 | 
			
		||||
nano::block_type nano::rocksdb::block_store::block_type_from_raw (void * data_a)
 | 
			
		||||
{
 | 
			
		||||
	// The block type is the first byte
 | 
			
		||||
	return static_cast<nano::block_type> ((reinterpret_cast<uint8_t const *> (data_a))[0]);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_predecessor_rocksdb_set::block_predecessor_rocksdb_set (nano::write_transaction const & transaction_a, nano::block_store_rocksdb & block_store_a) :
 | 
			
		||||
nano::block_predecessor_rocksdb_set::block_predecessor_rocksdb_set (nano::write_transaction const & transaction_a, nano::rocksdb::block_store & block_store_a) :
 | 
			
		||||
	transaction{ transaction_a },
 | 
			
		||||
	block_store{ block_store_a }
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,40 +7,43 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
using rocksdb_val = db_val<rocksdb::Slice>;
 | 
			
		||||
using rocksdb_val = db_val<::rocksdb::Slice>;
 | 
			
		||||
class block_predecessor_rocksdb_set;
 | 
			
		||||
class block_store_rocksdb : public block_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
	friend class block_predecessor_rocksdb_set;
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class block_store : public nano::block_store
 | 
			
		||||
	{
 | 
			
		||||
		friend class nano::block_predecessor_rocksdb_set;
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit block_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a, nano::block const & block_a) override;
 | 
			
		||||
	void raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a) override;
 | 
			
		||||
	nano::block_hash successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	void successor_clear (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	std::shared_ptr<nano::block> get (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	std::shared_ptr<nano::block> get_no_sideband (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	std::shared_ptr<nano::block> random (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	nano::account account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::account account_calculated (nano::block const & block_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::block_w_sideband> end () const override;
 | 
			
		||||
	nano::uint128_t balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	nano::uint128_t balance_calculated (std::shared_ptr<nano::block> const & block_a) const override;
 | 
			
		||||
	nano::epoch version (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const override;
 | 
			
		||||
	// Converts a block hash to a block height
 | 
			
		||||
	uint64_t account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	public:
 | 
			
		||||
		explicit block_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a, nano::block const & block_a) override;
 | 
			
		||||
		void raw_put (nano::write_transaction const & transaction_a, std::vector<uint8_t> const & data, nano::block_hash const & hash_a) override;
 | 
			
		||||
		nano::block_hash successor (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		void successor_clear (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		std::shared_ptr<nano::block> get (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		std::shared_ptr<nano::block> get_no_sideband (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		std::shared_ptr<nano::block> random (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		nano::account account (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::account account_calculated (nano::block const & block_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::block_w_sideband> end () const override;
 | 
			
		||||
		nano::uint128_t balance (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		nano::uint128_t balance_calculated (std::shared_ptr<nano::block> const & block_a) const override;
 | 
			
		||||
		nano::epoch version (nano::transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, block_w_sideband>, nano::store_iterator<nano::block_hash, block_w_sideband>)> const & action_a) const override;
 | 
			
		||||
		// Converts a block hash to a block height
 | 
			
		||||
		uint64_t account_height (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
 | 
			
		||||
protected:
 | 
			
		||||
	void block_raw_get (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::rocksdb_val & value) const;
 | 
			
		||||
	size_t block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const;
 | 
			
		||||
	static nano::block_type block_type_from_raw (void * data_a);
 | 
			
		||||
};
 | 
			
		||||
	protected:
 | 
			
		||||
		void block_raw_get (nano::transaction const & transaction_a, nano::block_hash const & hash_a, nano::rocksdb_val & value) const;
 | 
			
		||||
		size_t block_successor_offset (nano::transaction const & transaction_a, size_t entry_size_a, nano::block_type type_a) const;
 | 
			
		||||
		static nano::block_type block_type_from_raw (void * data_a);
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,18 +1,18 @@
 | 
			
		|||
#include <nano/node/rocksdb/confirmation_height_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::confirmation_height_store_rocksdb::confirmation_height_store_rocksdb (nano::rocksdb_store & store) :
 | 
			
		||||
nano::rocksdb::confirmation_height_store::confirmation_height_store (nano::rocksdb_store & store) :
 | 
			
		||||
	store{ store }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_rocksdb::put (nano::write_transaction const & transaction, nano::account const & account, nano::confirmation_height_info const & confirmation_height_info)
 | 
			
		||||
void nano::rocksdb::confirmation_height_store::put (nano::write_transaction const & transaction, nano::account const & account, nano::confirmation_height_info const & confirmation_height_info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::confirmation_height, account, confirmation_height_info);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::confirmation_height_store_rocksdb::get (nano::transaction const & transaction, nano::account const & account, nano::confirmation_height_info & confirmation_height_info)
 | 
			
		||||
bool nano::rocksdb::confirmation_height_store::get (nano::transaction const & transaction, nano::account const & account, nano::confirmation_height_info & confirmation_height_info)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	auto status = store.get (transaction, tables::confirmation_height, account, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -32,48 +32,48 @@ bool nano::confirmation_height_store_rocksdb::get (nano::transaction const & tra
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::confirmation_height_store_rocksdb::exists (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
bool nano::rocksdb::confirmation_height_store::exists (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction, tables::confirmation_height, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_rocksdb::del (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
void nano::rocksdb::confirmation_height_store::del (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::confirmation_height, account);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::confirmation_height_store_rocksdb::count (nano::transaction const & transaction)
 | 
			
		||||
uint64_t nano::rocksdb::confirmation_height_store::count (nano::transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction, tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_rocksdb::clear (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
void nano::rocksdb::confirmation_height_store::clear (nano::write_transaction const & transaction, nano::account const & account)
 | 
			
		||||
{
 | 
			
		||||
	del (transaction, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_rocksdb::clear (nano::write_transaction const & transaction)
 | 
			
		||||
void nano::rocksdb::confirmation_height_store::clear (nano::write_transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	store.drop (transaction, nano::tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_rocksdb::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::rocksdb::confirmation_height_store::begin (nano::transaction const & transaction, nano::account const & account) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::confirmation_height_info> (transaction, tables::confirmation_height, account);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::rocksdb::confirmation_height_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::account, nano::confirmation_height_info> (transaction, tables::confirmation_height);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::confirmation_height_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::account, nano::confirmation_height_info> nano::rocksdb::confirmation_height_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::account, nano::confirmation_height_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::confirmation_height_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::confirmation_height_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class confirmation_height_store_rocksdb : public confirmation_height_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class confirmation_height_store : public nano::confirmation_height_store
 | 
			
		||||
	{
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit confirmation_height_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info const & confirmation_height_info_a) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info & confirmation_height_info_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::account, nano::confirmation_height_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit confirmation_height_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info const & confirmation_height_info_a) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::account const & account_a, nano::confirmation_height_info & confirmation_height_info_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		uint64_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a, nano::account const & account_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::account, nano::confirmation_height_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::account, nano::confirmation_height_info>, nano::store_iterator<nano::account, nano::confirmation_height_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
#include <nano/node/rocksdb/final_vote_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::final_vote_store_rocksdb::final_vote_store_rocksdb (nano::rocksdb_store & store) :
 | 
			
		||||
nano::rocksdb::final_vote_store::final_vote_store (nano::rocksdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
bool nano::final_vote_store_rocksdb::put (nano::write_transaction const & transaction, nano::qualified_root const & root, nano::block_hash const & hash)
 | 
			
		||||
bool nano::rocksdb::final_vote_store::put (nano::write_transaction const & transaction, nano::qualified_root const & root, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	auto status = store.get (transaction, tables::final_votes, root, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +22,7 @@ bool nano::final_vote_store_rocksdb::put (nano::write_transaction const & transa
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<nano::block_hash> nano::final_vote_store_rocksdb::get (nano::transaction const & transaction, nano::root const & root_a)
 | 
			
		||||
std::vector<nano::block_hash> nano::rocksdb::final_vote_store::get (nano::transaction const & transaction, nano::root const & root_a)
 | 
			
		||||
{
 | 
			
		||||
	std::vector<nano::block_hash> result;
 | 
			
		||||
	nano::qualified_root key_start{ root_a.raw, 0 };
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ std::vector<nano::block_hash> nano::final_vote_store_rocksdb::get (nano::transac
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_rocksdb::del (nano::write_transaction const & transaction, nano::root const & root)
 | 
			
		||||
void nano::rocksdb::final_vote_store::del (nano::write_transaction const & transaction, nano::root const & root)
 | 
			
		||||
{
 | 
			
		||||
	std::vector<nano::qualified_root> final_vote_qualified_roots;
 | 
			
		||||
	for (auto i = begin (transaction, nano::qualified_root{ root.raw, 0 }), n = end (); i != n && nano::qualified_root{ i->first }.root () == root; ++i)
 | 
			
		||||
| 
						 | 
				
			
			@ -48,37 +48,37 @@ void nano::final_vote_store_rocksdb::del (nano::write_transaction const & transa
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::final_vote_store_rocksdb::count (nano::transaction const & transaction_a) const
 | 
			
		||||
size_t nano::rocksdb::final_vote_store::count (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_rocksdb::clear (nano::write_transaction const & transaction_a, nano::root const & root_a)
 | 
			
		||||
void nano::rocksdb::final_vote_store::clear (nano::write_transaction const & transaction_a, nano::root const & root_a)
 | 
			
		||||
{
 | 
			
		||||
	del (transaction_a, root_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_rocksdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::rocksdb::final_vote_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	store.drop (transaction_a, nano::tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_rocksdb::begin (nano::transaction const & transaction, nano::qualified_root const & root) const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::rocksdb::final_vote_store::begin (nano::transaction const & transaction, nano::qualified_root const & root) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::qualified_root, nano::block_hash> (transaction, tables::final_votes, root);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::rocksdb::final_vote_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::qualified_root, nano::block_hash> (transaction, tables::final_votes);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::final_vote_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::qualified_root, nano::block_hash> nano::rocksdb::final_vote_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::qualified_root, nano::block_hash> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::final_vote_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::final_vote_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class final_vote_store_rocksdb : public final_vote_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class final_vote_store : public nano::final_vote_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit final_vote_store_rocksdb (nano::rocksdb_store & store);
 | 
			
		||||
	bool put (nano::write_transaction const & transaction_a, nano::qualified_root const & root_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	std::vector<nano::block_hash> get (nano::transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a, nano::qualified_root const & root_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::qualified_root, nano::block_hash> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit final_vote_store (nano::rocksdb_store & store);
 | 
			
		||||
		bool put (nano::write_transaction const & transaction_a, nano::qualified_root const & root_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		std::vector<nano::block_hash> get (nano::transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a, nano::root const & root_a) override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a, nano::qualified_root const & root_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::qualified_root, nano::block_hash> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::qualified_root, nano::block_hash>, nano::store_iterator<nano::qualified_root, nano::block_hash>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,20 +1,20 @@
 | 
			
		|||
#include <nano/node/rocksdb/frontier_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::frontier_store_rocksdb::frontier_store_rocksdb (nano::rocksdb_store & store) :
 | 
			
		||||
nano::rocksdb::frontier_store::frontier_store (nano::rocksdb_store & store) :
 | 
			
		||||
	store{ store }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_rocksdb::put (nano::write_transaction const & transaction, nano::block_hash const & block, nano::account const & account)
 | 
			
		||||
void nano::rocksdb::frontier_store::put (nano::write_transaction const & transaction, nano::block_hash const & block, nano::account const & account)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::frontiers, block, account);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::account nano::frontier_store_rocksdb::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::account nano::rocksdb::frontier_store::get (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	nano::db_val<rocksdb::Slice> value;
 | 
			
		||||
	nano::db_val<::rocksdb::Slice> value;
 | 
			
		||||
	auto status = store.get (transaction, tables::frontiers, hash, value);
 | 
			
		||||
	release_assert (store.success (status) || store.not_found (status));
 | 
			
		||||
	nano::account result{};
 | 
			
		||||
| 
						 | 
				
			
			@ -25,28 +25,28 @@ nano::account nano::frontier_store_rocksdb::get (nano::transaction const & trans
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_rocksdb::del (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
void nano::rocksdb::frontier_store::del (nano::write_transaction const & transaction, nano::block_hash const & hash)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::frontiers, hash);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::rocksdb::frontier_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::account> (transaction, tables::frontiers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_rocksdb::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::rocksdb::frontier_store::begin (nano::transaction const & transaction, nano::block_hash const & hash) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, nano::account> (transaction, tables::frontiers, hash);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::frontier_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, nano::account> nano::rocksdb::frontier_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, nano::account> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::frontier_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::frontier_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,20 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class frontier_store_rocksdb : public frontier_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	frontier_store_rocksdb (nano::rocksdb_store & store);
 | 
			
		||||
	void put (nano::write_transaction const &, nano::block_hash const &, nano::account const &) override;
 | 
			
		||||
	nano::account get (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
	void del (nano::write_transaction const &, nano::block_hash const &) override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, nano::account> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
};
 | 
			
		||||
	class frontier_store : public nano::frontier_store
 | 
			
		||||
	{
 | 
			
		||||
	public:
 | 
			
		||||
		frontier_store (nano::rocksdb_store & store);
 | 
			
		||||
		void put (nano::write_transaction const &, nano::block_hash const &, nano::account const &) override;
 | 
			
		||||
		nano::account get (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
		void del (nano::write_transaction const &, nano::block_hash const &) override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> begin (nano::transaction const &, nano::block_hash const &) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, nano::account> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, nano::account>, nano::store_iterator<nano::block_hash, nano::account>)> const & action_a) const override;
 | 
			
		||||
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,44 +1,44 @@
 | 
			
		|||
#include <nano/node/rocksdb/online_weight_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::online_weight_store_rocksdb::online_weight_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::online_weight_store::online_weight_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store{ store_a }
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_rocksdb::put (nano::write_transaction const & transaction, uint64_t time, nano::amount const & amount)
 | 
			
		||||
void nano::rocksdb::online_weight_store::put (nano::write_transaction const & transaction, uint64_t time, nano::amount const & amount)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::online_weight, time, amount);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_rocksdb::del (nano::write_transaction const & transaction, uint64_t time)
 | 
			
		||||
void nano::rocksdb::online_weight_store::del (nano::write_transaction const & transaction, uint64_t time)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::online_weight, time);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::rocksdb::online_weight_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<uint64_t, nano::amount> (transaction, tables::online_weight);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_rocksdb::rbegin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::rocksdb::online_weight_store::rbegin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<uint64_t, nano::amount> (transaction, tables::online_weight, false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::online_weight_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<uint64_t, nano::amount> nano::rocksdb::online_weight_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<uint64_t, nano::amount> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::online_weight_store_rocksdb::count (nano::transaction const & transaction) const
 | 
			
		||||
size_t nano::rocksdb::online_weight_store::count (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction, tables::online_weight);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::online_weight_store_rocksdb::clear (nano::write_transaction const & transaction)
 | 
			
		||||
void nano::rocksdb::online_weight_store::clear (nano::write_transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction, tables::online_weight);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,19 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class online_weight_store_rocksdb : public online_weight_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class online_weight_store : public nano::online_weight_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit online_weight_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, uint64_t time_a, nano::amount const & amount_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, uint64_t time_a) override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<uint64_t, nano::amount> end () const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit online_weight_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, uint64_t time_a, nano::amount const & amount_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, uint64_t time_a) override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> rbegin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<uint64_t, nano::amount> end () const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,43 +1,43 @@
 | 
			
		|||
#include <nano/node/rocksdb/peer_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::peer_store_rocksdb::peer_store_rocksdb (nano::rocksdb_store & store) :
 | 
			
		||||
nano::rocksdb::peer_store::peer_store (nano::rocksdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_rocksdb::put (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
void nano::rocksdb::peer_store::put (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put_key (transaction, tables::peers, endpoint);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_rocksdb::del (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
void nano::rocksdb::peer_store::del (nano::write_transaction const & transaction, nano::endpoint_key const & endpoint)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::peers, endpoint);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::peer_store_rocksdb::exists (nano::transaction const & transaction, nano::endpoint_key const & endpoint) const
 | 
			
		||||
bool nano::rocksdb::peer_store::exists (nano::transaction const & transaction, nano::endpoint_key const & endpoint) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction, tables::peers, endpoint);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::peer_store_rocksdb::count (nano::transaction const & transaction) const
 | 
			
		||||
size_t nano::rocksdb::peer_store::count (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction, tables::peers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::peer_store_rocksdb::clear (nano::write_transaction const & transaction)
 | 
			
		||||
void nano::rocksdb::peer_store::clear (nano::write_transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction, tables::peers);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::peer_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::rocksdb::peer_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::endpoint_key, nano::no_value> (transaction, tables::peers);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::peer_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::endpoint_key, nano::no_value> nano::rocksdb::peer_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::endpoint_key, nano::no_value> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,19 +5,22 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class peer_store_rocksdb : public peer_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class peer_store : public nano::peer_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit peer_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::endpoint_key const & endpoint_a) const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::endpoint_key, nano::no_value> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::endpoint_key, nano::no_value> end () const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit peer_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::endpoint_key const & endpoint_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::endpoint_key const & endpoint_a) const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::endpoint_key, nano::no_value> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::endpoint_key, nano::no_value> end () const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,22 @@
 | 
			
		|||
#include <nano/node/lmdb/pending_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::pending_store_rocksdb::pending_store_rocksdb (nano::rocksdb_store & store) :
 | 
			
		||||
nano::rocksdb::pending_store::pending_store (nano::rocksdb_store & store) :
 | 
			
		||||
	store{ store } {};
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_rocksdb::put (nano::write_transaction const & transaction, nano::pending_key const & key, nano::pending_info const & pending)
 | 
			
		||||
void nano::rocksdb::pending_store::put (nano::write_transaction const & transaction, nano::pending_key const & key, nano::pending_info const & pending)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction, tables::pending, key, pending);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_rocksdb::del (nano::write_transaction const & transaction, nano::pending_key const & key)
 | 
			
		||||
void nano::rocksdb::pending_store::del (nano::write_transaction const & transaction, nano::pending_key const & key)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction, tables::pending, key);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_rocksdb::get (nano::transaction const & transaction, nano::pending_key const & key, nano::pending_info & pending)
 | 
			
		||||
bool nano::rocksdb::pending_store::get (nano::transaction const & transaction, nano::pending_key const & key, nano::pending_info & pending)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	auto status1 = store.get (transaction, tables::pending, key, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -30,34 +30,34 @@ bool nano::pending_store_rocksdb::get (nano::transaction const & transaction, na
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_rocksdb::exists (nano::transaction const & transaction_a, nano::pending_key const & key_a)
 | 
			
		||||
bool nano::rocksdb::pending_store::exists (nano::transaction const & transaction_a, nano::pending_key const & key_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, key_a));
 | 
			
		||||
	return iterator != end () && nano::pending_key (iterator->first) == key_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pending_store_rocksdb::any (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
bool nano::rocksdb::pending_store::any (nano::transaction const & transaction_a, nano::account const & account_a)
 | 
			
		||||
{
 | 
			
		||||
	auto iterator (begin (transaction_a, nano::pending_key (account_a, 0)));
 | 
			
		||||
	return iterator != end () && nano::pending_key (iterator->first).account == account_a;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_rocksdb::begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::rocksdb::pending_store::begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.template make_iterator<nano::pending_key, nano::pending_info> (transaction_a, tables::pending, key_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_rocksdb::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::rocksdb::pending_store::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.template make_iterator<nano::pending_key, nano::pending_info> (transaction_a, tables::pending);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::pending_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::pending_key, nano::pending_info> nano::rocksdb::pending_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::pending_key, nano::pending_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pending_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::pending_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,21 +5,24 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class pending_store_rocksdb : public pending_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class pending_store : public nano::pending_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit pending_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info const & pending_info_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
	bool get (nano::transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info & pending_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
	bool any (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::pending_key, nano::pending_info> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit pending_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info const & pending_info_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
		bool get (nano::transaction const & transaction_a, nano::pending_key const & key_a, nano::pending_info & pending_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::pending_key const & key_a) override;
 | 
			
		||||
		bool any (nano::transaction const & transaction_a, nano::account const & account_a) override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a, nano::pending_key const & key_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::pending_key, nano::pending_info> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::pending_key, nano::pending_info>, nano::store_iterator<nano::pending_key, nano::pending_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,27 +1,27 @@
 | 
			
		|||
#include <nano/node/rocksdb/pruned_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::pruned_store_rocksdb::pruned_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::pruned_store::pruned_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_rocksdb::put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::rocksdb::pruned_store::put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put_key (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_rocksdb::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
void nano::rocksdb::pruned_store::del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.del (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::pruned_store_rocksdb::exists (nano::transaction const & transaction, nano::block_hash const & hash_a) const
 | 
			
		||||
bool nano::rocksdb::pruned_store::exists (nano::transaction const & transaction, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.exists (transaction, tables::pruned, hash_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::block_hash nano::pruned_store_rocksdb::random (nano::transaction const & transaction)
 | 
			
		||||
nano::block_hash nano::rocksdb::pruned_store::random (nano::transaction const & transaction)
 | 
			
		||||
{
 | 
			
		||||
	nano::block_hash random_hash;
 | 
			
		||||
	nano::random_pool::generate_block (random_hash.bytes.data (), random_hash.bytes.size ());
 | 
			
		||||
| 
						 | 
				
			
			@ -33,33 +33,33 @@ nano::block_hash nano::pruned_store_rocksdb::random (nano::transaction const & t
 | 
			
		|||
	return existing != end () ? existing->first : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::pruned_store_rocksdb::count (nano::transaction const & transaction_a) const
 | 
			
		||||
size_t nano::rocksdb::pruned_store::count (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::pruned);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_rocksdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::rocksdb::pruned_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction_a, tables::pruned);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_rocksdb::begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::rocksdb::pruned_store::begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, std::nullptr_t> (transaction_a, tables::pruned, hash_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_rocksdb::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::rocksdb::pruned_store::begin (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::block_hash, std::nullptr_t> (transaction_a, tables::pruned);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::pruned_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::block_hash, std::nullptr_t> nano::rocksdb::pruned_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::block_hash, std::nullptr_t> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pruned_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::pruned_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint256_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint256_t const & start, nano::uint256_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class pruned_store_rocksdb : public pruned_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class pruned_store : public nano::pruned_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit pruned_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::block_hash random (nano::transaction const & transaction_a) override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::block_hash, std::nullptr_t> end () const override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit pruned_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::block_hash const & hash_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::block_hash random (nano::transaction const & transaction_a) override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a, nano::block_hash const & hash_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::block_hash, std::nullptr_t> end () const override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::block_hash, std::nullptr_t>, nano::store_iterator<nano::block_hash, std::nullptr_t>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ rocksdb_val::db_val (std::size_t size_a, void * data_a) :
 | 
			
		|||
template <>
 | 
			
		||||
void rocksdb_val::convert_buffer_to_value ()
 | 
			
		||||
{
 | 
			
		||||
	value = rocksdb::Slice (reinterpret_cast<char const *> (buffer->data ()), buffer->size ());
 | 
			
		||||
	value = ::rocksdb::Slice (reinterpret_cast<char const *> (buffer->data ()), buffer->size ());
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,7 +105,7 @@ nano::rocksdb_store::rocksdb_store (nano::logger_mt & logger_a, boost::filesyste
 | 
			
		|||
	if (!error)
 | 
			
		||||
	{
 | 
			
		||||
		generate_tombstone_map ();
 | 
			
		||||
		small_table_factory.reset (rocksdb::NewBlockBasedTableFactory (get_small_table_options ()));
 | 
			
		||||
		small_table_factory.reset (::rocksdb::NewBlockBasedTableFactory (get_small_table_options ()));
 | 
			
		||||
		if (!open_read_only_a)
 | 
			
		||||
		{
 | 
			
		||||
			construct_column_family_mutexes ();
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +116,7 @@ nano::rocksdb_store::rocksdb_store (nano::logger_mt & logger_a, boost::filesyste
 | 
			
		|||
 | 
			
		||||
std::unordered_map<char const *, nano::tables> nano::rocksdb_store::create_cf_name_table_map () const
 | 
			
		||||
{
 | 
			
		||||
	std::unordered_map<char const *, nano::tables> map{ { rocksdb::kDefaultColumnFamilyName.c_str (), tables::default_unused },
 | 
			
		||||
	std::unordered_map<char const *, nano::tables> map{ { ::rocksdb::kDefaultColumnFamilyName.c_str (), tables::default_unused },
 | 
			
		||||
		{ "frontiers", tables::frontiers },
 | 
			
		||||
		{ "accounts", tables::accounts },
 | 
			
		||||
		{ "blocks", tables::blocks },
 | 
			
		||||
| 
						 | 
				
			
			@ -138,18 +138,18 @@ void nano::rocksdb_store::open (bool & error_a, boost::filesystem::path const &
 | 
			
		|||
{
 | 
			
		||||
	auto column_families = create_column_families ();
 | 
			
		||||
	auto options = get_db_options ();
 | 
			
		||||
	rocksdb::Status s;
 | 
			
		||||
	::rocksdb::Status s;
 | 
			
		||||
 | 
			
		||||
	std::vector<rocksdb::ColumnFamilyHandle *> handles_l;
 | 
			
		||||
	std::vector<::rocksdb::ColumnFamilyHandle *> handles_l;
 | 
			
		||||
	if (open_read_only_a)
 | 
			
		||||
	{
 | 
			
		||||
		rocksdb::DB * db_l;
 | 
			
		||||
		s = rocksdb::DB::OpenForReadOnly (options, path_a.string (), column_families, &handles_l, &db_l);
 | 
			
		||||
		::rocksdb::DB * db_l;
 | 
			
		||||
		s = ::rocksdb::DB::OpenForReadOnly (options, path_a.string (), column_families, &handles_l, &db_l);
 | 
			
		||||
		db.reset (db_l);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		s = rocksdb::OptimisticTransactionDB::Open (options, path_a.string (), column_families, &handles_l, &optimistic_db);
 | 
			
		||||
		s = ::rocksdb::OptimisticTransactionDB::Open (options, path_a.string (), column_families, &handles_l, &optimistic_db);
 | 
			
		||||
		if (optimistic_db)
 | 
			
		||||
		{
 | 
			
		||||
			db.reset (optimistic_db);
 | 
			
		||||
| 
						 | 
				
			
			@ -185,9 +185,9 @@ void nano::rocksdb_store::generate_tombstone_map ()
 | 
			
		|||
	tombstone_map.emplace (std::piecewise_construct, std::forward_as_tuple (nano::tables::pending), std::forward_as_tuple (0, 25000));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_common_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_common_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::ColumnFamilyOptions cf_options;
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions cf_options;
 | 
			
		||||
	cf_options.table_factory = table_factory_a;
 | 
			
		||||
 | 
			
		||||
	// (1 active, 1 inactive)
 | 
			
		||||
| 
						 | 
				
			
			@ -219,12 +219,12 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_common_cf_options (std::sh
 | 
			
		|||
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_cf_options (std::string const & cf_name_a) const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::ColumnFamilyOptions cf_options;
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions cf_options;
 | 
			
		||||
	auto const memtable_size_bytes = base_memtable_size_bytes ();
 | 
			
		||||
	auto const block_cache_size_bytes = 1024ULL * 1024 * rocksdb_config.memory_multiplier * base_block_cache_size;
 | 
			
		||||
	if (cf_name_a == "unchecked")
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 4)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 4)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
 | 
			
		||||
		// Create prefix bloom for memtable with the size of write_buffer_size * memtable_prefix_bloom_size_ratio
 | 
			
		||||
| 
						 | 
				
			
			@ -238,13 +238,13 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_cf_options (std::string co
 | 
			
		|||
	}
 | 
			
		||||
	else if (cf_name_a == "blocks")
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 4)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 4)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, blocks_memtable_size_bytes ());
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "confirmation_height")
 | 
			
		||||
	{
 | 
			
		||||
		// Entries will not be deleted in the normal case, so can make memtables a lot bigger
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes * 2);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "meta" || cf_name_a == "online_weight" || cf_name_a == "peers")
 | 
			
		||||
| 
						 | 
				
			
			@ -262,7 +262,7 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_cf_options (std::string co
 | 
			
		|||
	else if (cf_name_a == "pending")
 | 
			
		||||
	{
 | 
			
		||||
		// Pending can have a lot of deletions too
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
 | 
			
		||||
		// Number of files in level 0 which triggers compaction. Size of L0 and L1 should be kept similar as this is the only compaction which is single threaded
 | 
			
		||||
| 
						 | 
				
			
			@ -274,32 +274,32 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_cf_options (std::string co
 | 
			
		|||
	else if (cf_name_a == "frontiers")
 | 
			
		||||
	{
 | 
			
		||||
		// Frontiers is only needed during bootstrap for legacy blocks
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "accounts")
 | 
			
		||||
	{
 | 
			
		||||
		// Can have deletions from rollbacks
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "vote")
 | 
			
		||||
	{
 | 
			
		||||
		// No deletes it seems, only overwrites.
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "pruned")
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == "final_votes")
 | 
			
		||||
	{
 | 
			
		||||
		std::shared_ptr<rocksdb::TableFactory> table_factory (rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		std::shared_ptr<::rocksdb::TableFactory> table_factory (::rocksdb::NewBlockBasedTableFactory (get_active_table_options (block_cache_size_bytes * 2)));
 | 
			
		||||
		cf_options = get_active_cf_options (table_factory, memtable_size_bytes);
 | 
			
		||||
	}
 | 
			
		||||
	else if (cf_name_a == rocksdb::kDefaultColumnFamilyName)
 | 
			
		||||
	else if (cf_name_a == ::rocksdb::kDefaultColumnFamilyName)
 | 
			
		||||
	{
 | 
			
		||||
		// Do nothing.
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -313,7 +313,7 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_cf_options (std::string co
 | 
			
		|||
 | 
			
		||||
std::vector<rocksdb::ColumnFamilyDescriptor> nano::rocksdb_store::create_column_families ()
 | 
			
		||||
{
 | 
			
		||||
	std::vector<rocksdb::ColumnFamilyDescriptor> column_families;
 | 
			
		||||
	std::vector<::rocksdb::ColumnFamilyDescriptor> column_families;
 | 
			
		||||
	for (auto & [cf_name, table] : cf_name_table_map)
 | 
			
		||||
	{
 | 
			
		||||
		(void)table;
 | 
			
		||||
| 
						 | 
				
			
			@ -397,15 +397,15 @@ rocksdb::ColumnFamilyHandle * nano::rocksdb_store::table_to_column_family (table
 | 
			
		|||
 | 
			
		||||
bool nano::rocksdb_store::exists (nano::transaction const & transaction_a, tables table_a, nano::rocksdb_val const & key_a) const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::PinnableSlice slice;
 | 
			
		||||
	rocksdb::Status status;
 | 
			
		||||
	::rocksdb::PinnableSlice slice;
 | 
			
		||||
	::rocksdb::Status status;
 | 
			
		||||
	if (is_read (transaction_a))
 | 
			
		||||
	{
 | 
			
		||||
		status = db->Get (snapshot_options (transaction_a), table_to_column_family (table_a), key_a, &slice);
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		rocksdb::ReadOptions options;
 | 
			
		||||
		::rocksdb::ReadOptions options;
 | 
			
		||||
		options.fill_cache = false;
 | 
			
		||||
		status = tx (transaction_a)->Get (options, table_to_column_family (table_a), key_a, &slice);
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -439,21 +439,21 @@ void nano::rocksdb_store::flush_tombstones_check (tables table_a)
 | 
			
		|||
 | 
			
		||||
void nano::rocksdb_store::flush_table (nano::tables table_a)
 | 
			
		||||
{
 | 
			
		||||
	db->Flush (rocksdb::FlushOptions{}, table_to_column_family (table_a));
 | 
			
		||||
	db->Flush (::rocksdb::FlushOptions{}, table_to_column_family (table_a));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rocksdb::Transaction * nano::rocksdb_store::tx (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	debug_assert (!is_read (transaction_a));
 | 
			
		||||
	return static_cast<rocksdb::Transaction *> (transaction_a.get_handle ());
 | 
			
		||||
	return static_cast<::rocksdb::Transaction *> (transaction_a.get_handle ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nano::rocksdb_store::get (nano::transaction const & transaction_a, tables table_a, nano::rocksdb_val const & key_a, nano::rocksdb_val & value_a) const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::ReadOptions options;
 | 
			
		||||
	rocksdb::PinnableSlice slice;
 | 
			
		||||
	::rocksdb::ReadOptions options;
 | 
			
		||||
	::rocksdb::PinnableSlice slice;
 | 
			
		||||
	auto handle = table_to_column_family (table_a);
 | 
			
		||||
	rocksdb::Status status;
 | 
			
		||||
	::rocksdb::Status status;
 | 
			
		||||
	if (is_read (transaction_a))
 | 
			
		||||
	{
 | 
			
		||||
		status = db->Get (snapshot_options (transaction_a), handle, key_a, &slice);
 | 
			
		||||
| 
						 | 
				
			
			@ -486,12 +486,12 @@ bool nano::rocksdb_store::not_found (int status) const
 | 
			
		|||
 | 
			
		||||
bool nano::rocksdb_store::success (int status) const
 | 
			
		||||
{
 | 
			
		||||
	return (static_cast<int> (rocksdb::Status::Code::kOk) == status);
 | 
			
		||||
	return (static_cast<int> (::rocksdb::Status::Code::kOk) == status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nano::rocksdb_store::status_code_not_found () const
 | 
			
		||||
{
 | 
			
		||||
	return static_cast<int> (rocksdb::Status::Code::kNotFound);
 | 
			
		||||
	return static_cast<int> (::rocksdb::Status::Code::kNotFound);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint64_t nano::rocksdb_store::count (nano::transaction const & transaction_a, tables table_a) const
 | 
			
		||||
| 
						 | 
				
			
			@ -565,7 +565,7 @@ int nano::rocksdb_store::drop (nano::write_transaction const & transaction_a, ta
 | 
			
		|||
	debug_assert (transaction_a.contains (table_a));
 | 
			
		||||
	auto col = table_to_column_family (table_a);
 | 
			
		||||
 | 
			
		||||
	int status = static_cast<int> (rocksdb::Status::Code::kOk);
 | 
			
		||||
	int status = static_cast<int> (::rocksdb::Status::Code::kOk);
 | 
			
		||||
	if (success (status))
 | 
			
		||||
	{
 | 
			
		||||
		// Dropping/Creating families like in node::ongoing_peer_clear can cause write stalls, just delete them manually.
 | 
			
		||||
| 
						 | 
				
			
			@ -587,7 +587,7 @@ int nano::rocksdb_store::drop (nano::write_transaction const & transaction_a, ta
 | 
			
		|||
	return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nano::rocksdb_store::clear (rocksdb::ColumnFamilyHandle * column_family)
 | 
			
		||||
int nano::rocksdb_store::clear (::rocksdb::ColumnFamilyHandle * column_family)
 | 
			
		||||
{
 | 
			
		||||
	// Dropping completely removes the column
 | 
			
		||||
	auto name = column_family->GetName ();
 | 
			
		||||
| 
						 | 
				
			
			@ -615,7 +615,7 @@ void nano::rocksdb_store::construct_column_family_mutexes ()
 | 
			
		|||
 | 
			
		||||
rocksdb::Options nano::rocksdb_store::get_db_options ()
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::Options db_options;
 | 
			
		||||
	::rocksdb::Options db_options;
 | 
			
		||||
	db_options.create_if_missing = true;
 | 
			
		||||
	db_options.create_missing_column_families = true;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -624,7 +624,7 @@ rocksdb::Options nano::rocksdb_store::get_db_options ()
 | 
			
		|||
	db_options.memtable_whole_key_filtering = true;
 | 
			
		||||
 | 
			
		||||
	// Sets the compaction priority
 | 
			
		||||
	db_options.compaction_pri = rocksdb::CompactionPri::kMinOverlappingRatio;
 | 
			
		||||
	db_options.compaction_pri = ::rocksdb::CompactionPri::kMinOverlappingRatio;
 | 
			
		||||
 | 
			
		||||
	// Start aggressively flushing WAL files when they reach over 1GB
 | 
			
		||||
	db_options.max_total_wal_size = 1 * 1024 * 1024 * 1024LL;
 | 
			
		||||
| 
						 | 
				
			
			@ -644,9 +644,9 @@ rocksdb::Options nano::rocksdb_store::get_db_options ()
 | 
			
		|||
	db_options.max_manifest_file_size = 100 * 1024 * 1024ULL;
 | 
			
		||||
 | 
			
		||||
	// Not compressing any SST files for compatibility reasons.
 | 
			
		||||
	db_options.compression = rocksdb::kNoCompression;
 | 
			
		||||
	db_options.compression = ::rocksdb::kNoCompression;
 | 
			
		||||
 | 
			
		||||
	auto event_listener_l = new event_listener ([this] (rocksdb::FlushJobInfo const & flush_job_info_a) { this->on_flush (flush_job_info_a); });
 | 
			
		||||
	auto event_listener_l = new event_listener ([this] (::rocksdb::FlushJobInfo const & flush_job_info_a) { this->on_flush (flush_job_info_a); });
 | 
			
		||||
	db_options.listeners.emplace_back (event_listener_l);
 | 
			
		||||
 | 
			
		||||
	return db_options;
 | 
			
		||||
| 
						 | 
				
			
			@ -654,10 +654,10 @@ rocksdb::Options nano::rocksdb_store::get_db_options ()
 | 
			
		|||
 | 
			
		||||
rocksdb::BlockBasedTableOptions nano::rocksdb_store::get_active_table_options (std::size_t lru_size) const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::BlockBasedTableOptions table_options;
 | 
			
		||||
	::rocksdb::BlockBasedTableOptions table_options;
 | 
			
		||||
 | 
			
		||||
	// Improve point lookup performance be using the data block hash index (uses about 5% more space).
 | 
			
		||||
	table_options.data_block_index_type = rocksdb::BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinaryAndHash;
 | 
			
		||||
	table_options.data_block_index_type = ::rocksdb::BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinaryAndHash;
 | 
			
		||||
	table_options.data_block_hash_table_util_ratio = 0.75;
 | 
			
		||||
 | 
			
		||||
	// Using format_version=4 significantly reduces the index block size, in some cases around 4-5x.
 | 
			
		||||
| 
						 | 
				
			
			@ -667,10 +667,10 @@ rocksdb::BlockBasedTableOptions nano::rocksdb_store::get_active_table_options (s
 | 
			
		|||
	table_options.index_block_restart_interval = 16;
 | 
			
		||||
 | 
			
		||||
	// Block cache for reads
 | 
			
		||||
	table_options.block_cache = rocksdb::NewLRUCache (lru_size);
 | 
			
		||||
	table_options.block_cache = ::rocksdb::NewLRUCache (lru_size);
 | 
			
		||||
 | 
			
		||||
	// Bloom filter to help with point reads. 10bits gives 1% false positive rate.
 | 
			
		||||
	table_options.filter_policy.reset (rocksdb::NewBloomFilterPolicy (10, false));
 | 
			
		||||
	table_options.filter_policy.reset (::rocksdb::NewBloomFilterPolicy (10, false));
 | 
			
		||||
 | 
			
		||||
	// Increasing block_size decreases memory usage and space amplification, but increases read amplification.
 | 
			
		||||
	table_options.block_size = 16 * 1024ULL;
 | 
			
		||||
| 
						 | 
				
			
			@ -683,15 +683,15 @@ rocksdb::BlockBasedTableOptions nano::rocksdb_store::get_active_table_options (s
 | 
			
		|||
 | 
			
		||||
rocksdb::BlockBasedTableOptions nano::rocksdb_store::get_small_table_options () const
 | 
			
		||||
{
 | 
			
		||||
	rocksdb::BlockBasedTableOptions table_options;
 | 
			
		||||
	::rocksdb::BlockBasedTableOptions table_options;
 | 
			
		||||
	// Improve point lookup performance be using the data block hash index (uses about 5% more space).
 | 
			
		||||
	table_options.data_block_index_type = rocksdb::BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinaryAndHash;
 | 
			
		||||
	table_options.data_block_index_type = ::rocksdb::BlockBasedTableOptions::DataBlockIndexType::kDataBlockBinaryAndHash;
 | 
			
		||||
	table_options.data_block_hash_table_util_ratio = 0.75;
 | 
			
		||||
	table_options.block_size = 1024ULL;
 | 
			
		||||
	return table_options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_small_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a) const
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_small_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto const memtable_size_bytes = 10000;
 | 
			
		||||
	auto cf_options = get_common_cf_options (table_factory_a, memtable_size_bytes);
 | 
			
		||||
| 
						 | 
				
			
			@ -705,7 +705,7 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_small_cf_options (std::sha
 | 
			
		|||
	return cf_options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_active_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const
 | 
			
		||||
::rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_active_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const
 | 
			
		||||
{
 | 
			
		||||
	auto cf_options = get_common_cf_options (table_factory_a, memtable_size_bytes_a);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -721,7 +721,7 @@ rocksdb::ColumnFamilyOptions nano::rocksdb_store::get_active_cf_options (std::sh
 | 
			
		|||
	return cf_options;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::rocksdb_store::on_flush (rocksdb::FlushJobInfo const & flush_job_info_a)
 | 
			
		||||
void nano::rocksdb_store::on_flush (::rocksdb::FlushJobInfo const & flush_job_info_a)
 | 
			
		||||
{
 | 
			
		||||
	// Reset appropriate tombstone counters
 | 
			
		||||
	if (auto it = tombstone_map.find (cf_name_table_map[flush_job_info_a.cf_name.c_str ()]); it != tombstone_map.end ())
 | 
			
		||||
| 
						 | 
				
			
			@ -737,16 +737,16 @@ std::vector<nano::tables> nano::rocksdb_store::all_tables () const
 | 
			
		|||
 | 
			
		||||
bool nano::rocksdb_store::copy_db (boost::filesystem::path const & destination_path)
 | 
			
		||||
{
 | 
			
		||||
	std::unique_ptr<rocksdb::BackupEngine> backup_engine;
 | 
			
		||||
	std::unique_ptr<::rocksdb::BackupEngine> backup_engine;
 | 
			
		||||
	{
 | 
			
		||||
		rocksdb::BackupEngine * backup_engine_raw;
 | 
			
		||||
		rocksdb::BackupableDBOptions backup_options (destination_path.string ());
 | 
			
		||||
		::rocksdb::BackupEngine * backup_engine_raw;
 | 
			
		||||
		::rocksdb::BackupableDBOptions backup_options (destination_path.string ());
 | 
			
		||||
		// Use incremental backups (default)
 | 
			
		||||
		backup_options.share_table_files = true;
 | 
			
		||||
 | 
			
		||||
		// Increase number of threads used for copying
 | 
			
		||||
		backup_options.max_background_operations = std::thread::hardware_concurrency ();
 | 
			
		||||
		auto status = rocksdb::BackupEngine::Open (rocksdb::Env::Default (), backup_options, &backup_engine_raw);
 | 
			
		||||
		auto status = ::rocksdb::BackupEngine::Open (::rocksdb::Env::Default (), backup_options, &backup_engine_raw);
 | 
			
		||||
		backup_engine.reset (backup_engine_raw);
 | 
			
		||||
		if (!status.ok ())
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -760,7 +760,7 @@ bool nano::rocksdb_store::copy_db (boost::filesystem::path const & destination_p
 | 
			
		|||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::vector<rocksdb::BackupInfo> backup_infos;
 | 
			
		||||
	std::vector<::rocksdb::BackupInfo> backup_infos;
 | 
			
		||||
	backup_engine->GetBackupInfo (&backup_infos);
 | 
			
		||||
 | 
			
		||||
	for (auto const & backup_info : backup_infos)
 | 
			
		||||
| 
						 | 
				
			
			@ -773,10 +773,10 @@ bool nano::rocksdb_store::copy_db (boost::filesystem::path const & destination_p
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		std::unique_ptr<rocksdb::BackupEngineReadOnly> backup_engine_read;
 | 
			
		||||
		std::unique_ptr<::rocksdb::BackupEngineReadOnly> backup_engine_read;
 | 
			
		||||
		{
 | 
			
		||||
			rocksdb::BackupEngineReadOnly * backup_engine_read_raw;
 | 
			
		||||
			status = rocksdb::BackupEngineReadOnly::Open (rocksdb::Env::Default (), rocksdb::BackupableDBOptions (destination_path.string ()), &backup_engine_read_raw);
 | 
			
		||||
			::rocksdb::BackupEngineReadOnly * backup_engine_read_raw;
 | 
			
		||||
			status = ::rocksdb::BackupEngineReadOnly::Open (::rocksdb::Env::Default (), ::rocksdb::BackupableDBOptions (destination_path.string ()), &backup_engine_read_raw);
 | 
			
		||||
		}
 | 
			
		||||
		if (!status.ok ())
 | 
			
		||||
		{
 | 
			
		||||
| 
						 | 
				
			
			@ -820,45 +820,45 @@ void nano::rocksdb_store::serialize_memory_stats (boost::property_tree::ptree &
 | 
			
		|||
	uint64_t val;
 | 
			
		||||
 | 
			
		||||
	// Approximate size of active and unflushed immutable memtables (bytes).
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kCurSizeAllMemTables, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kCurSizeAllMemTables, &val);
 | 
			
		||||
	json.put ("cur-size-all-mem-tables", val);
 | 
			
		||||
 | 
			
		||||
	// Approximate size of active, unflushed immutable, and pinned immutable memtables (bytes).
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kSizeAllMemTables, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kSizeAllMemTables, &val);
 | 
			
		||||
	json.put ("size-all-mem-tables", val);
 | 
			
		||||
 | 
			
		||||
	// Estimated memory used for reading SST tables, excluding memory used in block cache (e.g. filter and index blocks).
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kEstimateTableReadersMem, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kEstimateTableReadersMem, &val);
 | 
			
		||||
	json.put ("estimate-table-readers-mem", val);
 | 
			
		||||
 | 
			
		||||
	//  An estimate of the amount of live data in bytes.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kEstimateLiveDataSize, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kEstimateLiveDataSize, &val);
 | 
			
		||||
	json.put ("estimate-live-data-size", val);
 | 
			
		||||
 | 
			
		||||
	//  Returns 1 if at least one compaction is pending; otherwise, returns 0.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kCompactionPending, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kCompactionPending, &val);
 | 
			
		||||
	json.put ("compaction-pending", val);
 | 
			
		||||
 | 
			
		||||
	// Estimated number of total keys in the active and unflushed immutable memtables and storage.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kEstimateNumKeys, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kEstimateNumKeys, &val);
 | 
			
		||||
	json.put ("estimate-num-keys", val);
 | 
			
		||||
 | 
			
		||||
	// Estimated total number of bytes compaction needs to rewrite to get all levels down
 | 
			
		||||
	// to under target size. Not valid for other compactions than level-based.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kEstimatePendingCompactionBytes, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kEstimatePendingCompactionBytes, &val);
 | 
			
		||||
	json.put ("estimate-pending-compaction-bytes", val);
 | 
			
		||||
 | 
			
		||||
	//  Total size (bytes) of all SST files.
 | 
			
		||||
	//  WARNING: may slow down online queries if there are too many files.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kTotalSstFilesSize, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kTotalSstFilesSize, &val);
 | 
			
		||||
	json.put ("total-sst-files-size", val);
 | 
			
		||||
 | 
			
		||||
	// Block cache capacity.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kBlockCacheCapacity, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kBlockCacheCapacity, &val);
 | 
			
		||||
	json.put ("block-cache-capacity", val);
 | 
			
		||||
 | 
			
		||||
	// Memory size for the entries residing in block cache.
 | 
			
		||||
	db->GetAggregatedIntProperty (rocksdb::DB::Properties::kBlockCacheUsage, &val);
 | 
			
		||||
	db->GetAggregatedIntProperty (::rocksdb::DB::Properties::kBlockCacheUsage, &val);
 | 
			
		||||
	json.put ("block-cache-usage", val);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,33 +35,33 @@ class rocksdb_store;
 | 
			
		|||
/**
 | 
			
		||||
 * rocksdb implementation of the block store
 | 
			
		||||
 */
 | 
			
		||||
class rocksdb_store : public store_partial<rocksdb::Slice, rocksdb_store>
 | 
			
		||||
class rocksdb_store : public store_partial<::rocksdb::Slice, rocksdb_store>
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::block_store_rocksdb block_store;
 | 
			
		||||
	nano::frontier_store_rocksdb frontier_store;
 | 
			
		||||
	nano::account_store_rocksdb account_store;
 | 
			
		||||
	nano::confirmation_height_store_rocksdb confirmation_height_store;
 | 
			
		||||
	nano::pending_store_rocksdb pending_store;
 | 
			
		||||
	nano::unchecked_store_rocksdb unchecked_store;
 | 
			
		||||
	nano::online_weight_store_rocksdb online_weight_store;
 | 
			
		||||
	nano::pruned_store_rocksdb pruned_store;
 | 
			
		||||
	nano::peer_store_rocksdb peer_store;
 | 
			
		||||
	nano::final_vote_store_rocksdb final_vote_store;
 | 
			
		||||
	nano::version_store_rocksdb version_store;
 | 
			
		||||
	nano::rocksdb::account_store account_store;
 | 
			
		||||
	nano::rocksdb::block_store block_store;
 | 
			
		||||
	nano::rocksdb::confirmation_height_store confirmation_height_store;
 | 
			
		||||
	nano::rocksdb::final_vote_store final_vote_store;
 | 
			
		||||
	nano::rocksdb::frontier_store frontier_store;
 | 
			
		||||
	nano::rocksdb::online_weight_store online_weight_store;
 | 
			
		||||
	nano::rocksdb::peer_store peer_store;
 | 
			
		||||
	nano::rocksdb::pending_store pending_store;
 | 
			
		||||
	nano::rocksdb::pruned_store pruned_store;
 | 
			
		||||
	nano::rocksdb::unchecked_store unchecked_store;
 | 
			
		||||
	nano::rocksdb::version_store version_store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	friend class nano::account_store_rocksdb;
 | 
			
		||||
	friend class nano::block_store_rocksdb;
 | 
			
		||||
	friend class nano::confirmation_height_store_rocksdb;
 | 
			
		||||
	friend class nano::frontier_store_rocksdb;
 | 
			
		||||
	friend class nano::final_vote_store_rocksdb;
 | 
			
		||||
	friend class nano::online_weight_store_rocksdb;
 | 
			
		||||
	friend class nano::peer_store_rocksdb;
 | 
			
		||||
	friend class nano::pending_store_rocksdb;
 | 
			
		||||
	friend class nano::pruned_store_rocksdb;
 | 
			
		||||
	friend class nano::unchecked_store_rocksdb;
 | 
			
		||||
	friend class nano::version_store_rocksdb;
 | 
			
		||||
	friend class nano::rocksdb::account_store;
 | 
			
		||||
	friend class nano::rocksdb::block_store;
 | 
			
		||||
	friend class nano::rocksdb::confirmation_height_store;
 | 
			
		||||
	friend class nano::rocksdb::final_vote_store;
 | 
			
		||||
	friend class nano::rocksdb::frontier_store;
 | 
			
		||||
	friend class nano::rocksdb::online_weight_store;
 | 
			
		||||
	friend class nano::rocksdb::peer_store;
 | 
			
		||||
	friend class nano::rocksdb::pending_store;
 | 
			
		||||
	friend class nano::rocksdb::pruned_store;
 | 
			
		||||
	friend class nano::rocksdb::unchecked_store;
 | 
			
		||||
	friend class nano::rocksdb::version_store;
 | 
			
		||||
 | 
			
		||||
	explicit rocksdb_store (nano::logger_mt &, boost::filesystem::path const &, nano::ledger_constants & constants, nano::rocksdb_config const & = nano::rocksdb_config{}, bool open_read_only = false);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,10 +105,10 @@ private:
 | 
			
		|||
	nano::logger_mt & logger;
 | 
			
		||||
	nano::ledger_constants & constants;
 | 
			
		||||
	// Optimistic transactions are used in write mode
 | 
			
		||||
	rocksdb::OptimisticTransactionDB * optimistic_db = nullptr;
 | 
			
		||||
	std::unique_ptr<rocksdb::DB> db;
 | 
			
		||||
	std::vector<std::unique_ptr<rocksdb::ColumnFamilyHandle>> handles;
 | 
			
		||||
	std::shared_ptr<rocksdb::TableFactory> small_table_factory;
 | 
			
		||||
	::rocksdb::OptimisticTransactionDB * optimistic_db = nullptr;
 | 
			
		||||
	std::unique_ptr<::rocksdb::DB> db;
 | 
			
		||||
	std::vector<std::unique_ptr<::rocksdb::ColumnFamilyHandle>> handles;
 | 
			
		||||
	std::shared_ptr<::rocksdb::TableFactory> small_table_factory;
 | 
			
		||||
	std::unordered_map<nano::tables, nano::mutex> write_lock_mutexes;
 | 
			
		||||
	nano::rocksdb_config rocksdb_config;
 | 
			
		||||
	unsigned const max_block_write_batch_num_m;
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +124,7 @@ private:
 | 
			
		|||
	std::unordered_map<nano::tables, tombstone_info> tombstone_map;
 | 
			
		||||
	std::unordered_map<char const *, nano::tables> cf_name_table_map;
 | 
			
		||||
 | 
			
		||||
	rocksdb::Transaction * tx (nano::transaction const & transaction_a) const;
 | 
			
		||||
	::rocksdb::Transaction * tx (nano::transaction const & transaction_a) const;
 | 
			
		||||
	std::vector<nano::tables> all_tables () const;
 | 
			
		||||
 | 
			
		||||
	bool not_found (int status) const override;
 | 
			
		||||
| 
						 | 
				
			
			@ -132,27 +132,27 @@ private:
 | 
			
		|||
	int status_code_not_found () const override;
 | 
			
		||||
	int drop (nano::write_transaction const &, tables) override;
 | 
			
		||||
 | 
			
		||||
	rocksdb::ColumnFamilyHandle * table_to_column_family (tables table_a) const;
 | 
			
		||||
	int clear (rocksdb::ColumnFamilyHandle * column_family);
 | 
			
		||||
	::rocksdb::ColumnFamilyHandle * table_to_column_family (tables table_a) const;
 | 
			
		||||
	int clear (::rocksdb::ColumnFamilyHandle * column_family);
 | 
			
		||||
 | 
			
		||||
	void open (bool & error_a, boost::filesystem::path const & path_a, bool open_read_only_a);
 | 
			
		||||
 | 
			
		||||
	void construct_column_family_mutexes ();
 | 
			
		||||
	rocksdb::Options get_db_options ();
 | 
			
		||||
	rocksdb::ColumnFamilyOptions get_common_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const;
 | 
			
		||||
	rocksdb::ColumnFamilyOptions get_active_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const;
 | 
			
		||||
	rocksdb::ColumnFamilyOptions get_small_cf_options (std::shared_ptr<rocksdb::TableFactory> const & table_factory_a) const;
 | 
			
		||||
	rocksdb::BlockBasedTableOptions get_active_table_options (std::size_t lru_size) const;
 | 
			
		||||
	rocksdb::BlockBasedTableOptions get_small_table_options () const;
 | 
			
		||||
	rocksdb::ColumnFamilyOptions get_cf_options (std::string const & cf_name_a) const;
 | 
			
		||||
	::rocksdb::Options get_db_options ();
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions get_common_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const;
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions get_active_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a, unsigned long long memtable_size_bytes_a) const;
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions get_small_cf_options (std::shared_ptr<::rocksdb::TableFactory> const & table_factory_a) const;
 | 
			
		||||
	::rocksdb::BlockBasedTableOptions get_active_table_options (std::size_t lru_size) const;
 | 
			
		||||
	::rocksdb::BlockBasedTableOptions get_small_table_options () const;
 | 
			
		||||
	::rocksdb::ColumnFamilyOptions get_cf_options (std::string const & cf_name_a) const;
 | 
			
		||||
 | 
			
		||||
	void on_flush (rocksdb::FlushJobInfo const &);
 | 
			
		||||
	void on_flush (::rocksdb::FlushJobInfo const &);
 | 
			
		||||
	void flush_table (nano::tables table_a);
 | 
			
		||||
	void flush_tombstones_check (nano::tables table_a);
 | 
			
		||||
	void generate_tombstone_map ();
 | 
			
		||||
	std::unordered_map<char const *, nano::tables> create_cf_name_table_map () const;
 | 
			
		||||
 | 
			
		||||
	std::vector<rocksdb::ColumnFamilyDescriptor> create_column_families ();
 | 
			
		||||
	std::vector<::rocksdb::ColumnFamilyDescriptor> create_column_families ();
 | 
			
		||||
	unsigned long long base_memtable_size_bytes () const;
 | 
			
		||||
	unsigned long long blocks_memtable_size_bytes () const;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -162,5 +162,5 @@ private:
 | 
			
		|||
	friend class rocksdb_block_store_tombstone_count_Test;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
extern template class store_partial<rocksdb::Slice, rocksdb_store>;
 | 
			
		||||
extern template class store_partial<::rocksdb::Slice, rocksdb_store>;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ inline rocksdb::ReadOptions & snapshot_options (nano::transaction const & transa
 | 
			
		|||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
using rocksdb_val = db_val<rocksdb::Slice>;
 | 
			
		||||
using rocksdb_val = db_val<::rocksdb::Slice>;
 | 
			
		||||
 | 
			
		||||
template <typename T, typename U>
 | 
			
		||||
class rocksdb_iterator : public store_iterator_impl<T, U>
 | 
			
		||||
| 
						 | 
				
			
			@ -33,7 +33,7 @@ class rocksdb_iterator : public store_iterator_impl<T, U>
 | 
			
		|||
public:
 | 
			
		||||
	rocksdb_iterator () = default;
 | 
			
		||||
 | 
			
		||||
	rocksdb_iterator (rocksdb::DB * db, nano::transaction const & transaction_a, rocksdb::ColumnFamilyHandle * handle_a, rocksdb_val const * val_a, bool const direction_asc)
 | 
			
		||||
	rocksdb_iterator (::rocksdb::DB * db, nano::transaction const & transaction_a, ::rocksdb::ColumnFamilyHandle * handle_a, rocksdb_val const * val_a, bool const direction_asc)
 | 
			
		||||
	{
 | 
			
		||||
		// Don't fill the block cache for any blocks read as a result of an iterator
 | 
			
		||||
		if (is_read (transaction_a))
 | 
			
		||||
| 
						 | 
				
			
			@ -44,7 +44,7 @@ public:
 | 
			
		|||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			rocksdb::ReadOptions ropts;
 | 
			
		||||
			::rocksdb::ReadOptions ropts;
 | 
			
		||||
			ropts.fill_cache = false;
 | 
			
		||||
			cursor.reset (tx (transaction_a)->GetIterator (ropts, handle_a));
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +73,7 @@ public:
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	rocksdb_iterator (rocksdb::DB * db, nano::transaction const & transaction_a, rocksdb::ColumnFamilyHandle * handle_a) :
 | 
			
		||||
	rocksdb_iterator (::rocksdb::DB * db, nano::transaction const & transaction_a, ::rocksdb::ColumnFamilyHandle * handle_a) :
 | 
			
		||||
		rocksdb_iterator (db, transaction_a, handle_a, nullptr)
 | 
			
		||||
	{
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -194,13 +194,13 @@ public:
 | 
			
		|||
	}
 | 
			
		||||
	nano::store_iterator_impl<T, U> & operator= (nano::store_iterator_impl<T, U> const &) = delete;
 | 
			
		||||
 | 
			
		||||
	std::unique_ptr<rocksdb::Iterator> cursor;
 | 
			
		||||
	std::unique_ptr<::rocksdb::Iterator> cursor;
 | 
			
		||||
	std::pair<nano::rocksdb_val, nano::rocksdb_val> current;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	rocksdb::Transaction * tx (nano::transaction const & transaction_a) const
 | 
			
		||||
	::rocksdb::Transaction * tx (nano::transaction const & transaction_a) const
 | 
			
		||||
	{
 | 
			
		||||
		return static_cast<rocksdb::Transaction *> (transaction_a.get_handle ());
 | 
			
		||||
		return static_cast<::rocksdb::Transaction *> (transaction_a.get_handle ());
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,21 +14,21 @@ namespace nano
 | 
			
		|||
class read_rocksdb_txn final : public read_transaction_impl
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	read_rocksdb_txn (rocksdb::DB * db);
 | 
			
		||||
	read_rocksdb_txn (::rocksdb::DB * db);
 | 
			
		||||
	~read_rocksdb_txn ();
 | 
			
		||||
	void reset () override;
 | 
			
		||||
	void renew () override;
 | 
			
		||||
	void * get_handle () const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	rocksdb::DB * db;
 | 
			
		||||
	rocksdb::ReadOptions options;
 | 
			
		||||
	::rocksdb::DB * db;
 | 
			
		||||
	::rocksdb::ReadOptions options;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class write_rocksdb_txn final : public write_transaction_impl
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	write_rocksdb_txn (rocksdb::OptimisticTransactionDB * db_a, std::vector<nano::tables> const & tables_requiring_locks_a, std::vector<nano::tables> const & tables_no_locks_a, std::unordered_map<nano::tables, nano::mutex> & mutexes_a);
 | 
			
		||||
	write_rocksdb_txn (::rocksdb::OptimisticTransactionDB * db_a, std::vector<nano::tables> const & tables_requiring_locks_a, std::vector<nano::tables> const & tables_no_locks_a, std::unordered_map<nano::tables, nano::mutex> & mutexes_a);
 | 
			
		||||
	~write_rocksdb_txn ();
 | 
			
		||||
	void commit () override;
 | 
			
		||||
	void renew () override;
 | 
			
		||||
| 
						 | 
				
			
			@ -36,8 +36,8 @@ public:
 | 
			
		|||
	bool contains (nano::tables table_a) const override;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	rocksdb::Transaction * txn;
 | 
			
		||||
	rocksdb::OptimisticTransactionDB * db;
 | 
			
		||||
	::rocksdb::Transaction * txn;
 | 
			
		||||
	::rocksdb::OptimisticTransactionDB * db;
 | 
			
		||||
	std::vector<nano::tables> tables_requiring_locks;
 | 
			
		||||
	std::vector<nano::tables> tables_no_locks;
 | 
			
		||||
	std::unordered_map<nano::tables, nano::mutex> & mutexes;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,22 +1,22 @@
 | 
			
		|||
#include <nano/node/lmdb/unchecked_store.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
 | 
			
		||||
nano::unchecked_store_rocksdb::unchecked_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::unchecked_store::unchecked_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store (store_a){};
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_rocksdb::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
void nano::rocksdb::unchecked_store::clear (nano::write_transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.drop (transaction_a, tables::unchecked);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_rocksdb::put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info)
 | 
			
		||||
void nano::rocksdb::unchecked_store::put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info)
 | 
			
		||||
{
 | 
			
		||||
	auto status = store.put (transaction_a, tables::unchecked, nano::unchecked_key{ dependency, info.block->hash () }, info);
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool nano::unchecked_store_rocksdb::exists (nano::transaction const & transaction_a, nano::unchecked_key const & key)
 | 
			
		||||
bool nano::rocksdb::unchecked_store::exists (nano::transaction const & transaction_a, nano::unchecked_key const & key)
 | 
			
		||||
{
 | 
			
		||||
	nano::rocksdb_val value;
 | 
			
		||||
	auto status = store.get (transaction_a, tables::unchecked, key, value);
 | 
			
		||||
| 
						 | 
				
			
			@ -24,33 +24,33 @@ bool nano::unchecked_store_rocksdb::exists (nano::transaction const & transactio
 | 
			
		|||
	return store.success (status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_rocksdb::del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a)
 | 
			
		||||
void nano::rocksdb::unchecked_store::del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a)
 | 
			
		||||
{
 | 
			
		||||
	auto status (store.del (transaction_a, tables::unchecked, key_a));
 | 
			
		||||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_rocksdb::end () const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::rocksdb::unchecked_store::end () const
 | 
			
		||||
{
 | 
			
		||||
	return nano::store_iterator<nano::unchecked_key, nano::unchecked_info> (nullptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_rocksdb::begin (nano::transaction const & transaction) const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::rocksdb::unchecked_store::begin (nano::transaction const & transaction) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::unchecked_key, nano::unchecked_info> (transaction, tables::unchecked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::unchecked_store_rocksdb::lower_bound (nano::transaction const & transaction, nano::unchecked_key const & key) const
 | 
			
		||||
nano::store_iterator<nano::unchecked_key, nano::unchecked_info> nano::rocksdb::unchecked_store::lower_bound (nano::transaction const & transaction, nano::unchecked_key const & key) const
 | 
			
		||||
{
 | 
			
		||||
	return store.make_iterator<nano::unchecked_key, nano::unchecked_info> (transaction, tables::unchecked, key);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::unchecked_store_rocksdb::count (nano::transaction const & transaction_a)
 | 
			
		||||
size_t nano::rocksdb::unchecked_store::count (nano::transaction const & transaction_a)
 | 
			
		||||
{
 | 
			
		||||
	return store.count (transaction_a, tables::unchecked);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::unchecked_store_rocksdb::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const
 | 
			
		||||
void nano::rocksdb::unchecked_store::for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const
 | 
			
		||||
{
 | 
			
		||||
	parallel_traversal<nano::uint512_t> (
 | 
			
		||||
	[&action_a, this] (nano::uint512_t const & start, nano::uint512_t const & end, bool const is_last) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,22 +5,25 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class mdb_store;
 | 
			
		||||
class unchecked_store_rocksdb : public unchecked_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
private:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class unchecked_store : public nano::unchecked_store
 | 
			
		||||
	{
 | 
			
		||||
	private:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	unchecked_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	public:
 | 
			
		||||
		unchecked_store (nano::rocksdb_store & store_a);
 | 
			
		||||
 | 
			
		||||
	void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info_a) override;
 | 
			
		||||
	bool exists (nano::transaction const & transaction_a, nano::unchecked_key const & unchecked_key_a) override;
 | 
			
		||||
	void del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a) override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> end () const override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	nano::store_iterator<nano::unchecked_key, nano::unchecked_info> lower_bound (nano::transaction const & transaction_a, nano::unchecked_key const & key_a) const override;
 | 
			
		||||
	size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
	void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const override;
 | 
			
		||||
};
 | 
			
		||||
		void clear (nano::write_transaction const & transaction_a) override;
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, nano::hash_or_account const & dependency, nano::unchecked_info const & info_a) override;
 | 
			
		||||
		bool exists (nano::transaction const & transaction_a, nano::unchecked_key const & unchecked_key_a) override;
 | 
			
		||||
		void del (nano::write_transaction const & transaction_a, nano::unchecked_key const & key_a) override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> end () const override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> begin (nano::transaction const & transaction_a) const override;
 | 
			
		||||
		nano::store_iterator<nano::unchecked_key, nano::unchecked_info> lower_bound (nano::transaction const & transaction_a, nano::unchecked_key const & key_a) const override;
 | 
			
		||||
		size_t count (nano::transaction const & transaction_a) override;
 | 
			
		||||
		void for_each_par (std::function<void (nano::read_transaction const &, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>, nano::store_iterator<nano::unchecked_key, nano::unchecked_info>)> const & action_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,10 +1,10 @@
 | 
			
		|||
#include <nano/node/rocksdb/rocksdb.hpp>
 | 
			
		||||
#include <nano/node/rocksdb/version_store.hpp>
 | 
			
		||||
 | 
			
		||||
nano::version_store_rocksdb::version_store_rocksdb (nano::rocksdb_store & store_a) :
 | 
			
		||||
nano::rocksdb::version_store::version_store (nano::rocksdb_store & store_a) :
 | 
			
		||||
	store{ store_a } {};
 | 
			
		||||
 | 
			
		||||
void nano::version_store_rocksdb::put (nano::write_transaction const & transaction_a, int version)
 | 
			
		||||
void nano::rocksdb::version_store::put (nano::write_transaction const & transaction_a, int version)
 | 
			
		||||
{
 | 
			
		||||
	nano::uint256_union version_key{ 1 };
 | 
			
		||||
	nano::uint256_union version_value (version);
 | 
			
		||||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ void nano::version_store_rocksdb::put (nano::write_transaction const & transacti
 | 
			
		|||
	release_assert_success (store, status);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int nano::version_store_rocksdb::get (nano::transaction const & transaction_a) const
 | 
			
		||||
int nano::rocksdb::version_store::get (nano::transaction const & transaction_a) const
 | 
			
		||||
{
 | 
			
		||||
	nano::uint256_union version_key{ 1 };
 | 
			
		||||
	nano::rocksdb_val data;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,14 +5,17 @@
 | 
			
		|||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
class rocksdb_store;
 | 
			
		||||
class version_store_rocksdb : public version_store
 | 
			
		||||
namespace rocksdb
 | 
			
		||||
{
 | 
			
		||||
protected:
 | 
			
		||||
	nano::rocksdb_store & store;
 | 
			
		||||
	class version_store : public nano::version_store
 | 
			
		||||
	{
 | 
			
		||||
	protected:
 | 
			
		||||
		nano::rocksdb_store & store;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
	explicit version_store_rocksdb (nano::rocksdb_store & store_a);
 | 
			
		||||
	void put (nano::write_transaction const & transaction_a, int version_a) override;
 | 
			
		||||
	int get (nano::transaction const & transaction_a) const override;
 | 
			
		||||
};
 | 
			
		||||
	public:
 | 
			
		||||
		explicit version_store (nano::rocksdb_store & store_a);
 | 
			
		||||
		void put (nano::write_transaction const & transaction_a, int version_a) override;
 | 
			
		||||
		int get (nano::transaction const & transaction_a) const override;
 | 
			
		||||
	};
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue