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 <ripple/core/SociDB.h>
26 #include <boost/asio/io_service.hpp>
27 #include <boost/optional.hpp>
28 #include <boost/utility/in_place_factory.hpp>
29 #include <memory>
30 #include <thread>
31 
32 namespace ripple {
33 namespace PeerFinder {
34 
36  : public Manager
37 {
38 public:
39  boost::asio::io_service &io_service_;
40  boost::optional <boost::asio::io_service::work> work_;
45  Logic <decltype(checker_)> m_logic;
47 
48  //--------------------------------------------------------------------------
49 
51  Stoppable& stoppable,
52  boost::asio::io_service& io_service,
53  clock_type& clock,
54  beast::Journal journal,
55  BasicConfig const& config,
56  beast::insight::Collector::ptr const& collector)
57  : Manager (stoppable)
58  , io_service_(io_service)
59  , work_(boost::in_place(std::ref(io_service_)))
60  , m_clock (clock)
61  , m_journal (journal)
62  , m_store (journal)
64  , m_logic (clock, m_store, checker_, journal)
65  , m_sociConfig (config, "peerfinder")
66  , m_stats(std::bind(&ManagerImp::collect_metrics, this),collector)
67  {
68  }
69 
70  ~ManagerImp() override
71  {
72  close();
73  }
74 
75  void
77  {
78  if (work_)
79  {
80  work_ = boost::none;
81  checker_.stop();
82  m_logic.stop();
83  }
84  }
85 
86  //--------------------------------------------------------------------------
87  //
88  // PeerFinder
89  //
90  //--------------------------------------------------------------------------
91 
92  void setConfig (Config const& config) override
93  {
95  }
96 
97  Config
98  config() override
99  {
100  return m_logic.config();
101  }
102 
104  std::vector <beast::IP::Endpoint> const& addresses) override
105  {
106  m_logic.addFixedPeer (name, addresses);
107  }
108 
109  void
111  std::vector <std::string> const& strings) override
112  {
114  }
115 
117  std::string const& url)
118  {
119  // VFALCO TODO This needs to be implemented
120  }
121 
122  //--------------------------------------------------------------------------
123 
126  beast::IP::Endpoint const& local_endpoint,
127  beast::IP::Endpoint const& remote_endpoint) override
128  {
129  return m_logic.new_inbound_slot (local_endpoint, remote_endpoint);
130  }
131 
133  new_outbound_slot (beast::IP::Endpoint const& remote_endpoint) override
134  {
135  return m_logic.new_outbound_slot (remote_endpoint);
136  }
137 
138  void
140  Endpoints const& endpoints) override
141  {
142  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
143  m_logic.on_endpoints (impl, endpoints);
144  }
145 
146  void
147  on_closed (std::shared_ptr<Slot> const& slot) override
148  {
149  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
150  m_logic.on_closed (impl);
151  }
152 
153  void
154  on_failure (std::shared_ptr<Slot> const& slot) override
155  {
156  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
157  m_logic.on_failure (impl);
158  }
159 
160  void
161  onRedirects (boost::asio::ip::tcp::endpoint const& remote_address,
163  {
164  m_logic.onRedirects(eps.begin(), eps.end(), remote_address);
165  }
166 
167  //--------------------------------------------------------------------------
168 
169  bool
171  beast::IP::Endpoint const& local_endpoint) override
172  {
173  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
174  return m_logic.onConnected (impl, local_endpoint);
175  }
176 
177  Result
179  PublicKey const& key, bool reserved) override
180  {
181  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
182  return m_logic.activate (impl, key, reserved);
183  }
184 
186  redirect (std::shared_ptr<Slot> const& slot) override
187  {
188  SlotImp::ptr impl (std::dynamic_pointer_cast <SlotImp> (slot));
189  return m_logic.redirect (impl);
190  }
191 
193  autoconnect() override
194  {
195  return m_logic.autoconnect();
196  }
197 
198  void
199  once_per_second() override
200  {
202  }
203 
206  {
208  }
209 
210  //--------------------------------------------------------------------------
211  //
212  // Stoppable
213  //
214  //--------------------------------------------------------------------------
215 
216  void
217  onPrepare () override
218  {
220  m_logic.load ();
221  }
222 
223  void
224  onStart() override
225  {
226  }
227 
228  void onStop () override
229  {
230  close();
231  stopped();
232  }
233 
234  //--------------------------------------------------------------------------
235  //
236  // PropertyStream
237  //
238  //--------------------------------------------------------------------------
239 
240  void onWrite (beast::PropertyStream::Map& map) override
241  {
242  m_logic.onWrite (map);
243  }
244 
245 private:
246  struct Stats
247  {
248 
249  template <class Handler>
251  Handler const& handler,
252  beast::insight::Collector::ptr const& collector)
253  : hook (collector->make_hook (handler))
254  , activeInboundPeers(collector->make_gauge("Peer_Finder","Active_Inbound_Peers"))
255  , activeOutboundPeers(collector->make_gauge("Peer_Finder","Active_Outbound_Peers"))
256  {
257  }
258 
262  };
263 
266 
271  }
272 };
273 
274 //------------------------------------------------------------------------------
275 
277  : Stoppable ("PeerFinder", parent)
278  , beast::PropertyStream::Source ("peerfinder")
279 {
280 }
281 
283 make_Manager (Stoppable& parent, boost::asio::io_service& io_service,
284  clock_type& clock, beast::Journal journal, BasicConfig const& config, beast::insight::Collector::ptr const& collector)
285 {
286  return std::make_unique<ManagerImp> (
287  parent, io_service, clock, journal, config, collector);
288 }
289 
290 }
291 }
beast::PropertyStream::Source::name
std::string const & name() const
Returns the name of this source.
Definition: beast_PropertyStream.cpp:189
ripple::PeerFinder::ManagerImp::m_logic
Logic< decltype(checker_)> m_logic
Definition: PeerfinderManager.cpp:45
ripple::PeerFinder::Counts::inboundActive
int inboundActive() const
Returns the number of inbound peers assigned an open slot.
Definition: Counts.h:179
ripple::PeerFinder::Checker< boost::asio::ip::tcp >
ripple::SociConfig
SociConfig is used when a client wants to delay opening a soci::session after parsing the config para...
Definition: SociDB.h:75
ripple::PeerFinder::ManagerImp::m_sociConfig
SociConfig m_sociConfig
Definition: PeerfinderManager.cpp:46
std::string
STL class.
std::shared_ptr< Collector >
ripple::PeerFinder::ManagerImp::m_journal
beast::Journal m_journal
Definition: PeerfinderManager.cpp:42
ripple::PeerFinder::Logic::load
void load()
Definition: peerfinder/impl/Logic.h:128
ripple::Stoppable::stopped
void stopped()
Called by derived classes to indicate that the stoppable has stopped.
Definition: Stoppable.cpp:71
beast::PropertyStream::Map
Definition: PropertyStream.h:185
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:31
ripple::PeerFinder::StoreSqdb::open
void open(SociConfig const &sociConfig)
Definition: StoreSqdb.h:54
ripple::PeerFinder::Logic::new_outbound_slot
SlotImp::ptr new_outbound_slot(beast::IP::Endpoint const &remote_endpoint)
Definition: peerfinder/impl/Logic.h:300
std::vector< beast::IP::Endpoint >
ripple::PeerFinder::Logic::on_failure
void on_failure(SlotImp::ptr const &slot)
Definition: peerfinder/impl/Logic.h:910
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:170
ripple::PeerFinder::Logic::onRedirects
void onRedirects(FwdIter first, FwdIter last, boost::asio::ip::tcp::endpoint const &remote_address)
Definition: peerfinder/impl/Logic.h:1167
std::lock_guard
STL class.
ripple::PeerFinder::ManagerImp::Stats::activeOutboundPeers
beast::insight::Gauge activeOutboundPeers
Definition: PeerfinderManager.cpp:261
ripple::PeerFinder::Source
A static or dynamic source of peer addresses.
Definition: Source.h:37
boost
Definition: IPAddress.h:127
ripple::PeerFinder::ManagerImp::addFallbackURL
void addFallbackURL(std::string const &name, std::string const &url)
Definition: PeerfinderManager.cpp:116
ripple::PeerFinder::ManagerImp::autoconnect
std::vector< beast::IP::Endpoint > autoconnect() override
Return a set of addresses we should connect to.
Definition: PeerfinderManager.cpp:193
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:186
ripple::PeerFinder::ManagerImp::m_stats
Stats m_stats
Definition: PeerfinderManager.cpp:265
ripple::PeerFinder::ManagerImp::onStop
void onStop() override
Override called when the stop notification is issued.
Definition: PeerfinderManager.cpp:228
ripple::PeerFinder::ManagerImp::m_statsMutex
std::mutex m_statsMutex
Definition: PeerfinderManager.cpp:264
ripple::PeerFinder::ManagerImp::Stats
Definition: PeerfinderManager.cpp:246
ripple::PeerFinder::ManagerImp::m_store
StoreSqdb m_store
Definition: PeerfinderManager.cpp:43
ripple::Stoppable
Provides an interface for starting and stopping.
Definition: Stoppable.h:200
ripple::PeerFinder::ManagerImp::onPrepare
void onPrepare() override
Override called during preparation.
Definition: PeerfinderManager.cpp:217
ripple::PeerFinder::Logic::onConnected
bool onConnected(SlotImp::ptr const &slot, beast::IP::Endpoint const &local_endpoint)
Definition: peerfinder/impl/Logic.h:338
thread
ripple::PeerFinder::Manager::Manager
Manager(Stoppable &parent)
Definition: PeerfinderManager.cpp:276
ripple::PeerFinder::ManagerImp::ManagerImp
ManagerImp(Stoppable &stoppable, boost::asio::io_service &io_service, clock_type &clock, beast::Journal journal, BasicConfig const &config, beast::insight::Collector::ptr const &collector)
Definition: PeerfinderManager.cpp:50
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:103
ripple::PeerFinder::make_Manager
std::unique_ptr< Manager > make_Manager(Stoppable &parent, 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:283
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:147
ripple::PeerFinder::Logic::addStaticSource
void addStaticSource(std::shared_ptr< Source > const &source)
Definition: peerfinder/impl/Logic.h:980
ripple::PeerFinder::Logic::buildEndpointsForPeers
std::vector< std::pair< std::shared_ptr< Slot >, std::vector< Endpoint > > > buildEndpointsForPeers()
Definition: peerfinder/impl/Logic.h:577
ripple::PeerFinder::ManagerImp::m_clock
clock_type & m_clock
Definition: PeerfinderManager.cpp:41
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:446
ripple::PeerFinder::Logic::onWrite
void onWrite(beast::PropertyStream::Map &map)
Definition: peerfinder/impl/Logic.h:1099
ripple::PeerFinder::Counts::out_active
int out_active() const
Returns the number of outbound peers assigned an open slot.
Definition: Counts.h:108
ripple::PeerFinder::Logic::stop
void stop()
Stop the logic.
Definition: peerfinder/impl/Logic.h:140
ripple::PeerFinder::Logic::counts_
Counts counts_
Definition: peerfinder/impl/Logic.h:81
ripple::PeerFinder::ManagerImp::io_service_
boost::asio::io_service & io_service_
Definition: PeerfinderManager.cpp:39
ripple::PeerFinder::Logic::autoconnect
std::vector< beast::IP::Endpoint > autoconnect()
Create new outbound connection attempts as needed.
Definition: peerfinder/impl/Logic.h:464
ripple::PeerFinder::Logic::addFixedPeer
void addFixedPeer(std::string const &name, beast::IP::Endpoint const &ep)
Definition: peerfinder/impl/Logic.h:170
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
ripple::PeerFinder::Checker::stop
void stop()
Stop the service.
Definition: Checker.h:183
ripple::PeerFinder::Logic::activate
Result activate(SlotImp::ptr const &slot, PublicKey const &key, bool reserved)
Definition: peerfinder/impl/Logic.h:375
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:250
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:205
ripple::PeerFinder::Logic::once_per_second
void once_per_second()
Definition: peerfinder/impl/Logic.h:664
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:154
ripple::PeerFinder::ManagerImp::onStart
void onStart() override
Override called during start.
Definition: PeerfinderManager.cpp:224
ripple::PeerFinder::ManagerImp::once_per_second
void once_per_second() override
Perform periodic activity.
Definition: PeerfinderManager.cpp:199
ripple::PeerFinder::ManagerImp::config
Config config() override
Returns the configuration for the manager.
Definition: PeerfinderManager.cpp:98
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:257
ripple::PeerFinder::ManagerImp::collect_metrics
void collect_metrics()
Definition: PeerfinderManager.cpp:267
ripple::PeerFinder::ManagerImp::Stats::hook
beast::insight::Hook hook
Definition: PeerfinderManager.cpp:259
ripple::PeerFinder::ManagerImp
Definition: PeerfinderManager.cpp:35
std::mutex
STL class.
ripple::PeerFinder::ManagerImp::checker_
Checker< boost::asio::ip::tcp > checker_
Definition: PeerfinderManager.cpp:44
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:139
beast::IP::Endpoint
A version-independent IP address and port combination.
Definition: IPEndpoint.h:39
std::vector::end
T end(T... args)
ripple::PeerFinder::ManagerImp::onWrite
void onWrite(beast::PropertyStream::Map &map) override
Subclass override.
Definition: PeerfinderManager.cpp:240
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:861
ripple::PeerFinder::ManagerImp::close
void close()
Definition: PeerfinderManager.cpp:76
ripple::PeerFinder::Logic::config
void config(Config const &c)
Definition: peerfinder/impl/Logic.h:155
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:161
std::unique_ptr
STL class.
ripple::PeerFinder::ManagerImp::Stats::activeInboundPeers
beast::insight::Gauge activeInboundPeers
Definition: PeerfinderManager.cpp:260
ripple::PeerFinder::ManagerImp::work_
boost::optional< boost::asio::io_service::work > work_
Definition: PeerfinderManager.cpp:40
ripple::PeerFinder::SourceStrings::New
static std::shared_ptr< Source > New(std::string const &name, Strings const &strings)
Definition: SourceStrings.cpp:63
ripple::PeerFinder::ManagerImp::~ManagerImp
~ManagerImp() override
Definition: PeerfinderManager.cpp:70
ripple::PeerFinder::ManagerImp::setConfig
void setConfig(Config const &config) override
Set the configuration for the manager.
Definition: PeerfinderManager.cpp:92
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:177
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:178
ripple::PeerFinder::Manager
Maintains a set of IP addresses used for getting into the network.
Definition: PeerfinderManager.h:122
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:133
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:125
ripple::PeerFinder::Logic::on_endpoints
void on_endpoints(SlotImp::ptr const &slot, Endpoints list)
Definition: peerfinder/impl/Logic.h:755
ripple::PeerFinder::Result
Result
Possible results from activating a slot.
Definition: PeerfinderManager.h:114
beast
Definition: base_uint.h:582