Timing routines for continuous ledger close.

This commit is contained in:
JoelKatz
2012-06-29 03:50:37 -07:00
parent 3f3ea3c594
commit 4a2871ff52
2 changed files with 88 additions and 14 deletions

58
src/LedgerTiming.cpp Normal file
View 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;
}

View File

@@ -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