TARAXA
Loading...
Searching...
No Matches
packets_blocking_mask.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <libp2p/Common.h>
4
5#include <map>
6
9
10namespace taraxa {
11class PbftManager;
12}
13
15
17 public:
18 PacketsBlockingMask(const std::shared_ptr<PbftManager>& pbft_mgr);
20
25
26 void markPacketAsHardBlocked(const PacketData& blocking_packet, SubprotocolPacketType packet_type_to_block);
27 void markPacketAsHardUnblocked(const PacketData& blocking_packet, SubprotocolPacketType packet_type_to_unblock);
28
29 void markPacketAsPeerOrderBlocked(const PacketData& blocking_packet, SubprotocolPacketType packet_type_to_block);
30 void markPacketAsPeerOrderUnblocked(const PacketData& blocking_packet, SubprotocolPacketType packet_type_to_unblock);
31
34
35 void setDagBlockBeingProcessed(const PacketData& packet);
36 void unsetDagBlockBeingProcessed(const PacketData& packet);
37
38 bool isPacketBlocked(const PacketData& packet_data) const;
39
40 private:
41 bool isPacketHardBlocked(const PacketData& packet_data) const;
42 bool isPacketPeerOrderBlocked(const PacketData& packet_data) const;
43 bool isDagBlockPacketBlockedByLevel(const PacketData& packet_data) const;
44 bool isDagBlockPacketBlockedBySameDagBlock(const PacketData& packet_data) const;
45 dev::RLP dagBlockFromDagPacket(const PacketData& packet_data) const;
46
47 std::optional<taraxa::level_t> getSmallestDagLevelBeingProcessed() const;
48
49 private:
50 // Packets types that are currently hard blocked for processing in another threads due to dependencies,
51 // e.g. syncing packets must be processed synchronously one by one, etc...
52 // Each packet type might be simultaneously blocked by multiple different packets that are being processed. They
53 // are saved in std::unordered_set<PacketData::PacketId> so hard block is released after the last blocking packet
54 // is processed.
55 std::unordered_map<SubprotocolPacketType, std::unordered_set<PacketData::PacketId>> hard_blocked_packet_types_;
56
57 // Packets types that are blocked only for processing when received from specific peer & after specific
58 // time (order), e.g.: new dag block packet processing is blocked until all transactions packets that were received
59 // before it are processed. This blocking dependency is applied only for the same peer so transaction packet from one
60 // peer does not block new dag block packet from another peer Order of blocks must be preserved, therefore using
61 // std::set<PacketData::PacketId>
62 std::unordered_map<SubprotocolPacketType, std::unordered_map<dev::p2p::NodeID, std::set<PacketData::PacketId>>>
64
65 // This "blocking dependency" is specific just for DagBlockPacket. Ideally only dag blocks with the same level
66 // should be processed. In reality there are situation when node receives dag block with smaller level than the level
67 // of blocks that are already being processed. In such case these blocks with smaller levels can be processed
68 // concurrently with blocks that have higher level. All new dag blocks with higher level than the lowest level from
69 // all the blocks that currently being processed are blocked for processing In this map are saved pairs of <level,
70 // list>, where:
71 // level - What dag level have blocks that are currently being processed
72 // list - list of "DagBlockPacket" packets (of the same dag block level) that are currently being processed
73 // concurrently
74 // Order of levels must be preserved, therefore using std::map
75 std::map<taraxa::level_t, std::unordered_set<PacketData::PacketId>> processing_dag_levels_;
76
77 // This "blocking dependency" is specific just for DagBlockPacket. Multiple nodes can send same dag blocks
78 // concurrently, to reduce perofrmance impact only one packet/block will be processsed and others will be waiting.
79 // This map contains dag blocks that are currently processed with the associated packet id
80 std::map<taraxa::sig_t, PacketData::PacketId> processing_dag_blocks_;
81
82 std::shared_ptr<PbftManager> pbft_mgr_;
83
84 static constexpr size_t kRequiredDagPacketSizeV3 = 2;
85 static constexpr size_t kDagBlockPosV3 = 1;
86 static constexpr size_t kRequiredDagPacketSizeV2 = 8;
87};
88
89} // namespace taraxa::network::threadpool
Definition RLP.h:56
Definition packet_data.hpp:12
Definition packets_blocking_mask.hpp:16
dev::RLP dagBlockFromDagPacket(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:82
bool isDagBlockPacketBlockedByLevel(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:164
std::shared_ptr< PbftManager > pbft_mgr_
Definition packets_blocking_mask.hpp:82
void markPacketAsPeerOrderUnblocked(const PacketData &blocking_packet, SubprotocolPacketType packet_type_to_unblock)
Definition packets_blocking_mask.cpp:49
void setDagBlockBeingProcessed(const PacketData &packet)
Definition packets_blocking_mask.cpp:93
void markPacketAsHardUnblocked(const PacketData &blocking_packet, SubprotocolPacketType packet_type_to_unblock)
Definition packets_blocking_mask.cpp:20
static constexpr size_t kRequiredDagPacketSizeV3
Definition packets_blocking_mask.hpp:84
std::unordered_map< SubprotocolPacketType, std::unordered_map< dev::p2p::NodeID, std::set< PacketData::PacketId > > > peer_order_blocked_packet_types_
Definition packets_blocking_mask.hpp:63
std::map< taraxa::sig_t, PacketData::PacketId > processing_dag_blocks_
Definition packets_blocking_mask.hpp:80
void unsetDagBlockBeingProcessed(const PacketData &packet)
Definition packets_blocking_mask.cpp:104
PacketsBlockingMask(const PacketsBlockingMask &)=default
PacketsBlockingMask(PacketsBlockingMask &&)=default
std::unordered_map< SubprotocolPacketType, std::unordered_set< PacketData::PacketId > > hard_blocked_packet_types_
Definition packets_blocking_mask.hpp:55
std::map< taraxa::level_t, std::unordered_set< PacketData::PacketId > > processing_dag_levels_
Definition packets_blocking_mask.hpp:75
static constexpr size_t kRequiredDagPacketSizeV2
Definition packets_blocking_mask.hpp:86
bool isPacketBlocked(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:205
bool isPacketHardBlocked(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:154
void unsetDagBlockLevelBeingProcessed(const PacketData &packet)
Definition packets_blocking_mask.cpp:132
PacketsBlockingMask & operator=(const PacketsBlockingMask &)=default
static constexpr size_t kDagBlockPosV3
Definition packets_blocking_mask.hpp:85
void setDagBlockLevelBeingProcessed(const PacketData &packet)
Definition packets_blocking_mask.cpp:114
std::optional< taraxa::level_t > getSmallestDagLevelBeingProcessed() const
Definition packets_blocking_mask.cpp:74
bool isPacketPeerOrderBlocked(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:179
PacketsBlockingMask & operator=(PacketsBlockingMask &&)=default
void markPacketAsHardBlocked(const PacketData &blocking_packet, SubprotocolPacketType packet_type_to_block)
Definition packets_blocking_mask.cpp:10
void markPacketAsPeerOrderBlocked(const PacketData &blocking_packet, SubprotocolPacketType packet_type_to_block)
Definition packets_blocking_mask.cpp:38
bool isDagBlockPacketBlockedBySameDagBlock(const PacketData &packet_data) const
Definition packets_blocking_mask.cpp:159
Definition node_stats.hpp:18
SubprotocolPacketType
SubprotocolPacketType is used in networking layer to differentiate packet types.
Definition packet_types.hpp:12
Definition app.hpp:16