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);
|
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 ());
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user