Make ledger close times increase strictly monotonically

This commit is contained in:
Nik Bougalis
2015-08-06 01:08:15 -07:00
parent a50d67257c
commit 1e9624270d
5 changed files with 16 additions and 31 deletions

View File

@@ -191,7 +191,7 @@ Ledger::Ledger (create_genesis_t, Config const& config)
stateMap_->flushDirty (hotACCOUNT_NODE, info_.seq); stateMap_->flushDirty (hotACCOUNT_NODE, info_.seq);
updateHash(); updateHash();
setClosed(); setClosed();
setAccepted(); setImmutable();
setup(config); setup(config);
} }
@@ -402,27 +402,13 @@ void Ledger::setAccepted (
// Used when we witnessed the consensus. Rounds the close time, updates the // Used when we witnessed the consensus. Rounds the close time, updates the
// hash, and sets the ledger accepted and immutable. // hash, and sets the ledger accepted and immutable.
assert (closed()); assert (closed());
info_.closeTime = correctCloseTime
? roundCloseTime (closeTime, closeResolution) info_.closeTime = closeTime;
: closeTime;
info_.closeTimeResolution = closeResolution; info_.closeTimeResolution = closeResolution;
info_.closeFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime; info_.closeFlags = correctCloseTime ? 0 : sLCF_NoConsensusTime;
setImmutable (); 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) bool Ledger::addSLE (SLE const& sle)
{ {
SHAMapItem item (sle.getIndex(), sle.getSerializer()); SHAMapItem item (sle.getIndex(), sle.getSerializer());
@@ -712,9 +698,6 @@ void finishLoadByIndexOrHash(Ledger::pointer& ledger)
ledger->setClosed (); ledger->setClosed ();
ledger->setImmutable (); ledger->setImmutable ();
if (getApp ().getLedgerMaster ().haveLedger ((ledger->info().seq)))
ledger->setAccepted ();
WriteLog (lsTRACE, Ledger) WriteLog (lsTRACE, Ledger)
<< "Loaded ledger: " << to_string (ledger->getHash ()); << "Loaded ledger: " << to_string (ledger->getHash ());

View File

@@ -230,8 +230,6 @@ public:
void setAccepted (std::uint32_t closeTime, void setAccepted (std::uint32_t closeTime,
int closeResolution, bool correctCloseTime); int closeResolution, bool correctCloseTime);
void setAccepted ();
void setImmutable (); void setImmutable ();
bool isImmutable () const bool isImmutable () const

View File

@@ -968,12 +968,19 @@ void LedgerConsensusImp::accept (std::shared_ptr<SHAMap> set)
std::uint32_t closeTime = roundCloseTime ( std::uint32_t closeTime = roundCloseTime (
mOurPosition->getCloseTime (), mCloseResolution); 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; closeTime = mPreviousLedger->info().closeTime + 1;
} }

View File

@@ -372,7 +372,7 @@ public:
ScopedLockType ml (m_mutex); ScopedLockType ml (m_mutex);
lastClosed->setClosed (); lastClosed->setClosed ();
lastClosed->setAccepted (); lastClosed->setImmutable ();
mCurrentLedger.set (current); mCurrentLedger.set (current);
mClosedLedger.set (lastClosed); mClosedLedger.set (lastClosed);

View File

@@ -1045,7 +1045,7 @@ void ApplicationImp::startGenesisLedger ()
auto const next = std::make_shared<Ledger>( auto const next = std::make_shared<Ledger>(
open_ledger, *genesis); open_ledger, *genesis);
next->setClosed (); next->setClosed ();
next->setAccepted (); next->setImmutable ();
m_networkOPs->setLastCloseTime (next->info().closeTime); m_networkOPs->setLastCloseTime (next->info().closeTime);
openLedger_.emplace(next, getConfig(), openLedger_.emplace(next, getConfig(),
cachedSLEs_, deprecatedLogs().journal("OpenLedger")); cachedSLEs_, deprecatedLogs().journal("OpenLedger"));
@@ -1071,10 +1071,7 @@ ApplicationImp::getLastFullLedger()
ledger->setImmutable(); ledger->setImmutable();
if (getApp().getLedgerMaster ().haveLedger (ledgerSeq)) if (getApp().getLedgerMaster ().haveLedger (ledgerSeq))
{
ledger->setAccepted ();
ledger->setValidated (); ledger->setValidated ();
}
if (ledger->getHash () != ledgerHash) if (ledger->getHash () != ledgerHash)
{ {