mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-25 13:35:54 +00:00
Make ledger close times increase strictly monotonically
This commit is contained in:
@@ -191,7 +191,7 @@ Ledger::Ledger (create_genesis_t, Config const& config)
|
||||
stateMap_->flushDirty (hotACCOUNT_NODE, info_.seq);
|
||||
updateHash();
|
||||
setClosed();
|
||||
setAccepted();
|
||||
setImmutable();
|
||||
setup(config);
|
||||
}
|
||||
|
||||
@@ -402,27 +402,13 @@ void Ledger::setAccepted (
|
||||
// Used when we witnessed the consensus. Rounds the close time, updates the
|
||||
// hash, and sets the ledger accepted and immutable.
|
||||
assert (closed());
|
||||
info_.closeTime = correctCloseTime
|
||||
? roundCloseTime (closeTime, closeResolution)
|
||||
: closeTime;
|
||||
|
||||
info_.closeTime = closeTime;
|
||||
info_.closeTimeResolution = closeResolution;
|
||||
info_.closeFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime;
|
||||
setImmutable ();
|
||||
}
|
||||
|
||||
void Ledger::setAccepted ()
|
||||
{
|
||||
// used when we acquired the ledger
|
||||
// TODO: re-enable a test like the following:
|
||||
// assert(closed() && (info_.closeTime != 0) &&
|
||||
// (info_.closeTimeResolution != 0));
|
||||
if ((info_.closeFlags & sLCF_NoConsensusTime) == 0)
|
||||
info_.closeTime = roundCloseTime(
|
||||
info_.closeTime, info_.closeTimeResolution);
|
||||
|
||||
setImmutable ();
|
||||
}
|
||||
|
||||
bool Ledger::addSLE (SLE const& sle)
|
||||
{
|
||||
SHAMapItem item (sle.getIndex(), sle.getSerializer());
|
||||
@@ -712,9 +698,6 @@ void finishLoadByIndexOrHash(Ledger::pointer& ledger)
|
||||
ledger->setClosed ();
|
||||
ledger->setImmutable ();
|
||||
|
||||
if (getApp ().getLedgerMaster ().haveLedger ((ledger->info().seq)))
|
||||
ledger->setAccepted ();
|
||||
|
||||
WriteLog (lsTRACE, Ledger)
|
||||
<< "Loaded ledger: " << to_string (ledger->getHash ());
|
||||
|
||||
|
||||
@@ -230,8 +230,6 @@ public:
|
||||
void setAccepted (std::uint32_t closeTime,
|
||||
int closeResolution, bool correctCloseTime);
|
||||
|
||||
void setAccepted ();
|
||||
|
||||
void setImmutable ();
|
||||
|
||||
bool isImmutable () const
|
||||
|
||||
@@ -968,12 +968,19 @@ void LedgerConsensusImp::accept (std::shared_ptr<SHAMap> set)
|
||||
|
||||
std::uint32_t closeTime = roundCloseTime (
|
||||
mOurPosition->getCloseTime (), mCloseResolution);
|
||||
bool closeTimeCorrect = true;
|
||||
|
||||
if (closeTime == 0)
|
||||
// If we don't have a close time, then we just agree to disagree
|
||||
bool const closeTimeCorrect = (closeTime != 0);
|
||||
|
||||
// Switch to new semantics on Sep 30, 2015 at 11:00:00am PDT
|
||||
if (mPreviousLedger->info().closeTime > 497296800)
|
||||
{
|
||||
// Ledger close times should increase strictly monotonically
|
||||
if (closeTime <= mPreviousLedger->info().closeTime)
|
||||
closeTime = mPreviousLedger->info().closeTime + 1;
|
||||
}
|
||||
else if (!closeTimeCorrect)
|
||||
{
|
||||
// we agreed to disagree
|
||||
closeTimeCorrect = false;
|
||||
closeTime = mPreviousLedger->info().closeTime + 1;
|
||||
}
|
||||
|
||||
|
||||
@@ -372,7 +372,7 @@ public:
|
||||
ScopedLockType ml (m_mutex);
|
||||
|
||||
lastClosed->setClosed ();
|
||||
lastClosed->setAccepted ();
|
||||
lastClosed->setImmutable ();
|
||||
|
||||
mCurrentLedger.set (current);
|
||||
mClosedLedger.set (lastClosed);
|
||||
|
||||
@@ -1045,7 +1045,7 @@ void ApplicationImp::startGenesisLedger ()
|
||||
auto const next = std::make_shared<Ledger>(
|
||||
open_ledger, *genesis);
|
||||
next->setClosed ();
|
||||
next->setAccepted ();
|
||||
next->setImmutable ();
|
||||
m_networkOPs->setLastCloseTime (next->info().closeTime);
|
||||
openLedger_.emplace(next, getConfig(),
|
||||
cachedSLEs_, deprecatedLogs().journal("OpenLedger"));
|
||||
@@ -1071,10 +1071,7 @@ ApplicationImp::getLastFullLedger()
|
||||
ledger->setImmutable();
|
||||
|
||||
if (getApp().getLedgerMaster ().haveLedger (ledgerSeq))
|
||||
{
|
||||
ledger->setAccepted ();
|
||||
ledger->setValidated ();
|
||||
}
|
||||
|
||||
if (ledger->getHash () != ledgerHash)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user