mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-25 13:35:54 +00:00
Avoid acquiring the LedgerMaster lock in some hot code paths.
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user