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/core/SociDB.h>
21 #include <ripple/peerfinder/PeerfinderManager.h>
22 #include <ripple/peerfinder/impl/Checker.h>
23 #include <ripple/peerfinder/impl/Logic.h>
24 #include <ripple/peerfinder/impl/SourceStrings.h>
25 #include <ripple/peerfinder/impl/StoreSqdb.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 
35 class ManagerImp : public Manager
36 {
37 public:
38  boost::asio::io_service& io_service_;
39  boost::optional<boost::asio::io_service::work> work_;
44  Logic<decltype(checker_)> m_logic;
46 
47  //--------------------------------------------------------------------------
48 
50  Stoppable& stoppable,
51  boost::asio::io_service& io_service,
52  clock_type& clock,
53  beast::Journal journal,
54  BasicConfig const& config,
55  beast::insight::Collector::ptr const& collector)
56  : Manager(stoppable)
57  , io_service_(io_service)
58  , work_(boost::in_place(std::ref(io_service_)))
59  , m_clock(clock)
60  , m_journal(journal)
61  , m_store(journal)
63  , m_logic(clock, m_store, checker_, journal)
64  , m_sociConfig(config, "peerfinder")
65  , m_stats(std::bind(&ManagerImp::collect_metrics, this), collector)
66  {
67  }
68 
69  ~ManagerImp() override
70  {
71  close();
72  }
73 
74  void
76  {
77  if (work_)
78  {
79  work_ = boost::none;
80  checker_.stop();
81  m_logic.stop();
82  }
83  }
84 
85  //--------------------------------------------------------------------------
86  //
87  // PeerFinder
88  //
89  //--------------------------------------------------------------------------
90 
91  void
92  setConfig(Config const& config) override
93  {
95  }
96 
97  Config
98  config() override
99  {
100  return m_logic.config();
101  }
102 
103  void
105  std::string const& name,
106  std::vector<beast::IP::Endpoint> const& addresses) override
107  {
108  m_logic.addFixedPeer(name, addresses);
109  }
110 
111  void
113  std::string const& name,
114  std::vector<std::string> const& strings) override
115  {
117  }
118 
119  void
121  {
122  // VFALCO TODO This needs to be implemented
123  }
124 
125  //--------------------------------------------------------------------------
126 
129  beast::IP::Endpoint const& local_endpoint,
130  beast::IP::Endpoint const& remote_endpoint) override
131  {
132  return m_logic.new_inbound_slot(local_endpoint, remote_endpoint);
133  }
134 
136  new_outbound_slot(beast::IP::Endpoint const& remote_endpoint) override
137  {
138  return m_logic.new_outbound_slot(remote_endpoint);
139  }
140 
141  void
142  on_endpoints(std::shared_ptr<Slot> const& slot, Endpoints const& endpoints)
143  override
144  {
145  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
146  m_logic.on_endpoints(impl, endpoints);
147  }
148 
149  void
150  on_closed(std::shared_ptr<Slot> const& slot) override
151  {
152  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
153  m_logic.on_closed(impl);
154  }
155 
156  void
157  on_failure(std::shared_ptr<Slot> const& slot) override
158  {
159  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
160  m_logic.on_failure(impl);
161  }
162 
163  void
165  boost::asio::ip::tcp::endpoint const& remote_address,
167  {
168  m_logic.onRedirects(eps.begin(), eps.end(), remote_address);
169  }
170 
171  //--------------------------------------------------------------------------
172 
173  bool
175  std::shared_ptr<Slot> const& slot,
176  beast::IP::Endpoint const& local_endpoint) override
177  {
178  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
179  return m_logic.onConnected(impl, local_endpoint);
180  }
181 
182  Result
184  std::shared_ptr<Slot> const& slot,
185  PublicKey const& key,
186  bool reserved) override
187  {
188  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
189  return m_logic.activate(impl, key, reserved);
190  }
191 
193  redirect(std::shared_ptr<Slot> const& slot) override
194  {
195  SlotImp::ptr impl(std::dynamic_pointer_cast<SlotImp>(slot));
196  return m_logic.redirect(impl);
197  }
198 
200  autoconnect() override
201  {
202  return m_logic.autoconnect();
203  }
204 
205  void
206  once_per_second() override
207  {
209  }
210 
213  {
215  }
216 
217  //--------------------------------------------------------------------------
218  //
219  // Stoppable
220  //
221  //--------------------------------------------------------------------------
222 
223  void
224  onPrepare() override
225  {
227  m_logic.load();
228  }
229 
230  void
231  onStart() override
232  {
233  }
234 
235  void
236  onStop() override
237  {
238  close();
239  stopped();
240  }
241 
242  //--------------------------------------------------------------------------
243  //
244  // PropertyStream
245  //
246  //--------------------------------------------------------------------------
247 
248  void
250  {
251  m_logic.onWrite(map);
252  }
253 
254 private:
255  struct Stats
256  {
257  template <class Handler>
259  Handler const& handler,
260  beast::insight::Collector::ptr const& collector)
261  : hook(collector->make_hook(handler))
263  collector->make_gauge("Peer_Finder", "Active_Inbound_Peers"))
265  collector->make_gauge("Peer_Finder", "Active_Outbound_Peers"))
266  {
267  }
268 
272  };
273 
276 
277  void
279  {
283  }
284 };
285 
286 //------------------------------------------------------------------------------
287 
289  : Stoppable("PeerFinder", parent)
290  , beast::PropertyStream::Source("peerfinder")
291 {
292 }
293 
296  Stoppable& parent,
297  boost::asio::io_service& io_service,
298  clock_type& clock,
299  beast::Journal journal,
300  BasicConfig const& config,
301  beast::insight::Collector::ptr const& collector)
302 {
303  return std::make_unique<ManagerImp>(
304  parent, io_service, clock, journal, config, collector);
305 }
306 
307 } // namespace PeerFinder
308 } // 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:44
ripple::PeerFinder::Counts::inboundActive
int inboundActive() const
Returns the number of inbound peers assigned an open slot.
Definition: Counts.h:193
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:76
ripple::PeerFinder::ManagerImp::m_sociConfig
SociConfig m_sociConfig
Definition: PeerfinderManager.cpp:45
std::string
STL class.
std::shared_ptr< Collector >
ripple::PeerFinder::ManagerImp::m_journal
beast::Journal m_journal
Definition: PeerfinderManager.cpp:41
ripple::PeerFinder::Logic::load
void load()
Definition: peerfinder/impl/Logic.h:131
ripple::Stoppable::stopped
void stopped()
Called by derived classes to indicate that the stoppable has stopped.
Definition: Stoppable.cpp:72
beast::PropertyStream::Map
Definition: PropertyStream.h:236
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:311
std::vector< beast::IP::Endpoint >
ripple::PeerFinder::Logic::on_failure
void on_failure(SlotImp::ptr const &slot)
Definition: peerfinder/impl/Logic.h:927
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:174
ripple::PeerFinder::Logic::onRedirects
void onRedirects(FwdIter first, FwdIter last, boost::asio::ip::tcp::endpoint const &remote_address)
Definition: peerfinder/impl/Logic.h:1202
std::lock_guard
STL class.
ripple::PeerFinder::ManagerImp::Stats::activeOutboundPeers
beast::insight::Gauge activeOutboundPeers
Definition: PeerfinderManager.cpp:271
ripple::PeerFinder::Source
A static or dynamic source of peer addresses.
Definition: Source.h:37
boost
Definition: IPAddress.h:117
ripple::PeerFinder::ManagerImp::addFallbackURL
void addFallbackURL(std::string const &name, std::string const &url)
Definition: PeerfinderManager.cpp:120
ripple::PeerFinder::ManagerImp::autoconnect
std::vector< beast::IP::Endpoint > autoconnect() override
Return a set of addresses we should connect to.
Definition: PeerfinderManager.cpp:200
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:193
ripple::PeerFinder::ManagerImp::m_stats
Stats m_stats
Definition: PeerfinderManager.cpp:275
ripple::PeerFinder::ManagerImp::onStop
void onStop() override
Override called when the stop notification is issued.
Definition: PeerfinderManager.cpp:236
ripple::PeerFinder::ManagerImp::m_statsMutex
std::mutex m_statsMutex
Definition: PeerfinderManager.cpp:274
ripple::PeerFinder::ManagerImp::Stats
Definition: PeerfinderManager.cpp:255
ripple::PeerFinder::ManagerImp::m_store
StoreSqdb m_store
Definition: PeerfinderManager.cpp:42
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:224
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::Manager::Manager
Manager(Stoppable &parent)
Definition: PeerfinderManager.cpp:288
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:49
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:104
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:295
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:150
ripple::PeerFinder::Logic::addStaticSource
void addStaticSource(std::shared_ptr< Source > const &source)
Definition: peerfinder/impl/Logic.h:1004
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:40
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:1127
ripple::PeerFinder::Counts::out_active
int out_active() const
Returns the number of outbound peers assigned an open slot.
Definition: Counts.h:114
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:38
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:258
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:212
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:157
ripple::PeerFinder::ManagerImp::onStart
void onStart() override
Override called during start.
Definition: PeerfinderManager.cpp:231
ripple::PeerFinder::ManagerImp::once_per_second
void once_per_second() override
Perform periodic activity.
Definition: PeerfinderManager.cpp:206
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:112
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:278
ripple::PeerFinder::ManagerImp::Stats::hook
beast::insight::Hook hook
Definition: PeerfinderManager.cpp:269
ripple::PeerFinder::ManagerImp
Definition: PeerfinderManager.cpp:35
std::mutex
STL class.
ripple::PeerFinder::ManagerImp::checker_
Checker< boost::asio::ip::tcp > checker_
Definition: PeerfinderManager.cpp:43
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:142
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:249
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:876
ripple::PeerFinder::ManagerImp::close
void close()
Definition: PeerfinderManager.cpp:75
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:164
std::unique_ptr
STL class.
ripple::PeerFinder::ManagerImp::Stats::activeInboundPeers
beast::insight::Gauge activeInboundPeers
Definition: PeerfinderManager.cpp:270
ripple::PeerFinder::ManagerImp::work_
boost::optional< boost::asio::io_service::work > work_
Definition: PeerfinderManager.cpp:39
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:69
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:178
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:183
ripple::PeerFinder::Manager
Maintains a set of IP addresses used for getting into the network.
Definition: PeerfinderManager.h:121
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:136
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:128
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:118
beast
Definition: base_uint.h:646