Avoid acquiring the LedgerMaster lock in some hot code paths.

This commit is contained in:
JoelKatz
2013-09-26 13:44:40 -07:00
parent 00f5c9b34b
commit 013520c9d4
2 changed files with 48 additions and 32 deletions

View File

@@ -39,15 +39,15 @@ Ledger::ref LedgerMaster::getCurrentSnapshot ()
int LedgerMaster::getPublishedLedgerAge ()
{
ScopedLockType ml (mLock, __FILE__, __LINE__);
if (!mPubLedger)
uint32 pubClose = mPubLedgerClose.get();
if (!pubClose)
{
WriteLog (lsDEBUG, LedgerMaster) << "No published ledger";
return 999999;
}
int64 ret = getApp().getOPs ().getCloseTimeNC ();
ret -= static_cast<int64> (mPubLedger->getCloseTimeNC ());
ret -= static_cast<int64> (pubClose);
ret = std::max (0LL, ret);
WriteLog (lsTRACE, LedgerMaster) << "Published ledger age is " << ret;
@@ -56,15 +56,15 @@ int LedgerMaster::getPublishedLedgerAge ()
int LedgerMaster::getValidatedLedgerAge ()
{
ScopedLockType ml (mLock, __FILE__, __LINE__);
if (!mValidLedger)
uint32 valClose = mValidLedgerClose.get();
if (!valClose)
{
WriteLog (lsDEBUG, LedgerMaster) << "No validated ledger";
return 999999;
}
int64 ret = getApp().getOPs ().getCloseTimeNC ();
ret -= static_cast<int64> (mValidLedger->getCloseTimeNC ());
ret -= static_cast<int64> (valClose);
ret = std::max (0LL, ret);
WriteLog (lsTRACE, LedgerMaster) << "Validated ledger age is " << ret;
@@ -78,13 +78,14 @@ bool LedgerMaster::isCaughtUp(std::string& reason)
reason = "No recently-published ledger";
return false;
}
ScopedLockType ml (mLock, __FILE__, __LINE__);
if (!mValidLedger || !mPubLedger)
uint32 validClose = mValidLedgerClose.get();
uint32 pubClose = mPubLedgerClose.get();
if (!validClose || !pubClose)
{
reason = "No published ledger";
return false;
}
if (mValidLedger->getLedgerSeq() > (mPubLedger->getLedgerSeq() + 3))
if (validClose > (pubClose + 90))
{
reason = "Published ledger lags validated ledger";
return false;
@@ -92,6 +93,20 @@ bool LedgerMaster::isCaughtUp(std::string& reason)
return true;
}
void LedgerMaster::setValidLedger(Ledger::ref l)
{
mValidLedger = l;
mValidLedgerClose = l->getCloseTimeNC();
mValidLedgerSeq = l->getLedgerSeq();
}
void LedgerMaster::setPubLedger(Ledger::ref l)
{
mPubLedger = l;
mPubLedgerClose = l->getCloseTimeNC();
mPubLedgerSeq = l->getLedgerSeq();
}
void LedgerMaster::addHeldTransaction (Transaction::ref transaction)
{
// returns true if transaction was added
@@ -260,16 +275,9 @@ void LedgerMaster::clearLedger (uint32 seq)
bool LedgerMaster::getFullValidatedRange (uint32& minVal, uint32& maxVal)
{ // Ledgers we have all the nodes for
{
ScopedLockType sl (mLock, __FILE__, __LINE__);
maxVal = mPubLedgerSeq.get();
if (!mPubLedger)
return false;
maxVal = mPubLedger->getLedgerSeq ();
}
if (maxVal == 0)
if (!maxVal)
return false;
{
@@ -287,16 +295,9 @@ bool LedgerMaster::getFullValidatedRange (uint32& minVal, uint32& maxVal)
bool LedgerMaster::getValidatedRange (uint32& minVal, uint32& maxVal)
{ // Ledgers we have all the nodes for and are indexed
{
ScopedLockType sl (mLock, __FILE__, __LINE__);
maxVal = mPubLedgerSeq.get();
if (!mPubLedger)
return false;
maxVal = mPubLedger->getLedgerSeq ();
}
if (maxVal == 0)
if (!maxVal)
return false;
{
@@ -498,10 +499,10 @@ void LedgerMaster::setFullLedger (Ledger::pointer ledger, bool isSynchronous, bo
ledger->pendSaveValidated (isSynchronous, isCurrent);
if (!mValidLedger || (ledger->getLedgerSeq() > mValidLedger->getLedgerSeq()))
mValidLedger = ledger;
setValidLedger(ledger);
if (!mPubLedger)
{
mPubLedger = ledger;
setPubLedger(ledger);
getApp().getOrderBookDB().setup(ledger);
}
@@ -552,6 +553,9 @@ void LedgerMaster::checkAccept (uint256 const& hash)
void LedgerMaster::checkAccept (Ledger::ref ledger)
{
if (ledger->getLedgerSeq() <= mValidLedgerSeq.get())
return;
// Can we advance the last fully-validated ledger? If so, can we publish?
ScopedLockType ml (mLock, __FILE__, __LINE__);
@@ -587,11 +591,11 @@ void LedgerMaster::checkAccept (Ledger::ref ledger)
ledger->setValidated();
ledger->setFull();
mValidLedger = ledger;
setValidLedger(ledger);
if (!mPubLedger)
{
ledger->pendSaveValidated(true, true);
mPubLedger = ledger;
setPubLedger(ledger);
getApp().getOrderBookDB().setup(ledger);
}
@@ -721,7 +725,7 @@ void LedgerMaster::advanceThread()
getApp().getOPs().pubLedger(ledger);
sl.lock(__FILE__, __LINE__);
mPubLedger = ledger;
setPubLedger(ledger);
progress = true;
}

View File

@@ -42,6 +42,10 @@ public:
explicit LedgerMaster (Stoppable& parent)
: Stoppable ("LedgerMaster", parent)
, mLock (this, "LedgerMaster", __FILE__, __LINE__)
, mPubLedgerClose (0)
, mPubLedgerSeq (0)
, mValidLedgerClose (0)
, mValidLedgerSeq (0)
, mHeldTransactions (uint256 ())
, mMinValidations (0)
, mLastValidateSeq (0)
@@ -222,6 +226,9 @@ private:
void advanceThread ();
void updatePaths (Job&);
void setValidLedger(Ledger::ref);
void setPubLedger(Ledger::ref);
private:
LockType mLock;
@@ -234,6 +241,11 @@ private:
Ledger::pointer mPubLedger; // The last ledger we have published
Ledger::pointer mPathLedger; // The last ledger we did pathfinding against
beast::Atomic<uint32> mPubLedgerClose;
beast::Atomic<uint32> mPubLedgerSeq;
beast::Atomic<uint32> mValidLedgerClose;
beast::Atomic<uint32> mValidLedgerSeq;
LedgerHistory mLedgerHistory;
CanonicalTXSet mHeldTransactions;