20#include <xrpld/consensus/Consensus.h> 
   22#include <xrpl/basics/Log.h> 
   41    CLOG(clog) << 
"shouldCloseLedger params anyTransactions: " 
   42               << anyTransactions << 
", prevProposers: " << prevProposers
 
   43               << 
", proposersClosed: " << proposersClosed
 
   44               << 
", proposersValidated: " << proposersValidated
 
   45               << 
", prevRoundTime: " << prevRoundTime.
count() << 
"ms" 
   46               << 
", timeSincePrevClose: " << timeSincePrevClose.
count() << 
"ms" 
   47               << 
", openTime: " << openTime.
count() << 
"ms" 
   48               << 
", idleInterval: " << idleInterval.
count() << 
"ms" 
   51    using namespace std::chrono_literals;
 
   52    if ((prevRoundTime < -1s) || (prevRoundTime > 10min) ||
 
   53        (timeSincePrevClose > 10min))
 
   57        ss << 
"shouldCloseLedger Trans=" << (anyTransactions ? 
"yes" : 
"no")
 
   58           << 
" Prop: " << prevProposers << 
"/" << proposersClosed
 
   59           << 
" Secs: " << timeSincePrevClose.
count()
 
   60           << 
" (last: " << prevRoundTime.
count() << 
")";
 
   63        CLOG(clog) << 
"closing ledger: " << ss.
str() << 
". ";
 
   67    if ((proposersClosed + proposersValidated) > (prevProposers / 2))
 
   70        JLOG(j.
trace()) << 
"Others have closed";
 
   71        CLOG(clog) << 
"closing ledger because enough others have already. ";
 
   78        CLOG(clog) << 
"no transactions, returning. ";
 
   79        return timeSincePrevClose >= idleInterval;  
 
   85        JLOG(j.
debug()) << 
"Must wait minimum time before closing";
 
   86        CLOG(clog) << 
"not closing because under ledgerMIN_CLOSE. ";
 
   93    if (openTime < (prevRoundTime / 2))
 
   95        JLOG(j.
debug()) << 
"Ledger has not been open long enough";
 
   96        CLOG(clog) << 
"not closing because not open long enough. ";
 
  101    CLOG(clog) << 
"no reason to not close. ";
 
 
  115    CLOG(clog) << 
"checkConsensusReached params: agreeing: " << agreeing
 
  116               << 
", total: " << total << 
", count_self: " << count_self
 
  117               << 
", minConsensusPct: " << minConsensusPct
 
  118               << 
", reachedMax: " << reachedMax << 
". ";
 
  134                << 
"Consensus reached because nobody shares our position and " 
  135                   "maximum duration has passed.";
 
  138        CLOG(clog) << 
"Consensus not reached and nobody shares our position. ";
 
  149        CLOG(clog) << 
"consensus stalled. ";
 
  157        CLOG(clog) << 
"agreeing and total adjusted: " << agreeing << 
',' 
  161    std::size_t currentPercentage = (agreeing * 100) / total;
 
  163    CLOG(clog) << 
"currentPercentage: " << currentPercentage;
 
  164    bool const ret = currentPercentage >= minConsensusPct;
 
  167        CLOG(clog) << 
", consensus reached. ";
 
  171        CLOG(clog) << 
", consensus not reached. ";
 
 
  190    CLOG(clog) << 
"checkConsensus: prop=" << currentProposers << 
"/" 
  191               << prevProposers << 
" agree=" << currentAgree
 
  192               << 
" validated=" << currentFinished
 
  193               << 
" time=" << currentAgreeTime.
count() << 
"/" 
  195               << 
" minimum duration to reach consensus: " 
  204        CLOG(clog) << 
"Not reached. ";
 
  208    if (currentProposers < (prevProposers * 3 / 4))
 
  214            JLOG(j.
trace()) << 
"too fast, not enough proposers";
 
  215            CLOG(clog) << 
"Too fast, not enough proposers. Not reached. ";
 
  232            << 
"normal consensus" << (stalled ? 
", but stalled" : 
"");
 
  233        CLOG(clog) << 
"reached" << (stalled ? 
", but stalled." : 
".");
 
  248        JLOG(j.
warn()) << 
"We see no consensus, but 80% of nodes have moved on";
 
  249        CLOG(clog) << 
"We see no consensus, but 80% of nodes have moved on";
 
  260        JLOG(j.
warn()) << 
"consensus taken too long";
 
  261        CLOG(clog) << 
"Consensus taken too long. ";
 
  267    JLOG(j.
trace()) << 
"no consensus";
 
  268    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.
 
@ proposing
We are normal participant in consensus and propose our position.
 
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.
 
bool checkConsensusReached(std::size_t agreeing, std::size_t total, bool count_self, std::size_t minConsensusPct, bool reachedMax, bool stalled, std::unique_ptr< std::stringstream > const &clog)
 
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 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 ledgerMIN_CONSENSUS
The number of seconds we wait minimum to ensure participation.
 
std::chrono::milliseconds const ledgerABANDON_CONSENSUS
Maximum amount of time to give a consensus round.
 
std::size_t const minCONSENSUS_PCT
The percentage threshold above which we can declare consensus.
 
std::chrono::milliseconds const ledgerMIN_CLOSE
Minimum number of seconds to wait to ensure others have computed the LCL.
 
std::chrono::milliseconds const ledgerMAX_CONSENSUS
The maximum amount of time to spend pausing for laggards.
 
std::size_t const ledgerABANDON_CONSENSUS_FACTOR
How long to wait before completely abandoning consensus.