rippled
PeerfinderManager.cpp
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 #include <ripple/peerfinder/PeerfinderManager.h>
21 #include <ripple/peerfinder/impl/Checker.h>
22 #include <ripple/peerfinder/impl/Logic.h>
23 #include <ripple/peerfinder/impl/SourceStrings.h>
24 #include <ripple/peerfinder/impl/StoreSqdb.h>
25 #include <boost/asio/io_service.hpp>
26 #include <boost/utility/in_place_factory.hpp>
27 #include <memory>
28 #include <optional>
29 #include <thread>
30 
31 namespace ripple {
32 namespace PeerFinder {
33 
34 class ManagerImp : public Manager
35 {
36 public:
37  boost::asio::io_service& io_service_;
43  Logic<decltype(checker_)> m_logic;
45 
46  //--------------------------------------------------------------------------
47 
49  boost::asio::io_service& io_service,
50  clock_type& clock,
51  beast::Journal journal,
52  BasicConfig const& config,
53  beast::insight::Collector::ptr const& collector)
54  : Manager()
55  , io_service_(io_service)
56  , work_(std::in_place, std::ref(io_service_))
57  , m_clock(clock)
58  , m_journal(journal)
59  , m_store(journal)
61  , m_logic(clock, m_store, checker_, journal)
62  , m_config(config)
63  , m_stats(std::bind(&ManagerImp::collect_metrics, this), collector)
64  {
65  }
66 
67  ~ManagerImp() override
68  {
69  stop();
70  }
71 
72  void
73  stop() override
74  {
75  if (work_)
76  {
77  work_.reset();
78  checker_.stop();
79  m_logic.stop();
80  }
81  }
82 
83  //--------------------------------------------------------------------------
84  //
85  // PeerFinder
86  //
87  //--------------------------------------------------------------------------
88 
89  void
90  setConfig(Config const& config) override
91  {
93  }
94 
95  Config
96  config() override
97  {
98  return m_logic.config();
99  }
100 
101  void
103  std::string const& name,
104  std::vector<beast::IP::Endpoint> const& addresses) override
105  {
106  m_logic.addFixedPeer(name, addresses);
107  }
108 
109  void
111  std::string const& name,
112  std::vector<std::string> const& strings) override
113  {
115  }
116 
117  void
119  {
120  // VFALCO TODO This needs to be implemented
121  }
122 
123  //--------------------------------------------------------------------------
124 
127  beast::IP::Endpoint const& local_endpoint,
128  beast::IP::Endpoint const& remote_endpoint) override
129  {
130  return m_logic.new_inbound_slot(local_endpoint, remote_endpoint);
131  }
132 
134  new_outbound_slot(beast::IP::Endpoint const& remote_endpoint) override
135  {
136  return m_logic.new_outbound_slot(remote_endpoint);
137  }
138 
139  void
140  on_endpoints(std::shared_ptr<Slot> const& slot, Endpoints const& endpoints)
141  override
142  {
143  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
144  m_logic.on_endpoints(impl, endpoints);
145  }
146 
147  void
148  on_closed(std::shared_ptr<Slot> const& slot) override
149  {
150  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
151  m_logic.on_closed(impl);
152  }
153 
154  void
155  on_failure(std::shared_ptr<Slot> const& slot) override
156  {
157  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
158  m_logic.on_failure(impl);
159  }
160 
161  void
163  boost::asio::ip::tcp::endpoint const& remote_address,
165  {
166  m_logic.onRedirects(eps.begin(), eps.end(), remote_address);
167  }
168 
169  //--------------------------------------------------------------------------
170 
171  bool
173  std::shared_ptr<Slot> const& slot,
174  beast::IP::Endpoint const& local_endpoint) override
175  {
176  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
177  return m_logic.onConnected(impl, local_endpoint);
178  }
179 
180  Result
182  std::shared_ptr<Slot> const& slot,
183  PublicKey const& key,
184  bool reserved) override
185  {
186  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
187  return m_logic.activate(impl, key, reserved);
188  }
189 
191  redirect(std::shared_ptr<Slot> const& slot) override
192  {
193  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
194  return m_logic.redirect(impl);
195  }
196 
198  autoconnect() override
199  {
200  return m_logic.autoconnect();
201  }
202 
203  void
204  once_per_second() override
205  {
207  }
208 
211  {
213  }
214 
215  void
216  start() override
217  {
219  m_logic.load();
220  }
221 
222  //--------------------------------------------------------------------------
223  //
224  // PropertyStream
225  //
226  //--------------------------------------------------------------------------
227 
228  void
230  {
231  m_logic.onWrite(map);
232  }
233 
234 private:
235  struct Stats
236  {
237  template <class Handler>
239  Handler const& handler,
240  beast::insight::Collector::ptr const& collector)
241  : hook(collector->make_hook(handler))
243  collector->make_gauge("Peer_Finder", "Active_Inbound_Peers"))
245  collector->make_gauge("Peer_Finder", "Active_Outbound_Peers"))
246  {
247  }
248 
252  };
253 
256 
257  void
259  {
263  }
264 };
265 
266 //------------------------------------------------------------------------------
267 
268 Manager::Manager() noexcept : beast::PropertyStream::Source("peerfinder")
269 {
270 }
271 
274  boost::asio::io_service& io_service,
275  clock_type& clock,
276  beast::Journal journal,
277  BasicConfig const& config,
278  beast::insight::Collector::ptr const& collector)
279 {
280  return std::make_unique<ManagerImp>(
281  io_service, clock, journal, config, collector);
282 }
283 
284 } // namespace PeerFinder
285 } // namespace ripple
beast::PropertyStream::Source::name
std::string const & name() const
Returns the name of this source.
Definition: beast_PropertyStream.cpp:190
ripple::PeerFinder::ManagerImp::m_logic
Logic< decltype(checker_)> m_logic
Definition: PeerfinderManager.cpp:43
ripple::PeerFinder::Counts::inboundActive
int inboundActive() const
Returns the number of inbound peers assigned an open slot.
Definition: Counts.h:172
ripple::PeerFinder::Checker< boost::asio::ip::tcp >
std::string
STL class.
std::shared_ptr< Collector >
ripple::PeerFinder::ManagerImp::m_journal
beast::Journal m_journal
Definition: PeerfinderManager.cpp:40
ripple::PeerFinder::Logic::load
void load()
Definition: peerfinder/impl/Logic.h:131
beast::PropertyStream::Map
Definition: PropertyStream.h:224
ripple::PeerFinder::Logic
The Logic for maintaining the list of Slot addresses.
Definition: peerfinder/impl/Logic.h:54
ripple::PeerFinder::StoreSqdb
Database persistence for PeerFinder using SQLite.
Definition: StoreSqdb.h:33
ripple::PeerFinder::Logic::new_outbound_slot
SlotImp::ptr new_outbound_slot(beast::IP::Endpoint const &remote_endpoint)
Definition: peerfinder/impl/Logic.h:311
std::vector< beast::IP::Endpoint >
ripple::PeerFinder::Logic::on_failure
void on_failure(SlotImp::ptr const &slot)
Definition: peerfinder/impl/Logic.h:938
ripple::PeerFinder::ManagerImp::onConnected
bool onConnected(std::shared_ptr< Slot > const &slot, beast::IP::Endpoint const &local_endpoint) override
Called when an outbound connection attempt succeeds.
Definition: PeerfinderManager.cpp:172
ripple::PeerFinder::Logic::onRedirects
void onRedirects(FwdIter first, FwdIter last, boost::asio::ip::tcp::endpoint const &remote_address)
Definition: peerfinder/impl/Logic.h:1213
std::lock_guard
STL class.
ripple::PeerFinder::ManagerImp::work_
std::optional< boost::asio::io_service::work > work_
Definition: PeerfinderManager.cpp:38
ripple::PeerFinder::ManagerImp::Stats::activeOutboundPeers
beast::insight::Gauge activeOutboundPeers
Definition: PeerfinderManager.cpp:251
ripple::PeerFinder::Source
A static or dynamic source of peer addresses.
Definition: Source.h:37
ripple::PeerFinder::ManagerImp::addFallbackURL
void addFallbackURL(std::string const &name, std::string const &url)
Definition: PeerfinderManager.cpp:118
ripple::PeerFinder::ManagerImp::autoconnect
std::vector< beast::IP::Endpoint > autoconnect() override
Return a set of addresses we should connect to.
Definition: PeerfinderManager.cpp:198
std::optional::reset
T reset(T... args)
ripple::PeerFinder::ManagerImp::redirect
std::vector< Endpoint > redirect(std::shared_ptr< Slot > const &slot) override
Returns a set of endpoints suitable for redirection.
Definition: PeerfinderManager.cpp:191
ripple::PeerFinder::ManagerImp::m_config
BasicConfig const & m_config
Definition: PeerfinderManager.cpp:44
ripple::PeerFinder::ManagerImp::m_stats
Stats m_stats
Definition: PeerfinderManager.cpp:255
ripple::PeerFinder::ManagerImp::m_statsMutex
std::mutex m_statsMutex
Definition: PeerfinderManager.cpp:254
ripple::PeerFinder::ManagerImp::Stats
Definition: PeerfinderManager.cpp:235
ripple::PeerFinder::ManagerImp::m_store
StoreSqdb m_store
Definition: PeerfinderManager.cpp:41
ripple::PeerFinder::Logic::onConnected
bool onConnected(SlotImp::ptr const &slot, beast::IP::Endpoint const &local_endpoint)
Definition: peerfinder/impl/Logic.h:346
thread
ripple::PeerFinder::ManagerImp::addFixedPeer
void addFixedPeer(std::string const &name, std::vector< beast::IP::Endpoint > const &addresses) override
Add a peer that should always be connected.
Definition: PeerfinderManager.cpp:102
ripple::PeerFinder::ManagerImp::stop
void stop() override
Transition to the stopped state, synchronously.
Definition: PeerfinderManager.cpp:73
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::PeerFinder::ManagerImp::on_closed
void on_closed(std::shared_ptr< Slot > const &slot) override
Called when the slot is closed.
Definition: PeerfinderManager.cpp:148
ripple::PeerFinder::Logic::addStaticSource
void addStaticSource(std::shared_ptr< Source > const &source)
Definition: peerfinder/impl/Logic.h:1015
ripple::PeerFinder::Logic::buildEndpointsForPeers
std::vector< std::pair< std::shared_ptr< Slot >, std::vector< Endpoint > > > buildEndpointsForPeers()
Definition: peerfinder/impl/Logic.h:581
ripple::PeerFinder::ManagerImp::m_clock
clock_type & m_clock
Definition: PeerfinderManager.cpp:39
ripple::PeerFinder::Logic::redirect
std::vector< Endpoint > redirect(SlotImp::ptr const &slot)
Return a list of addresses suitable for redirection.
Definition: peerfinder/impl/Logic.h:451
ripple::PeerFinder::Logic::onWrite
void onWrite(beast::PropertyStream::Map &map)
Definition: peerfinder/impl/Logic.h:1138
ripple::PeerFinder::Counts::out_active
int out_active() const
Returns the number of outbound peers assigned an open slot.
Definition: Counts.h:112
ripple::PeerFinder::ManagerImp::start
void start() override
Transition to the started state, synchronously.
Definition: PeerfinderManager.cpp:216
ripple::PeerFinder::make_Manager
std::unique_ptr< Manager > make_Manager(boost::asio::io_service &io_service, clock_type &clock, beast::Journal journal, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Create a new Manager.
Definition: PeerfinderManager.cpp:273
ripple::PeerFinder::Logic::stop
void stop()
Stop the logic.
Definition: peerfinder/impl/Logic.h:144
ripple::PeerFinder::Logic::counts_
Counts counts_
Definition: peerfinder/impl/Logic.h:80
ripple::PeerFinder::ManagerImp::io_service_
boost::asio::io_service & io_service_
Definition: PeerfinderManager.cpp:37
ripple::PeerFinder::Logic::autoconnect
std::vector< beast::IP::Endpoint > autoconnect()
Create new outbound connection attempts as needed.
Definition: peerfinder/impl/Logic.h:467
ripple::PeerFinder::Logic::addFixedPeer
void addFixedPeer(std::string const &name, beast::IP::Endpoint const &ep)
Definition: peerfinder/impl/Logic.h:174
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::PeerFinder::Checker::stop
void stop()
Stop the service.
Definition: Checker.h:184
ripple::PeerFinder::Logic::activate
Result activate(SlotImp::ptr const &slot, PublicKey const &key, bool reserved)
Definition: peerfinder/impl/Logic.h:383
beast::abstract_clock
Abstract interface to a clock.
Definition: abstract_clock.h:57
memory
ripple::PeerFinder::ManagerImp::Stats::Stats
Stats(Handler const &handler, beast::insight::Collector::ptr const &collector)
Definition: PeerfinderManager.cpp:238
beast::insight::Gauge
A metric for measuring an integral value.
Definition: Gauge.h:39
ripple::PeerFinder::ManagerImp::buildEndpointsForPeers
std::vector< std::pair< std::shared_ptr< Slot >, std::vector< Endpoint > > > buildEndpointsForPeers() override
Definition: PeerfinderManager.cpp:210
ripple::PeerFinder::StoreSqdb::open
void open(BasicConfig const &config)
Definition: StoreSqdb.h:56
ripple::PeerFinder::Logic::once_per_second
void once_per_second()
Definition: peerfinder/impl/Logic.h:672
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::PeerFinder::ManagerImp::on_failure
void on_failure(std::shared_ptr< Slot > const &slot) override
Called when an outbound connection is deemed to have failed.
Definition: PeerfinderManager.cpp:155
ripple::PeerFinder::ManagerImp::once_per_second
void once_per_second() override
Perform periodic activity.
Definition: PeerfinderManager.cpp:204
ripple::PeerFinder::ManagerImp::config
Config config() override
Returns the configuration for the manager.
Definition: PeerfinderManager.cpp:96
ripple::PeerFinder::ManagerImp::addFallbackStrings
void addFallbackStrings(std::string const &name, std::vector< std::string > const &strings) override
Add a set of strings as fallback IP::Endpoint sources.
Definition: PeerfinderManager.cpp:110
std::vector::begin
T begin(T... args)
std
STL namespace.
ripple::PeerFinder::Logic::new_inbound_slot
SlotImp::ptr new_inbound_slot(beast::IP::Endpoint const &local_endpoint, beast::IP::Endpoint const &remote_endpoint)
Definition: peerfinder/impl/Logic.h:266
ripple::PeerFinder::ManagerImp::collect_metrics
void collect_metrics()
Definition: PeerfinderManager.cpp:258
ripple::PeerFinder::ManagerImp::Stats::hook
beast::insight::Hook hook
Definition: PeerfinderManager.cpp:249
ripple::PeerFinder::ManagerImp
Definition: PeerfinderManager.cpp:34
optional
std::mutex
STL class.
ripple::PeerFinder::ManagerImp::checker_
Checker< boost::asio::ip::tcp > checker_
Definition: PeerfinderManager.cpp:42
ripple::PeerFinder::ManagerImp::on_endpoints
void on_endpoints(std::shared_ptr< Slot > const &slot, Endpoints const &endpoints) override
Called when mtENDPOINTS is received.
Definition: PeerfinderManager.cpp:140
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:38
std::vector::end
T end(T... args)
ripple::PeerFinder::ManagerImp::onWrite
void onWrite(beast::PropertyStream::Map &map) override
Subclass override.
Definition: PeerfinderManager.cpp:229
ripple::PeerFinder::Config
PeerFinder configuration settings.
Definition: PeerfinderManager.h:40
ripple::PeerFinder::Logic::on_closed
void on_closed(SlotImp::ptr const &slot)
Definition: peerfinder/impl/Logic.h:887
ripple::PeerFinder::Logic::config
void config(Config const &c)
Definition: peerfinder/impl/Logic.h:159
ripple::PeerFinder::ManagerImp::onRedirects
void onRedirects(boost::asio::ip::tcp::endpoint const &remote_address, std::vector< boost::asio::ip::tcp::endpoint > const &eps) override
Called when we received redirect IPs from a busy peer.
Definition: PeerfinderManager.cpp:162
std::unique_ptr
STL class.
ripple::PeerFinder::ManagerImp::Stats::activeInboundPeers
beast::insight::Gauge activeInboundPeers
Definition: PeerfinderManager.cpp:250
ripple::PeerFinder::SourceStrings::New
static std::shared_ptr< Source > New(std::string const &name, Strings const &strings)
Definition: SourceStrings.cpp:65
ripple::PeerFinder::ManagerImp::~ManagerImp
~ManagerImp() override
Definition: PeerfinderManager.cpp:67
ripple::PeerFinder::ManagerImp::setConfig
void setConfig(Config const &config) override
Set the configuration for the manager.
Definition: PeerfinderManager.cpp:90
beast::insight::Hook
A reference to a handler for performing polled collection.
Definition: Hook.h:31
ripple::BasicConfig
Holds unparsed configuration information.
Definition: BasicConfig.h:215
ripple::PeerFinder::Manager::Manager
Manager() noexcept
Definition: PeerfinderManager.cpp:268
ripple::PeerFinder::ManagerImp::activate
Result activate(std::shared_ptr< Slot > const &slot, PublicKey const &key, bool reserved) override
Request an active slot type.
Definition: PeerfinderManager.cpp:181
ripple::PeerFinder::Manager
Maintains a set of IP addresses used for getting into the network.
Definition: PeerfinderManager.h:138
ripple::PeerFinder::ManagerImp::new_outbound_slot
std::shared_ptr< Slot > new_outbound_slot(beast::IP::Endpoint const &remote_endpoint) override
Create a new outbound slot with the specified remote endpoint.
Definition: PeerfinderManager.cpp:134
ripple::PeerFinder::ManagerImp::ManagerImp
ManagerImp(boost::asio::io_service &io_service, clock_type &clock, beast::Journal journal, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Definition: PeerfinderManager.cpp:48
ripple::PeerFinder::ManagerImp::new_inbound_slot
std::shared_ptr< Slot > new_inbound_slot(beast::IP::Endpoint const &local_endpoint, beast::IP::Endpoint const &remote_endpoint) override
Add a URL as a fallback location to obtain IP::Endpoint sources.
Definition: PeerfinderManager.cpp:126
ripple::PeerFinder::Logic::on_endpoints
void on_endpoints(SlotImp::ptr const &slot, Endpoints list)
Definition: peerfinder/impl/Logic.h:763
ripple::PeerFinder::Result
Result
Possible results from activating a slot.
Definition: PeerfinderManager.h:135
beast
Definition: base_uint.h:641