1#include <xrpld/consensus/Consensus.h>
3#include <xrpld/consensus/ConsensusParms.h>
4#include <xrpld/consensus/ConsensusTypes.h>
6#include <xrpl/basics/Log.h>
7#include <xrpl/beast/utility/Journal.h>
31 CLOG(clog) <<
"shouldCloseLedger params anyTransactions: " << anyTransactions
32 <<
", prevProposers: " << prevProposers <<
", proposersClosed: " << proposersClosed
33 <<
", proposersValidated: " << proposersValidated
34 <<
", prevRoundTime: " << prevRoundTime.
count() <<
"ms"
35 <<
", timeSincePrevClose: " << timeSincePrevClose.
count() <<
"ms"
36 <<
", openTime: " << openTime.
count() <<
"ms"
37 <<
", idleInterval: " << idleInterval.
count() <<
"ms"
40 using namespace std::chrono_literals;
41 if ((prevRoundTime < -1s) || (prevRoundTime > 10min) || (timeSincePrevClose > 10min))
45 ss <<
"shouldCloseLedger Trans=" << (anyTransactions ?
"yes" :
"no")
46 <<
" Prop: " << prevProposers <<
"/" << proposersClosed
47 <<
" Secs: " << timeSincePrevClose.
count() <<
" (last: " << prevRoundTime.
count() <<
")";
50 CLOG(clog) <<
"closing ledger: " << ss.
str() <<
". ";
54 if ((proposersClosed + proposersValidated) > (prevProposers / 2))
57 JLOG(j.
trace()) <<
"Others have closed";
58 CLOG(clog) <<
"closing ledger because enough others have already. ";
65 CLOG(clog) <<
"no transactions, returning. ";
66 return timeSincePrevClose >= idleInterval;
72 JLOG(j.
debug()) <<
"Must wait minimum time before closing";
73 CLOG(clog) <<
"not closing because under ledgerMIN_CLOSE. ";
80 if (openTime < (prevRoundTime / 2))
82 JLOG(j.
debug()) <<
"Ledger has not been open long enough";
83 CLOG(clog) <<
"not closing because not open long enough. ";
88 CLOG(clog) <<
"no reason to not close. ";
102 CLOG(clog) <<
"checkConsensusReached params: agreeing: " << agreeing <<
", total: " << total
103 <<
", count_self: " << countSelf <<
", minConsensusPct: " << minConsensusPct
104 <<
", reachedMax: " << reachedMax <<
". ";
119 CLOG(clog) <<
"Consensus reached because nobody shares our position and "
120 "maximum duration has passed.";
123 CLOG(clog) <<
"Consensus not reached and nobody shares our position. ";
134 CLOG(clog) <<
"consensus stalled. ";
142 CLOG(clog) <<
"agreeing and total adjusted: " << agreeing <<
',' << total <<
". ";
145 std::size_t const currentPercentage = (agreeing * 100) / total;
147 CLOG(clog) <<
"currentPercentage: " << currentPercentage;
148 bool const ret = currentPercentage >= minConsensusPct;
151 CLOG(clog) <<
", consensus reached. ";
155 CLOG(clog) <<
", consensus not reached. ";
174 CLOG(clog) <<
"checkConsensus: prop=" << currentProposers <<
"/" << prevProposers
175 <<
" agree=" << currentAgree <<
" validated=" << currentFinished
176 <<
" time=" << currentAgreeTime.
count() <<
"/" << previousAgreeTime.
count()
177 <<
" proposing? " << proposing
185 CLOG(clog) <<
"Not reached. ";
189 if (currentProposers < (prevProposers * 3 / 4))
195 JLOG(j.
trace()) <<
"too fast, not enough proposers";
196 CLOG(clog) <<
"Too fast, not enough proposers. Not reached. ";
213 <<
"normal consensus" << (stalled ?
", but stalled" :
"");
214 CLOG(clog) <<
"reached" << (stalled ?
", but stalled." :
".");
229 JLOG(j.
warn()) <<
"We see no consensus, but 80% of nodes have moved on";
230 CLOG(clog) <<
"We see no consensus, but 80% of nodes have moved on";
236 if (currentAgreeTime >
239 JLOG(j.
warn()) <<
"consensus taken too long";
240 CLOG(clog) <<
"Consensus taken too long. ";
246 JLOG(j.
trace()) <<
"no consensus";
247 CLOG(clog) <<
"No consensus. ";
A generic endpoint for log messages.
Stream trace() const
Severity stream access functions.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
ConsensusState checkConsensus(std::size_t prevProposers, std::size_t currentProposers, std::size_t currentAgree, std::size_t currentFinished, std::chrono::milliseconds previousAgreeTime, std::chrono::milliseconds currentAgreeTime, bool stalled, ConsensusParms const &parms, bool proposing, beast::Journal j, std::unique_ptr< std::stringstream > const &clog)
Determine whether the network reached consensus and whether we joined.
ConsensusState
Whether we have or don't have a consensus.
@ Expired
Consensus time limit has hard-expired.
@ MovedOn
The network has consensus without us.
@ Yes
We have consensus along with the network.
@ No
We do not have consensus.
bool checkConsensusReached(std::size_t agreeing, std::size_t total, bool countSelf, std::size_t minConsensusPct, bool reachedMax, bool stalled, std::unique_ptr< std::stringstream > const &clog)
bool shouldCloseLedger(bool anyTransactions, std::size_t prevProposers, std::size_t proposersClosed, std::size_t proposersValidated, std::chrono::milliseconds prevRoundTime, std::chrono::milliseconds timeSincePrevClose, std::chrono::milliseconds openTime, std::chrono::milliseconds idleInterval, ConsensusParms const &parms, beast::Journal j, std::unique_ptr< std::stringstream > const &clog)
Determines whether the current ledger should close at this time.
Consensus algorithm parameters.
std::chrono::milliseconds const ledgerMinClose
Minimum number of seconds to wait to ensure others have computed the LCL.
std::chrono::milliseconds const ledgerAbandonConsensus
Maximum amount of time to give a consensus round.
std::chrono::milliseconds const ledgerMinConsensus
The number of seconds we wait minimum to ensure participation.
std::chrono::milliseconds const ledgerMaxConsensus
The maximum amount of time to spend pausing for laggards.
std::size_t const minConsensusPct
The percentage threshold above which we can declare consensus.
std::size_t const ledgerAbandonConsensusFactor
How long to wait before completely abandoning consensus.