rippled
ValidatorSite.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2016 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_VALIDATORSITE_H_INCLUDED
21 #define RIPPLE_APP_MISC_VALIDATORSITE_H_INCLUDED
22 
23 #include <ripple/app/main/Application.h>
24 #include <ripple/app/misc/ValidatorList.h>
25 #include <ripple/app/misc/detail/Work.h>
26 #include <ripple/basics/Log.h>
27 #include <ripple/basics/StringUtilities.h>
28 #include <ripple/core/Config.h>
29 #include <ripple/json/json_value.h>
30 
31 #include <boost/asio.hpp>
32 
33 #include <memory>
34 #include <mutex>
35 #include <optional>
36 
37 namespace ripple {
38 
70 {
71  friend class Work;
72 
73 private:
74  using error_code = boost::system::error_code;
76  using endpoint_type = boost::asio::ip::tcp::endpoint;
77 
78  struct Site
79  {
80  struct Status
81  {
82  clock_type::time_point refreshed;
85  };
86 
87  struct Resource
88  {
89  explicit Resource(std::string uri_);
92  };
93 
94  explicit Site(std::string uri);
95 
98 
103 
108 
109  unsigned short redirCount;
111  clock_type::time_point nextRefresh;
115  };
116 
119 
120  // If both mutex are to be locked at the same time, `sites_mutex_` must be
121  // locked before `state_mutex_` or we may deadlock.
124 
127  boost::asio::basic_waitable_timer<clock_type> timer_;
128 
129  // A list is currently being fetched from a site
131 
132  // One or more lists are due to be fetched
135 
136  // The configured list of URIs for fetching lists
138 
139  // time to allow for requests to complete
141 
142 public:
144  Application& app,
145  std::optional<beast::Journal> j = std::nullopt,
147  ~ValidatorSite();
148 
159  bool
160  load(std::vector<std::string> const& siteURIs);
161 
170  void
171  start();
172 
179  void
180  join();
181 
190  void
191  stop();
192 
196  getJson() const;
197 
198 private:
200  bool
201  load(
202  std::vector<std::string> const& siteURIs,
204 
207  void
208  setTimer(
211 
213  void
214  onRequestTimeout(std::size_t siteIdx, error_code const& ec);
215 
217  void
218  onTimer(std::size_t siteIdx, error_code const& ec);
219 
221  void
222  onSiteFetch(
223  boost::system::error_code const& ec,
224  endpoint_type const& endpoint,
225  detail::response_type&& res,
226  std::size_t siteIdx);
227 
229  void
230  onTextFetch(
231  boost::system::error_code const& ec,
232  std::string const& res,
233  std::size_t siteIdx);
234 
237  void
238  makeRequest(
240  std::size_t siteIdx,
242 
245  void
247  std::string const& res,
248  std::size_t siteIdx,
250 
256  std::size_t siteIdx,
258 
261  bool
263 };
264 
265 } // namespace ripple
266 
267 #endif
std::chrono::system_clock
ripple::Application
Definition: Application.h:115
ripple::ValidatorSite::Site
Definition: ValidatorSite.h:78
ripple::ValidatorSite::Site::refreshInterval
std::chrono::minutes refreshInterval
Definition: ValidatorSite.h:110
std::string
STL class.
std::shared_ptr
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:55
ripple::ValidatorSite::timer_
boost::asio::basic_waitable_timer< clock_type > timer_
Definition: ValidatorSite.h:127
ripple::parsedURL
Definition: StringUtilities.h:116
ripple::ValidatorSite::Site::lastRefreshStatus
std::optional< Status > lastRefreshStatus
Definition: ValidatorSite.h:112
ripple::ValidatorSite
Definition: ValidatorSite.h:69
ripple::ValidatorSite::endpoint_type
boost::asio::ip::tcp::endpoint endpoint_type
Definition: ValidatorSite.h:76
std::vector
STL class.
ripple::ValidatorSite::stop
void stop()
Stop fetching lists from sites.
Definition: ValidatorSite.cpp:183
std::chrono::minutes
ripple::ValidatorSite::onRequestTimeout
void onRequestTimeout(std::size_t siteIdx, error_code const &ec)
request took too long
Definition: ValidatorSite.cpp:312
ripple::ValidatorSite::Site::Resource::uri
const std::string uri
Definition: ValidatorSite.h:90
ripple::ValidatorSite::work_
std::weak_ptr< detail::Work > work_
Definition: ValidatorSite.h:126
std::lock_guard
STL class.
ripple::ValidatorSite::Site::lastRequestSuccessful
bool lastRequestSuccessful
Definition: ValidatorSite.h:114
ripple::ValidatorSite::makeRequest
void makeRequest(std::shared_ptr< Site::Resource > resource, std::size_t siteIdx, std::lock_guard< std::mutex > const &)
Initiate request to given resource.
Definition: ValidatorSite.cpp:231
ripple::ValidatorSite::onSiteFetch
void onSiteFetch(boost::system::error_code const &ec, endpoint_type const &endpoint, detail::response_type &&res, std::size_t siteIdx)
Store latest list fetched from site.
Definition: ValidatorSite.cpp:540
ripple::ValidatorSite::state_mutex_
std::mutex state_mutex_
Definition: ValidatorSite.h:123
ripple::ValidatorSite::Work
friend class Work
Definition: ValidatorSite.h:71
ripple::ValidatorSite::fetching_
std::atomic< bool > fetching_
Definition: ValidatorSite.h:130
ripple::ValidatorSite::~ValidatorSite
~ValidatorSite()
Definition: ValidatorSite.cpp:102
ripple::ValidatorSite::setTimer
void setTimer(std::lock_guard< std::mutex > const &, std::lock_guard< std::mutex > const &)
Queue next site to be fetched lock over site_mutex_ and state_mutex_ required.
Definition: ValidatorSite.cpp:209
ripple::detail::response_type
boost::beast::http::response< boost::beast::http::string_body > response_type
Definition: Work.h:31
ripple::ValidatorSite::app_
Application & app_
Definition: ValidatorSite.h:117
ripple::ValidatorSite::Site::Status::refreshed
clock_type::time_point refreshed
Definition: ValidatorSite.h:82
ripple::ValidatorSite::pending_
std::atomic< bool > pending_
Definition: ValidatorSite.h:133
ripple::ValidatorSite::getJson
Json::Value getJson() const
Return JSON representation of configured validator sites.
Definition: ValidatorSite.cpp:667
ripple::ValidatorSite::j_
const beast::Journal j_
Definition: ValidatorSite.h:118
ripple::ValidatorSite::cv_
std::condition_variable cv_
Definition: ValidatorSite.h:125
ripple::ValidatorSite::parseJsonResponse
void parseJsonResponse(std::string const &res, std::size_t siteIdx, std::lock_guard< std::mutex > const &)
Parse json response from validator list site.
Definition: ValidatorSite.cpp:372
ripple::ValidatorSite::Site::Status::message
std::string message
Definition: ValidatorSite.h:84
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:58
ripple::ValidatorSite::join
void join()
Wait for current fetches from sites to complete.
Definition: ValidatorSite.cpp:176
std::atomic< bool >
ripple::ValidatorSite::processRedirect
std::shared_ptr< Site::Resource > processRedirect(detail::response_type &res, std::size_t siteIdx, std::lock_guard< std::mutex > const &)
Interpret a redirect response.
Definition: ValidatorSite.cpp:494
ripple::ValidatorSite::sites_mutex_
std::mutex sites_mutex_
Definition: ValidatorSite.h:122
ripple::ValidatorSite::Site::redirCount
unsigned short redirCount
Definition: ValidatorSite.h:109
memory
ripple::ValidatorSite::sites_
std::vector< Site > sites_
Definition: ValidatorSite.h:137
std::weak_ptr
STL class.
ripple::ValidatorSite::Site::nextRefresh
clock_type::time_point nextRefresh
Definition: ValidatorSite.h:111
ripple::ValidatorSite::requestTimeout_
const std::chrono::seconds requestTimeout_
Definition: ValidatorSite.h:140
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::ValidatorSite::Site::Resource
Definition: ValidatorSite.h:87
ripple::ValidatorSite::Site::activeResource
std::shared_ptr< Resource > activeResource
the active resource being requested.
Definition: ValidatorSite.h:107
ripple::ValidatorSite::Site::Resource::Resource
Resource(std::string uri_)
Definition: ValidatorSite.cpp:38
ripple::ValidatorSite::onTextFetch
void onTextFetch(boost::system::error_code const &ec, std::string const &res, std::size_t siteIdx)
Store latest list fetched from anywhere.
Definition: ValidatorSite.cpp:628
ripple::ValidatorSite::Site::Status::disposition
ListDisposition disposition
Definition: ValidatorSite.h:83
ripple::ValidatorSite::Site::loadedResource
std::shared_ptr< Resource > loadedResource
the original uri as loaded from config
Definition: ValidatorSite.h:97
ripple::ValidatorSite::stopping_
std::atomic< bool > stopping_
Definition: ValidatorSite.h:134
ripple::ValidatorSite::ValidatorSite
ValidatorSite(Application &app, std::optional< beast::Journal > j=std::nullopt, std::chrono::seconds timeout=std::chrono::seconds{20})
Definition: ValidatorSite.cpp:88
std::condition_variable
ripple::ValidatorSite::Site::Site
Site(std::string uri)
Definition: ValidatorSite.cpp:77
ripple::ValidatorSite::Site::Resource::pUrl
parsedURL pUrl
Definition: ValidatorSite.h:91
ripple::ValidatorSite::Site::Status
Definition: ValidatorSite.h:80
optional
mutex
std::size_t
ripple::ValidatorSite::start
void start()
Start fetching lists from sites.
Definition: ValidatorSite.cpp:167
ripple::ValidatorSite::onTimer
void onTimer(std::size_t siteIdx, error_code const &ec)
Fetch site whose time has come.
Definition: ValidatorSite.cpp:340
ripple::ValidatorSite::Site::startingResource
std::shared_ptr< Resource > startingResource
the resource to request at <timer> intervals.
Definition: ValidatorSite.h:102
ripple::ValidatorSite::error_code
boost::system::error_code error_code
Definition: ValidatorSite.h:74
ripple::ValidatorSite::missingSite
bool missingSite(std::lock_guard< std::mutex > const &)
If no sites are provided, or a site fails to load, get a list of local cache files from the Validator...
Definition: ValidatorSite.cpp:120
ripple::ValidatorSite::load
bool load(std::vector< std::string > const &siteURIs)
Load configured site URIs.
Definition: ValidatorSite.cpp:127
ripple::ValidatorSite::Site::lastRequestEndpoint
endpoint_type lastRequestEndpoint
Definition: ValidatorSite.h:113
Json::Value
Represents a JSON value.
Definition: json_value.h:145