From 4a2871ff52b58772c5bb540388962b6fcb09fcb6 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Fri, 29 Jun 2012 03:50:37 -0700 Subject: [PATCH] Timing routines for continuous ledger close. --- src/LedgerTiming.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++++ src/LedgerTiming.h | 44 ++++++++++++++++++++++----------- 2 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 src/LedgerTiming.cpp diff --git a/src/LedgerTiming.cpp b/src/LedgerTiming.cpp new file mode 100644 index 0000000000..d50eb3d85a --- /dev/null +++ b/src/LedgerTiming.cpp @@ -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; +} + \ No newline at end of file diff --git a/src/LedgerTiming.h b/src/LedgerTiming.h index d7e623844d..5431443282 100644 --- a/src/LedgerTiming.h +++ b/src/LedgerTiming.h @@ -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