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);
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 ());

View File

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

View File

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

View File

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

View File

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