rippled
Loading...
Searching...
No Matches
LedgerMaster.h
1#pragma once
2
3#include <xrpld/app/ledger/AbstractFetchPackContainer.h>
4#include <xrpld/app/ledger/InboundLedgers.h>
5#include <xrpld/app/ledger/Ledger.h>
6#include <xrpld/app/ledger/LedgerHistory.h>
7#include <xrpld/app/ledger/LedgerHolder.h>
8#include <xrpld/app/ledger/LedgerReplay.h>
9#include <xrpld/app/main/Application.h>
10#include <xrpld/app/misc/CanonicalTXSet.h>
11
12#include <xrpl/basics/RangeSet.h>
13#include <xrpl/basics/UptimeClock.h>
14#include <xrpl/basics/chrono.h>
15#include <xrpl/beast/insight/Collector.h>
16#include <xrpl/protocol/Protocol.h>
17#include <xrpl/protocol/RippleLedgerHash.h>
18#include <xrpl/protocol/messages.h>
19
20#include <mutex>
21#include <optional>
22
23namespace xrpl {
24
25class Peer;
26class Transaction;
27
28// Tracks the current ledger and any ledgers in the process of closing
29// Tracks ledger history
30// Tracks held transactions
32{
33public:
34 explicit LedgerMaster(
35 Application& app,
37 beast::insight::Collector::ptr const& collector,
38 beast::Journal journal);
39
40 virtual ~LedgerMaster() = default;
41
46
47 bool
48 isCompatible(ReadView const&, beast::Journal::Stream, char const* reason);
49
51 peekMutex();
52
53 // The current ledger is the ledger we believe new transactions should go in
56
57 // The finalized ledger is the last closed/accepted ledger
60 {
61 return mClosedLedger.get();
62 }
63
64 // The validated ledger is the last fully validated ledger.
67
68 // The Rules are in the last fully validated ledger if there is one.
69 Rules
71
72 // This is the last ledger we published to clients and can lag the validated
73 // ledger
76
81 bool
82 isCaughtUp(std::string& reason);
83
86
87 bool
89
90 void
91 setFullLedger(std::shared_ptr<Ledger const> const& ledger, bool isSynchronous, bool isCurrent);
92
97 bool
99
100 void
101 switchLCL(std::shared_ptr<Ledger const> const& lastClosed);
102
103 void
104 failedSave(std::uint32_t seq, uint256 const& hash);
105
108
114 void
116
124
127 uint256
129
133
143 std::uint32_t index,
144 std::shared_ptr<ReadView const> const& referenceLedger,
145 InboundLedger::Reason reason);
146
149
151 getLedgerByHash(uint256 const& hash);
152
153 void
155
157 getCloseTimeBySeq(LedgerIndex ledgerIndex);
158
160 getCloseTimeByHash(LedgerHash const& ledgerHash, LedgerIndex ledgerIndex);
161
162 void
164 void
165 fixMismatch(ReadView const& ledger);
166
167 bool
169 void
171 bool
172 isValidated(ReadView const& ledger);
173 bool
175 bool
177
178 void
179 sweep();
180 float
182
183 void
185 void
186 checkAccept(uint256 const& hash, std::uint32_t seq);
187 void
188 consensusBuilt(std::shared_ptr<Ledger const> const& ledger, uint256 const& consensusHash, Json::Value consensus);
189
190 void
192
193 void
194 tryAdvance();
195 bool
196 newPathRequest(); // Returns true if path request successfully placed.
197 bool
199 bool
200 newOrderBookDB(); // Returns true if able to fulfill request.
201
202 bool
203 fixIndex(LedgerIndex ledgerIndex, LedgerHash const& ledgerHash);
204
205 void
207
208 void
210
211 // ledger replay
212 void
216
217 // Fetch Packs
218 void
219 gotFetchPack(bool progress, std::uint32_t seq);
220
221 void
222 addFetchPack(uint256 const& hash, std::shared_ptr<Blob> data);
223
225 getFetchPack(uint256 const& hash) override;
226
227 void
229 std::weak_ptr<Peer> const& wPeer,
231 uint256 haveLedgerHash,
233
235 getFetchPackCacheSize() const;
236
238 bool
240 {
241 return !mValidLedger.empty();
242 }
243
244 // Returns the minimum ledger sequence in SQL database, if any.
246 minSqlSeq();
247
248 // Iff a txn exists at the specified ledger and offset then return its txnid
250 txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex);
251
252private:
253 void
255 void
257
258 void
260
261 void
263
266
269 void
271 std::uint32_t missing,
272 bool& progress,
275 // Try to publish ledgers, acquire missing ledgers. Always called with
276 // m_mutex locked. The passed lock is a reminder to callers.
277 void
279
282
283 void
284 updatePaths();
285
286 // Returns true if work started. Always called with m_mutex locked.
287 // The passed lock is a reminder to callers.
288 bool
290
293
295
296 // The ledger that most recently closed.
298
299 // The highest-sequence ledger we have fully accepted.
301
302 // The last ledger we have published.
304
305 // The last ledger we did pathfinding against.
307
308 // The last ledger we handled fetching history
310
311 // Fully validated ledger, whether or not we have the ledger resident.
313
315
317
318 // A set of transactions to replay during the next close
320
323
324 // Publish thread is running.
325 bool mAdvanceThread{false};
326
327 // Publish thread has work to do.
328 bool mAdvanceWork{false};
330
331 int mPathFindThread{0}; // Pathfinder jobs dispatched
333
334 std::atomic_flag mGotFetchPackThread = ATOMIC_FLAG_INIT; // GotFetchPack jobs dispatched
335
341
342 // The server is in standalone mode
343 bool const standalone_;
344
345 // How many ledgers before the current ledger do we allow peers to request?
347
348 // How much history do we want to keep
350
352
354
356
357 // Try to keep a validator from switching from test to live network
358 // without first wiping the database.
360
361 // Time that the previous upgrade warning was issued.
363
364private:
365 struct Stats
366 {
367 template <class Handler>
368 Stats(Handler const& handler, beast::insight::Collector::ptr const& collector)
369 : hook(collector->make_hook(handler))
370 , validatedLedgerAge(collector->make_gauge("LedgerMaster", "Validated_Ledger_Age"))
371 , publishedLedgerAge(collector->make_gauge("LedgerMaster", "Published_Ledger_Age"))
372 {
373 }
374
378 };
379
381
382private:
383 void
390};
391
392} // namespace xrpl
Represents a JSON value.
Definition json_value.h:130
Provide a light-weight way to check active() before string formatting.
Definition Journal.h:180
A generic endpoint for log messages.
Definition Journal.h:40
typename Clock::time_point time_point
A metric for measuring an integral value.
Definition Gauge.h:20
void set(value_type value) const
Set the value on the gauge.
Definition Gauge.h:48
A reference to a handler for performing polled collection.
Definition Hook.h:12
An interface facilitating retrieval of fetch packs without an application or ledgermaster object.
Holds transactions which were deferred to the next pass of consensus.
Retains historical ledgers.
Hold a ledger in a thread-safe way.
std::shared_ptr< Ledger const > get()
std::optional< LedgerIndex > minSqlSeq()
std::atomic< LedgerIndex > mValidLedgerSeq
void consensusBuilt(std::shared_ptr< Ledger const > const &ledger, uint256 const &consensusHash, Json::Value consensus)
Report that the consensus process built a particular ledger.
bool haveLedger(std::uint32_t seq)
TaggedCache< uint256, Blob > fetch_packs_
std::size_t getNeededValidations()
Determines how many validations are needed to fully validate a ledger.
bool isCompatible(ReadView const &, beast::Journal::Stream, char const *reason)
std::shared_ptr< STTx const > popAcctTransaction(std::shared_ptr< STTx const > const &tx)
Get the next transaction held for a particular account if any.
void setValidLedger(std::shared_ptr< Ledger const > const &l)
void switchLCL(std::shared_ptr< Ledger const > const &lastClosed)
std::recursive_mutex & peekMutex()
std::uint32_t fetch_seq_
std::chrono::seconds getValidatedLedgerAge()
TimeKeeper::time_point upgradeWarningPrevTime_
LedgerIndex getCurrentLedgerIndex()
bool fixIndex(LedgerIndex ledgerIndex, LedgerHash const &ledgerHash)
bool getValidatedRange(std::uint32_t &minVal, std::uint32_t &maxVal)
void applyHeldTransactions()
Apply held transactions to the open ledger This is normally called as we close the ledger.
bool storeLedger(std::shared_ptr< Ledger const > ledger)
void gotFetchPack(bool progress, std::uint32_t seq)
void tryFill(std::shared_ptr< Ledger const > ledger)
std::shared_ptr< Ledger const > getLedgerBySeq(std::uint32_t index)
bool haveValidated()
Whether we have ever fully validated a ledger.
void setPubLedger(std::shared_ptr< Ledger const > const &l)
bool newPFWork(char const *name, std::unique_lock< std::recursive_mutex > &)
A thread needs to be dispatched to handle pathfinding work of some kind.
void setFullLedger(std::shared_ptr< Ledger const > const &ledger, bool isSynchronous, bool isCurrent)
void clearPriorLedgers(LedgerIndex seq)
LedgerIndex const max_ledger_difference_
CanonicalTXSet mHeldTransactions
std::uint32_t const ledger_fetch_size_
void setBuildingLedger(LedgerIndex index)
std::pair< uint256, LedgerIndex > mLastValidLedger
bool isCaughtUp(std::string &reason)
std::size_t getFetchPackCacheSize() const
std::optional< Blob > getFetchPack(uint256 const &hash) override
Retrieves partial ledger data of the corresponding hash from peers.
std::vector< std::shared_ptr< Ledger const > > findNewLedgersToPublish(std::unique_lock< std::recursive_mutex > &)
std::atomic< std::uint32_t > mPubLedgerClose
std::optional< NetClock::time_point > getCloseTimeByHash(LedgerHash const &ledgerHash, LedgerIndex ledgerIndex)
std::uint32_t const fetch_depth_
std::atomic< LedgerIndex > mPubLedgerSeq
void clearLedger(std::uint32_t seq)
void clearLedgerCachePrior(LedgerIndex seq)
std::atomic_flag mGotFetchPackThread
uint256 getHashBySeq(std::uint32_t index)
Get a ledger's hash by sequence number using the cache.
std::shared_ptr< Ledger const > getClosedLedger()
void setLedgerRangePresent(std::uint32_t minV, std::uint32_t maxV)
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
std::string getCompleteLedgers()
std::shared_ptr< Ledger const > getValidatedLedger()
virtual ~LedgerMaster()=default
void fetchForHistory(std::uint32_t missing, bool &progress, InboundLedger::Reason reason, std::unique_lock< std::recursive_mutex > &)
std::uint32_t const ledger_history_
bool isValidated(ReadView const &ledger)
void fixMismatch(ReadView const &ledger)
void makeFetchPack(std::weak_ptr< Peer > const &wPeer, std::shared_ptr< protocol::TMGetObjectByHash > const &request, uint256 haveLedgerHash, UptimeClock::time_point uptime)
LedgerIndex getValidLedgerIndex()
std::shared_ptr< Ledger const > mPathLedger
bool const standalone_
std::shared_ptr< ReadView const > getPublishedLedger()
std::shared_ptr< Ledger const > mHistLedger
std::optional< LedgerHash > walkHashBySeq(std::uint32_t index, InboundLedger::Reason reason)
Walk to a ledger's hash using the skip list.
LedgerHistory mLedgerHistory
std::atomic< std::uint32_t > mValidLedgerSign
std::chrono::seconds getPublishedLedgerAge()
std::optional< uint256 > txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex)
bool canBeCurrent(std::shared_ptr< Ledger const > const &ledger)
Check the sequence number and parent close time of a ledger against our clock and last validated ledg...
void addFetchPack(uint256 const &hash, std::shared_ptr< Blob > data)
bool getFullValidatedRange(std::uint32_t &minVal, std::uint32_t &maxVal)
std::optional< LedgerHash > getLedgerHashForHistory(LedgerIndex index, InboundLedger::Reason reason)
RangeSet< std::uint32_t > mCompleteLedgers
LedgerHolder mValidLedger
void checkAccept(std::shared_ptr< Ledger const > const &ledger)
LedgerHolder mClosedLedger
void doAdvance(std::unique_lock< std::recursive_mutex > &)
void addHeldTransaction(std::shared_ptr< Transaction > const &trans)
std::shared_ptr< ReadView const > getCurrentLedger()
beast::Journal m_journal
void takeReplay(std::unique_ptr< LedgerReplay > replay)
std::unique_ptr< LedgerReplay > replayData
std::unique_ptr< LedgerReplay > releaseReplay()
std::shared_ptr< Ledger const > getLedgerByHash(uint256 const &hash)
std::uint32_t getEarliestFetch()
std::recursive_mutex m_mutex
std::shared_ptr< Ledger const > mPubLedger
void failedSave(std::uint32_t seq, uint256 const &hash)
Application & app_
std::atomic< LedgerIndex > mBuildingLedgerSeq
std::recursive_mutex mCompleteLock
A view into a ledger.
Definition ReadView.h:31
Rules controlling protocol behavior.
Definition Rules.h:18
Map/cache combination.
Definition TaggedCache.h:42
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
bool isCurrent(ValidationParms const &p, NetClock::time_point now, NetClock::time_point signTime, NetClock::time_point seenTime)
Whether a validation is still current.
Stopwatch & stopwatch()
Returns an instance of a wall clock.
Definition chrono.h:93
boost::icl::interval_set< T, std::less, ClosedInterval< T > > RangeSet
A set of closed intervals over the domain T.
Definition RangeSet.h:50
base_uint< 256 > uint256
Definition base_uint.h:526
Stats(Handler const &handler, beast::insight::Collector::ptr const &collector)
beast::insight::Hook hook
beast::insight::Gauge publishedLedgerAge
beast::insight::Gauge validatedLedgerAge