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

View File

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