From 1e9624270dbc5c6b70f2d8142c39ef19bc28fb8b Mon Sep 17 00:00:00 2001 From: Nik Bougalis Date: Thu, 6 Aug 2015 01:08:15 -0700 Subject: [PATCH] Make ledger close times increase strictly monotonically --- src/ripple/app/ledger/Ledger.cpp | 23 +++---------------- src/ripple/app/ledger/Ledger.h | 2 -- .../app/ledger/impl/LedgerConsensusImp.cpp | 15 ++++++++---- src/ripple/app/ledger/impl/LedgerMaster.cpp | 2 +- src/ripple/app/main/Application.cpp | 5 +--- 5 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp index 4079892a79..16c5da9873 100644 --- a/src/ripple/app/ledger/Ledger.cpp +++ b/src/ripple/app/ledger/Ledger.cpp @@ -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 ()); diff --git a/src/ripple/app/ledger/Ledger.h b/src/ripple/app/ledger/Ledger.h index bac10579e7..ce928c29e3 100644 --- a/src/ripple/app/ledger/Ledger.h +++ b/src/ripple/app/ledger/Ledger.h @@ -230,8 +230,6 @@ public: void setAccepted (std::uint32_t closeTime, int closeResolution, bool correctCloseTime); - void setAccepted (); - void setImmutable (); bool isImmutable () const diff --git a/src/ripple/app/ledger/impl/LedgerConsensusImp.cpp b/src/ripple/app/ledger/impl/LedgerConsensusImp.cpp index ff0bc2fefe..a8bf5e6266 100644 --- a/src/ripple/app/ledger/impl/LedgerConsensusImp.cpp +++ b/src/ripple/app/ledger/impl/LedgerConsensusImp.cpp @@ -968,12 +968,19 @@ void LedgerConsensusImp::accept (std::shared_ptr 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; } diff --git a/src/ripple/app/ledger/impl/LedgerMaster.cpp b/src/ripple/app/ledger/impl/LedgerMaster.cpp index 0fac61325f..8523ff023e 100644 --- a/src/ripple/app/ledger/impl/LedgerMaster.cpp +++ b/src/ripple/app/ledger/impl/LedgerMaster.cpp @@ -372,7 +372,7 @@ public: ScopedLockType ml (m_mutex); lastClosed->setClosed (); - lastClosed->setAccepted (); + lastClosed->setImmutable (); mCurrentLedger.set (current); mClosedLedger.set (lastClosed); diff --git a/src/ripple/app/main/Application.cpp b/src/ripple/app/main/Application.cpp index 10b2428ac5..dabf5ede0d 100644 --- a/src/ripple/app/main/Application.cpp +++ b/src/ripple/app/main/Application.cpp @@ -1045,7 +1045,7 @@ void ApplicationImp::startGenesisLedger () auto const next = std::make_shared( 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) {