mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-06 17:27:55 +00:00
Timing routines for continuous ledger close.
This commit is contained in:
58
src/LedgerTiming.cpp
Normal file
58
src/LedgerTiming.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
#include "LedgerTiming.h"
|
||||
|
||||
|
||||
// Returns the number of seconds the ledger was or should be open
|
||||
int ContinuousLedgerTiming::shouldClose( // How many:
|
||||
bool anyTransactions,
|
||||
int previousProposers, // proposers there were in the last closing
|
||||
int proposersClosed, // proposers who have currently closed their ledgers
|
||||
int previousOpenSeconds, // seconds the previous ledger was open
|
||||
int currentOpenSeconds) // seconds since the previous ledger closed
|
||||
{
|
||||
if (!anyTransactions)
|
||||
{ // no transactions so far this interval
|
||||
if (previousOpenSeconds > (LEDGER_IDLE_INTERVAL + 2)) // the last ledger was very slow to close
|
||||
return previousOpenSeconds - 1;
|
||||
return LEDGER_IDLE_INTERVAL; // normal idle
|
||||
}
|
||||
|
||||
if (previousOpenSeconds == LEDGER_IDLE_INTERVAL) // coming out of idle, close now
|
||||
return currentOpenSeconds;
|
||||
|
||||
// If the network is slow, try to synchronize close times
|
||||
if (previousOpenSeconds > 8)
|
||||
return (currentOpenSeconds - currentOpenSeconds % 4);
|
||||
else if (previousOpenSeconds > 4)
|
||||
return (currentOpenSeconds - currentOpenSeconds % 2);
|
||||
|
||||
return currentOpenSeconds; // this ledger should close now
|
||||
}
|
||||
|
||||
bool ContinuousLedgerTiming::haveConsensus(
|
||||
int previousProposers, // proposers in the last closing (not including us)
|
||||
int currentProposers, // proposers in this closing so far (not including us)
|
||||
int currentAgree, // proposers who agree with us
|
||||
int currentClosed, // proposers who have currently closed their ledgers
|
||||
int previousAgreeTime, // how long it took to agree on the last ledger
|
||||
int currentAgreeTime) // how long we've been trying to agree
|
||||
{
|
||||
if (currentProposers < (previousProposers * 3 / 4))
|
||||
{ // Less than 3/4 of the validators are present, slow down
|
||||
if (currentAgreeTime < (previousAgreeTime + 2))
|
||||
return false;
|
||||
}
|
||||
|
||||
// If 80% of current proposers (plus us) agree on a set, we have consensus
|
||||
int agreeWeight = (currentAgree * 100 + 100) / (currentProposers + 1);
|
||||
if (agreeWeight > 80)
|
||||
return true;
|
||||
|
||||
// If 50% of the nodes on your UNL (minus us) have closed, you should close
|
||||
int closeWeight = (currentClosed * 100 - 100) / (currentProposers + 1);
|
||||
if (closeWeight > 50)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -21,30 +21,46 @@
|
||||
// Maximum converge time
|
||||
# define LEDGER_MAX_CONVERGE 20
|
||||
|
||||
#define AV_PCT_STOP 85
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef LEDGER_CLOSE_SLOW
|
||||
|
||||
# define LEDGER_INTERVAL 1800
|
||||
|
||||
# define LEDGER_FORCE_CONVERGE 180
|
||||
|
||||
# define LEDGER_CONVERGE 240
|
||||
|
||||
|
||||
// Time a transaction must be unconflicted before we consider it protected
|
||||
# define LEDGER_PROTECT 90
|
||||
// BEGIN LEDGER_CLOSE_CONTINUOUS
|
||||
|
||||
#endif
|
||||
// The number of seconds a ledger may remain idle before closing
|
||||
# define LEDGER_IDLE_INTERVAL 15
|
||||
|
||||
// How long we wait to transition from inactive to active
|
||||
# define LEDGER_IDLE_SPIN_TIME 2
|
||||
|
||||
// Avalance tuning (percent of UNL voting yes for us to vote yes)
|
||||
#define AV_MIN_CONSENSUS 50
|
||||
#define AV_AVG_CONSENSUS 60
|
||||
#define AV_MIN_CONSENSUS 55
|
||||
#define AV_AVG_CONSENSUS 65
|
||||
#define AV_MAX_CONSENSUS 70
|
||||
|
||||
// We consider consensus reached at this percent agreement
|
||||
#define AV_PCT_STOP 90
|
||||
|
||||
class ContinuousLedgerTiming
|
||||
{
|
||||
public:
|
||||
|
||||
// Returns the number of seconds the ledger was or should be open
|
||||
// Call when a consensus is reached and when any transaction is relayed to be added
|
||||
static int shouldClose(
|
||||
bool anyTransactions,
|
||||
int previousProposers, int proposersClosed,
|
||||
int previousOpenSeconds, int currentOpenSeconds);
|
||||
|
||||
static bool haveConsensus(
|
||||
int previousProposers, int currentProposers,
|
||||
int currentAgree, int currentClosed,
|
||||
int previousAgreeTime, int currentAgreeTime);
|
||||
|
||||
};
|
||||
|
||||
// END LEDGER_CLOSE_CONTINUOUS
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user