rippled
Loading...
Searching...
No Matches
HashRouter.h
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012, 2013 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#ifndef RIPPLE_APP_MISC_HASHROUTER_H_INCLUDED
21#define RIPPLE_APP_MISC_HASHROUTER_H_INCLUDED
22
23#include <xrpl/basics/CountedObject.h>
24#include <xrpl/basics/UnorderedContainers.h>
25#include <xrpl/basics/base_uint.h>
26#include <xrpl/basics/chrono.h>
27#include <xrpl/beast/container/aged_unordered_map.h>
28
29#include <optional>
30
31namespace ripple {
32
33// TODO convert these macros to int constants or an enum
34#define SF_BAD 0x02 // Temporarily bad
35#define SF_SAVED 0x04
36#define SF_TRUSTED 0x10 // comes from trusted source
37
38// Private flags, used internally in apply.cpp.
39// Do not attempt to read, set, or reuse.
40#define SF_PRIVATE1 0x0100
41#define SF_PRIVATE2 0x0200
42#define SF_PRIVATE3 0x0400
43#define SF_PRIVATE4 0x0800
44#define SF_PRIVATE5 0x1000
45#define SF_PRIVATE6 0x2000
46
54{
55public:
56 // The type here *MUST* match the type of Peer::id_t
58
59private:
62 class Entry : public CountedObject<Entry>
63 {
64 public:
66 {
67 }
68
69 void
71 {
72 if (peer != 0)
73 peers_.insert(peer);
74 }
75
76 int
77 getFlags(void) const
78 {
79 return flags_;
80 }
81
82 void
83 setFlags(int flagsToSet)
84 {
85 flags_ |= flagsToSet;
86 }
87
91 {
92 return std::move(peers_);
93 }
94
97 relayed() const
98 {
99 return relayed_;
100 }
101
108 bool
110 Stopwatch::time_point const& now,
111 std::chrono::seconds holdTime)
112 {
113 if (relayed_ && *relayed_ + holdTime > now)
114 return false;
115 relayed_.emplace(now);
116 return true;
117 }
118
119 bool
121 {
122 if (processed_ && ((*processed_ + interval) > now))
123 return false;
124 processed_.emplace(now);
125 return true;
126 }
127
128 private:
129 int flags_ = 0;
131 // This could be generalized to a map, if more
132 // than one flag needs to expire independently.
135 };
136
137public:
138 static inline std::chrono::seconds
140 {
141 using namespace std::chrono;
142
143 return 300s;
144 }
145
146 HashRouter(Stopwatch& clock, std::chrono::seconds entryHoldTimeInSeconds)
147 : suppressionMap_(clock), holdTime_(entryHoldTimeInSeconds)
148 {
149 }
150
152 operator=(HashRouter const&) = delete;
153
154 virtual ~HashRouter() = default;
155
156 // VFALCO TODO Replace "Supression" terminology with something more
157 // semantically meaningful.
158 void
159 addSuppression(uint256 const& key);
160
161 bool
162 addSuppressionPeer(uint256 const& key, PeerShortID peer);
163
171
172 bool
173 addSuppressionPeer(uint256 const& key, PeerShortID peer, int& flags);
174
175 // Add a peer suppression and return whether the entry should be processed
176 bool
178 uint256 const& key,
179 PeerShortID peer,
180 int& flags,
181 std::chrono::seconds tx_interval);
182
187 bool
188 setFlags(uint256 const& key, int flags);
189
190 int
191 getFlags(uint256 const& key);
192
206 shouldRelay(uint256 const& key);
207
208private:
209 // pair.second indicates whether the entry was created
211 emplace(uint256 const&);
212
214
215 // Stores all suppressed hashes and their expiration time
217 uint256,
218 Entry,
222
224};
225
226} // namespace ripple
227
228#endif
typename Clock::time_point time_point
Associative container where each element is also indexed by time.
Tracks the number of instances of an object.
An entry in the routing table.
Definition: HashRouter.h:63
void setFlags(int flagsToSet)
Definition: HashRouter.h:83
std::optional< Stopwatch::time_point > processed_
Definition: HashRouter.h:134
int getFlags(void) const
Definition: HashRouter.h:77
std::set< PeerShortID > peers_
Definition: HashRouter.h:130
std::optional< Stopwatch::time_point > relayed() const
Return seated relay time point if the message has been relayed.
Definition: HashRouter.h:97
std::optional< Stopwatch::time_point > relayed_
Definition: HashRouter.h:133
void addPeer(PeerShortID peer)
Definition: HashRouter.h:70
std::set< PeerShortID > releasePeerSet()
Return set of peers we've relayed to and reset tracking.
Definition: HashRouter.h:90
bool shouldProcess(Stopwatch::time_point now, std::chrono::seconds interval)
Definition: HashRouter.h:120
bool shouldRelay(Stopwatch::time_point const &now, std::chrono::seconds holdTime)
Determines if this item should be relayed.
Definition: HashRouter.h:109
Routing table for objects identified by hash.
Definition: HashRouter.h:54
std::chrono::seconds const holdTime_
Definition: HashRouter.h:223
beast::aged_unordered_map< uint256, Entry, Stopwatch::clock_type, hardened_hash< strong_hash > > suppressionMap_
Definition: HashRouter.h:221
HashRouter(Stopwatch &clock, std::chrono::seconds entryHoldTimeInSeconds)
Definition: HashRouter.h:146
static std::chrono::seconds getDefaultHoldTime()
Definition: HashRouter.h:139
std::optional< std::set< PeerShortID > > shouldRelay(uint256 const &key)
Determines whether the hashed item should be relayed.
Definition: HashRouter.cpp:118
bool shouldProcess(uint256 const &key, PeerShortID peer, int &flags, std::chrono::seconds tx_interval)
Definition: HashRouter.cpp:78
std::mutex mutex_
Definition: HashRouter.h:213
int getFlags(uint256 const &key)
Definition: HashRouter.cpp:94
virtual ~HashRouter()=default
bool addSuppressionPeer(uint256 const &key, PeerShortID peer)
Definition: HashRouter.cpp:51
std::pair< bool, std::optional< Stopwatch::time_point > > addSuppressionPeerWithStatus(uint256 const &key, PeerShortID peer)
Add a suppression peer and get message's relay status.
Definition: HashRouter.cpp:57
HashRouter & operator=(HashRouter const &)=delete
bool setFlags(uint256 const &key, int flags)
Set the flags on a hash.
Definition: HashRouter.cpp:102
std::pair< Entry &, bool > emplace(uint256 const &)
Definition: HashRouter.cpp:25
void addSuppression(uint256 const &key)
Definition: HashRouter.cpp:43
Seed functor once per construction.
Definition: hardened_hash.h:97
T emplace(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
base_uint< 256 > uint256
Definition: base_uint.h:557