Electroneum
Loading...
Searching...
No Matches
block_queue.h
Go to the documentation of this file.
1// Copyright (c) 2017-Present, Electroneum
2// Copyright (c) 2017-2019, The Monero Project
3//
4// All rights reserved.
5//
6// Redistribution and use in source and binary forms, with or without modification, are
7// permitted provided that the following conditions are met:
8//
9// 1. Redistributions of source code must retain the above copyright notice, this list of
10// conditions and the following disclaimer.
11//
12// 2. Redistributions in binary form must reproduce the above copyright notice, this list
13// of conditions and the following disclaimer in the documentation and/or other
14// materials provided with the distribution.
15//
16// 3. Neither the name of the copyright holder nor the names of its contributors may be
17// used to endorse or promote products derived from this software without specific
18// prior written permission.
19//
20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
21// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
22// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
23// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
25// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
27// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
28// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29//
30// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
31
32#pragma once
33
34#include <string>
35#include <vector>
36#include <set>
37#include <unordered_set>
38#include <boost/thread/recursive_mutex.hpp>
39#include <boost/uuid/uuid.hpp>
40
41#undef ELECTRONEUM_DEFAULT_LOG_CATEGORY
42#define ELECTRONEUM_DEFAULT_LOG_CATEGORY "cn.block_queue"
43
44namespace cryptonote
45{
46 struct block_complete_entry;
47
49 {
50 public:
51 struct span
52 {
54 std::vector<crypto::hash> hashes;
55 std::vector<cryptonote::block_complete_entry> blocks;
56 boost::uuids::uuid connection_id;
58 float rate;
59 size_t size;
60 boost::posix_time::ptime time;
61
62 span(uint64_t start_block_height, std::vector<cryptonote::block_complete_entry> blocks, const boost::uuids::uuid &connection_id, float rate, size_t size):
66
67 bool operator<(const span &s) const { return start_block_height < s.start_block_height; }
68 };
69 typedef std::set<span> block_map;
70
71 public:
72 void add_blocks(uint64_t height, std::vector<cryptonote::block_complete_entry> bcel, const boost::uuids::uuid &connection_id, float rate, size_t size);
73 void add_blocks(uint64_t height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time = boost::date_time::min_date_time);
74 void flush_spans(const boost::uuids::uuid &connection_id, bool all = false);
75 void flush_stale_spans(const std::set<boost::uuids::uuid> &live_connections);
76 bool remove_span(uint64_t start_block_height, std::vector<crypto::hash> *hashes = NULL);
77 void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height);
79 void print() const;
80 std::string get_overview(uint64_t blockchain_height) const;
81 bool has_unpruned_height(uint64_t block_height, uint64_t blockchain_height, uint32_t pruning_seed) const;
82 std::pair<uint64_t, uint64_t> reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, uint32_t pruning_seed, uint64_t blockchain_height, const std::vector<crypto::hash> &block_hashes, boost::posix_time::ptime time = boost::posix_time::microsec_clock::universal_time());
83 uint64_t get_next_needed_height(uint64_t blockchain_height) const;
84 std::pair<uint64_t, uint64_t> get_next_span_if_scheduled(std::vector<crypto::hash> &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const;
85 void reset_next_span_time(boost::posix_time::ptime t = boost::posix_time::microsec_clock::universal_time());
86 void set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::vector<crypto::hash> hashes);
87 bool get_next_span(uint64_t &height, std::vector<cryptonote::block_complete_entry> &bcel, boost::uuids::uuid &connection_id, bool filled = true) const;
88 bool has_next_span(const boost::uuids::uuid &connection_id, bool &filled, boost::posix_time::ptime &time) const;
89 bool has_next_span(uint64_t height, bool &filled, boost::posix_time::ptime &time, boost::uuids::uuid &connection_id) const;
90 size_t get_data_size() const;
91 size_t get_num_filled_spans_prefix() const;
92 size_t get_num_filled_spans() const;
93 crypto::hash get_last_known_hash(const boost::uuids::uuid &connection_id) const;
94 bool has_spans(const boost::uuids::uuid &connection_id) const;
95 float get_speed(const boost::uuids::uuid &connection_id) const;
96 float get_download_rate(const boost::uuids::uuid &connection_id) const;
97 bool foreach(std::function<bool(const span&)> f) const;
98 bool requested(const crypto::hash &hash) const;
99 bool have(const crypto::hash &hash) const;
100
101 private:
102 void erase_block(block_map::iterator j);
103 inline bool requested_internal(const crypto::hash &hash) const;
104
105 private:
107 mutable boost::recursive_mutex mutex;
108 std::unordered_set<crypto::hash> requested_hashes;
109 std::unordered_set<crypto::hash> have_blocks;
110 };
111}
uint64_t height
time_t time
float get_download_rate(const boost::uuids::uuid &connection_id) const
std::set< span > block_map
Definition block_queue.h:69
void remove_spans(const boost::uuids::uuid &connection_id, uint64_t start_block_height)
bool get_next_span(uint64_t &height, std::vector< cryptonote::block_complete_entry > &bcel, boost::uuids::uuid &connection_id, bool filled=true) const
std::pair< uint64_t, uint64_t > reserve_span(uint64_t first_block_height, uint64_t last_block_height, uint64_t max_blocks, const boost::uuids::uuid &connection_id, uint32_t pruning_seed, uint64_t blockchain_height, const std::vector< crypto::hash > &block_hashes, boost::posix_time::ptime time=boost::posix_time::microsec_clock::universal_time())
void flush_stale_spans(const std::set< boost::uuids::uuid > &live_connections)
bool requested(const crypto::hash &hash) const
float get_speed(const boost::uuids::uuid &connection_id) const
void set_span_hashes(uint64_t start_height, const boost::uuids::uuid &connection_id, std::vector< crypto::hash > hashes)
size_t get_num_filled_spans() const
bool remove_span(uint64_t start_block_height, std::vector< crypto::hash > *hashes=NULL)
crypto::hash get_last_known_hash(const boost::uuids::uuid &connection_id) const
void flush_spans(const boost::uuids::uuid &connection_id, bool all=false)
bool has_spans(const boost::uuids::uuid &connection_id) const
bool has_next_span(const boost::uuids::uuid &connection_id, bool &filled, boost::posix_time::ptime &time) const
size_t get_num_filled_spans_prefix() const
std::string get_overview(uint64_t blockchain_height) const
void add_blocks(uint64_t height, std::vector< cryptonote::block_complete_entry > bcel, const boost::uuids::uuid &connection_id, float rate, size_t size)
bool has_unpruned_height(uint64_t block_height, uint64_t blockchain_height, uint32_t pruning_seed) const
std::pair< uint64_t, uint64_t > get_next_span_if_scheduled(std::vector< crypto::hash > &hashes, boost::uuids::uuid &connection_id, boost::posix_time::ptime &time) const
uint64_t get_next_needed_height(uint64_t blockchain_height) const
uint64_t get_max_block_height() const
size_t get_data_size() const
void reset_next_span_time(boost::posix_time::ptime t=boost::posix_time::microsec_clock::universal_time())
bool have(const crypto::hash &hash) const
POD_CLASS hash
Definition hash.h:50
Holds cryptonote related classes and helpers.
Definition ban.cpp:40
STL namespace.
unsigned int uint32_t
Definition stdint.h:126
unsigned __int64 uint64_t
Definition stdint.h:136
std::vector< crypto::hash > hashes
Definition block_queue.h:54
boost::uuids::uuid connection_id
Definition block_queue.h:56
bool operator<(const span &s) const
Definition block_queue.h:67
boost::posix_time::ptime time
Definition block_queue.h:60
span(uint64_t start_block_height, uint64_t nblocks, const boost::uuids::uuid &connection_id, boost::posix_time::ptime time)
Definition block_queue.h:64
span(uint64_t start_block_height, std::vector< cryptonote::block_complete_entry > blocks, const boost::uuids::uuid &connection_id, float rate, size_t size)
Definition block_queue.h:62
struct hash_func hashes[]