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 
122 
125  boost::asio::basic_waitable_timer<clock_type> timer_;
126 
127  // A list is currently being fetched from a site
129 
130  // One or more lists are due to be fetched
133 
134  // The configured list of URIs for fetching lists
136 
137  // time to allow for requests to complete
139 
140 public:
142  Application& app,
143  std::optional<beast::Journal> j = std::nullopt,
145  ~ValidatorSite();
146 
157  bool
158  load(std::vector<std::string> const& siteURIs);
159 
168  void
169  start();
170 
177  void
178  join();
179 
188  void
189  stop();
190 
194  getJson() const;
195 
196 private:
198  bool
199  load(
200  std::vector<std::string> const& siteURIs,
202 
205  void
207 
209  void
210  onRequestTimeout(std::size_t siteIdx, error_code const& ec);
211 
213  void
214  onTimer(std::size_t siteIdx, error_code const& ec);
215 
217  void
218  onSiteFetch(
219  boost::system::error_code const& ec,
220  endpoint_type const& endpoint,
221  detail::response_type&& res,
222  std::size_t siteIdx);
223 
225  void
226  onTextFetch(
227  boost::system::error_code const& ec,
228  std::string const& res,
229  std::size_t siteIdx);
230 
233  void
234  makeRequest(
236  std::size_t siteIdx,
238 
241  void
243  std::string const& res,
244  std::size_t siteIdx,
246 
252  std::size_t siteIdx,
254 
257  bool
259 };
260 
261 } // namespace ripple
262 
263 #endif
std::chrono::system_clock
ripple::Application
Definition: Application.h:103
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:125
ripple::parsedURL
Definition: StringUtilities.h:100
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:124
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:528
ripple::ValidatorSite::state_mutex_
std::mutex state_mutex_
Definition: ValidatorSite.h:121
ripple::ValidatorSite::Work
friend class Work
Definition: ValidatorSite.h:71
ripple::ValidatorSite::fetching_
std::atomic< bool > fetching_
Definition: ValidatorSite.h:128
ripple::ValidatorSite::~ValidatorSite
~ValidatorSite()
Definition: ValidatorSite.cpp:103
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::setTimer
void setTimer(std::lock_guard< std::mutex > const &)
Queue next site to be fetched lock over state_mutex_ required.
Definition: ValidatorSite.cpp:209
ripple::ValidatorSite::Site::Status::refreshed
clock_type::time_point refreshed
Definition: ValidatorSite.h:82
ripple::ValidatorSite::pending_
std::atomic< bool > pending_
Definition: ValidatorSite.h:131
ripple::ValidatorSite::getJson
Json::Value getJson() const
Return JSON representation of configured validator sites.
Definition: ValidatorSite.cpp:651
ripple::ValidatorSite::j_
const beast::Journal j_
Definition: ValidatorSite.h:118
ripple::ValidatorSite::cv_
std::condition_variable cv_
Definition: ValidatorSite.h:123
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:360
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:482
ripple::ValidatorSite::sites_mutex_
std::mutex sites_mutex_
Definition: ValidatorSite.h:120
ripple::ValidatorSite::Site::redirCount
unsigned short redirCount
Definition: ValidatorSite.h:109
memory
ripple::ValidatorSite::sites_
std::vector< Site > sites_
Definition: ValidatorSite.h:135
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:138
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:39
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:614
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:132
ripple::ValidatorSite::ValidatorSite
ValidatorSite(Application &app, std::optional< beast::Journal > j=std::nullopt, std::chrono::seconds timeout=std::chrono::seconds{20})
Definition: ValidatorSite.cpp:89
std::condition_variable
ripple::ValidatorSite::Site::Site
Site(std::string uri)
Definition: ValidatorSite.cpp:78
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:168
ripple::ValidatorSite::onTimer
void onTimer(std::size_t siteIdx, error_code const &ec)
Fetch site whose time has come.
Definition: ValidatorSite.cpp:329
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:121
ripple::ValidatorSite::load
bool load(std::vector< std::string > const &siteURIs)
Load configured site URIs.
Definition: ValidatorSite.cpp:128
ripple::ValidatorSite::Site::lastRequestEndpoint
endpoint_type lastRequestEndpoint
Definition: ValidatorSite.h:113
Json::Value
Represents a JSON value.
Definition: json_value.h:145