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/misc/ValidatorList.h>
24 #include <ripple/app/misc/detail/Work.h>
25 #include <ripple/app/main/Application.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 #include <boost/asio.hpp>
31 #include <boost/optional.hpp>
32 #include <mutex>
33 #include <memory>
34 
35 namespace ripple {
36 
68 {
69  friend class Work;
70 
71 private:
72  using error_code = boost::system::error_code;
74 
75  struct Site
76  {
77  struct Status
78  {
79  clock_type::time_point refreshed;
82  };
83 
84  struct Resource
85  {
86  explicit Resource(std::string uri_);
89  };
90 
91  explicit Site(std::string uri);
92 
95 
100 
105 
106  unsigned short redirCount;
108  clock_type::time_point nextRefresh;
109  boost::optional<Status> lastRefreshStatus;
110  };
111 
114 
117 
120  boost::asio::basic_waitable_timer<clock_type> timer_;
121 
122  // A list is currently being fetched from a site
124 
125  // One or more lists are due to be fetched
128 
129  // The configured list of URIs for fetching lists
131 
132  // time to allow for requests to complete
134 
135 public:
136  ValidatorSite (
137  Application& app,
138  boost::optional<beast::Journal> j = boost::none,
140  ~ValidatorSite ();
141 
152  bool
153  load (
154  std::vector<std::string> const& siteURIs);
155 
164  void
165  start ();
166 
173  void
174  join ();
175 
184  void
185  stop ();
186 
190  getJson() const;
191 
192 private:
195  void
197 
199  void
201  std::size_t siteIdx,
202  error_code const& ec);
203 
205  void
206  onTimer (
207  std::size_t siteIdx,
208  error_code const& ec);
209 
211  void
212  onSiteFetch (
213  boost::system::error_code const& ec,
214  detail::response_type&& res,
215  std::size_t siteIdx);
216 
218  void
219  onTextFetch(
220  boost::system::error_code const& ec,
221  std::string const& res,
222  std::size_t siteIdx);
223 
226  void
227  makeRequest (
229  std::size_t siteIdx,
231 
234  void
236  std::string const& res,
237  std::size_t siteIdx,
239 
245  std::size_t siteIdx,
247 
250  bool
251  missingSite();
252 };
253 
254 } // ripple
255 
256 #endif
std::chrono::system_clock
ripple::Application
Definition: Application.h:85
ripple::ValidatorSite::Site::lastRefreshStatus
boost::optional< Status > lastRefreshStatus
Definition: ValidatorSite.h:109
ripple::ValidatorSite::Site
Definition: ValidatorSite.h:75
ripple::ValidatorSite::Site::refreshInterval
std::chrono::minutes refreshInterval
Definition: ValidatorSite.h:107
std::string
STL class.
std::shared_ptr
STL class.
ripple::ListDisposition
ListDisposition
Definition: ValidatorList.h:42
ripple::ValidatorSite::timer_
boost::asio::basic_waitable_timer< clock_type > timer_
Definition: ValidatorSite.h:120
ripple::parsedURL
Definition: StringUtilities.h:122
ripple::ValidatorSite::onSiteFetch
void onSiteFetch(boost::system::error_code const &ec, detail::response_type &&res, std::size_t siteIdx)
Store latest list fetched from site.
Definition: ValidatorSite.cpp:513
ripple::ValidatorSite
Definition: ValidatorSite.h:67
std::vector
STL class.
ripple::ValidatorSite::stop
void stop()
Stop fetching lists from sites.
Definition: ValidatorSite.cpp:179
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:87
ripple::ValidatorSite::work_
std::weak_ptr< detail::Work > work_
Definition: ValidatorSite.h:119
std::lock_guard
STL class.
ripple::ValidatorSite::processRedirect
std::shared_ptr< Site::Resource > processRedirect(detail::response_type &res, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Interpret a redirect response.
Definition: ValidatorSite.cpp:463
ripple::ValidatorSite::state_mutex_
std::mutex state_mutex_
Definition: ValidatorSite.h:116
ripple::ValidatorSite::Work
friend class Work
Definition: ValidatorSite.h:69
ripple::ValidatorSite::fetching_
std::atomic< bool > fetching_
Definition: ValidatorSite.h:123
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:112
ripple::ValidatorSite::parseJsonResponse
void parseJsonResponse(std::string const &res, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Parse json response from validator list site.
Definition: ValidatorSite.cpp:364
ripple::ValidatorSite::Site::Status::refreshed
clock_type::time_point refreshed
Definition: ValidatorSite.h:79
ripple::ValidatorSite::pending_
std::atomic< bool > pending_
Definition: ValidatorSite.h:126
ripple::ValidatorSite::ValidatorSite
ValidatorSite(Application &app, boost::optional< beast::Journal > j=boost::none, std::chrono::seconds timeout=std::chrono::seconds{20})
Definition: ValidatorSite.cpp:89
ripple::ValidatorSite::getJson
Json::Value getJson() const
Return JSON representation of configured validator sites.
Definition: ValidatorSite.cpp:643
ripple::ValidatorSite::j_
const beast::Journal j_
Definition: ValidatorSite.h:113
ripple::ValidatorSite::cv_
std::condition_variable cv_
Definition: ValidatorSite.h:118
ripple::ValidatorSite::Site::Status::message
std::string message
Definition: ValidatorSite.h:81
beast::Journal
A generic endpoint for log messages.
Definition: Journal.h:60
ripple::ValidatorSite::join
void join()
Wait for current fetches from sites to complete.
Definition: ValidatorSite.cpp:172
std::atomic< bool >
ripple::ValidatorSite::sites_mutex_
std::mutex sites_mutex_
Definition: ValidatorSite.h:115
ripple::ValidatorSite::Site::redirCount
unsigned short redirCount
Definition: ValidatorSite.h:106
memory
ripple::ValidatorSite::sites_
std::vector< Site > sites_
Definition: ValidatorSite.h:130
std::weak_ptr
STL class.
ripple::ValidatorSite::makeRequest
void makeRequest(std::shared_ptr< Site::Resource > resource, std::size_t siteIdx, std::lock_guard< std::mutex > &lock)
Initiate request to given resource.
Definition: ValidatorSite.cpp:229
ripple::ValidatorSite::Site::nextRefresh
clock_type::time_point nextRefresh
Definition: ValidatorSite.h:108
ripple::ValidatorSite::requestTimeout_
const std::chrono::seconds requestTimeout_
Definition: ValidatorSite.h:133
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:84
ripple::ValidatorSite::Site::activeResource
std::shared_ptr< Resource > activeResource
the active resource being requested.
Definition: ValidatorSite.h:104
ripple::ValidatorSite::Site::Resource::Resource
Resource(std::string uri_)
Definition: ValidatorSite.cpp:40
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:602
ripple::ValidatorSite::Site::Status::disposition
ListDisposition disposition
Definition: ValidatorSite.h:80
ripple::ValidatorSite::Site::loadedResource
std::shared_ptr< Resource > loadedResource
the original uri as loaded from config
Definition: ValidatorSite.h:94
ripple::ValidatorSite::stopping_
std::atomic< bool > stopping_
Definition: ValidatorSite.h:127
std::condition_variable
ripple::ValidatorSite::Site::Site
Site(std::string uri)
Definition: ValidatorSite.cpp:80
ripple::ValidatorSite::missingSite
bool missingSite()
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::Site::Resource::pUrl
parsedURL pUrl
Definition: ValidatorSite.h:88
ripple::ValidatorSite::Site::Status
Definition: ValidatorSite.h:77
mutex
std::size_t
ripple::ValidatorSite::start
void start()
Start fetching lists from sites.
Definition: ValidatorSite.cpp:164
ripple::ValidatorSite::onTimer
void onTimer(std::size_t siteIdx, error_code const &ec)
Fetch site whose time has come.
Definition: ValidatorSite.cpp:332
ripple::ValidatorSite::Site::startingResource
std::shared_ptr< Resource > startingResource
the resource to request at <timer> intervals.
Definition: ValidatorSite.h:99
ripple::ValidatorSite::error_code
boost::system::error_code error_code
Definition: ValidatorSite.h:72
ripple::ValidatorSite::setTimer
void setTimer(std::lock_guard< std::mutex > &)
Queue next site to be fetched lock over state_mutex_ required.
Definition: ValidatorSite.cpp:205
ripple::ValidatorSite::load
bool load(std::vector< std::string > const &siteURIs)
Load configured site URIs.
Definition: ValidatorSite.cpp:128
Json::Value
Represents a JSON value.
Definition: json_value.h:141