mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-27 06:25:51 +00:00
Fix a deadlock.
This commit is contained in:
@@ -508,33 +508,46 @@ void Ledger::saveAcceptedLedger(bool fromConsensus, LoadEvent::pointer event)
|
|||||||
|
|
||||||
Ledger::pointer Ledger::loadByIndex(uint32 ledgerIndex)
|
Ledger::pointer Ledger::loadByIndex(uint32 ledgerIndex)
|
||||||
{
|
{
|
||||||
Database* db = theApp->getLedgerDB()->getDB();
|
Ledger::pointer ledger;
|
||||||
ScopedLock sl(theApp->getLedgerDB()->getDBLock());
|
{
|
||||||
|
Database* db = theApp->getLedgerDB()->getDB();
|
||||||
|
ScopedLock sl(theApp->getLedgerDB()->getDBLock());
|
||||||
|
|
||||||
static SqliteStatement pSt(db->getSqliteDB(), "SELECT "
|
static SqliteStatement pSt(db->getSqliteDB(), "SELECT "
|
||||||
"LedgerHash,PrevHash,AccountSetHash,TransSetHash,TotalCoins,"
|
"LedgerHash,PrevHash,AccountSetHash,TransSetHash,TotalCoins,"
|
||||||
"ClosingTime,PrevClosingTime,CloseTimeRes,CloseFlags,LedgerSeq"
|
"ClosingTime,PrevClosingTime,CloseTimeRes,CloseFlags,LedgerSeq"
|
||||||
" from Ledgers WHERE LedgerSeq = ?;");
|
" from Ledgers WHERE LedgerSeq = ?;");
|
||||||
|
|
||||||
pSt.reset();
|
pSt.reset();
|
||||||
pSt.bind(1, ledgerIndex);
|
pSt.bind(1, ledgerIndex);
|
||||||
return getSQL(&pSt);
|
ledger = getSQL1(&pSt);
|
||||||
|
}
|
||||||
|
if (ledger)
|
||||||
|
Ledger::getSQL2(ledger);
|
||||||
|
return ledger;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ledger::pointer Ledger::loadByHash(const uint256& ledgerHash)
|
Ledger::pointer Ledger::loadByHash(const uint256& ledgerHash)
|
||||||
{
|
{
|
||||||
Database* db = theApp->getLedgerDB()->getDB();
|
Ledger::pointer ledger;
|
||||||
ScopedLock sl(theApp->getLedgerDB()->getDBLock());
|
{
|
||||||
|
Database* db = theApp->getLedgerDB()->getDB();
|
||||||
|
ScopedLock sl(theApp->getLedgerDB()->getDBLock());
|
||||||
|
|
||||||
static SqliteStatement pSt(db->getSqliteDB(), "SELECT "
|
static SqliteStatement pSt(db->getSqliteDB(), "SELECT "
|
||||||
"LedgerHash,PrevHash,AccountSetHash,TransSetHash,TotalCoins,"
|
"LedgerHash,PrevHash,AccountSetHash,TransSetHash,TotalCoins,"
|
||||||
"ClosingTime,PrevClosingTime,CloseTimeRes,CloseFlags,LedgerSeq"
|
"ClosingTime,PrevClosingTime,CloseTimeRes,CloseFlags,LedgerSeq"
|
||||||
" from Ledgers WHERE LedgerHash = ?;");
|
" from Ledgers WHERE LedgerHash = ?;");
|
||||||
|
|
||||||
pSt.reset();
|
pSt.reset();
|
||||||
pSt.bind(1, ledgerHash.GetHex());
|
pSt.bind(1, ledgerHash.GetHex());
|
||||||
Ledger::pointer ret = getSQL(&pSt);
|
ledger = getSQL1(&pSt);
|
||||||
assert(!ret || (ret->getHash() == ledgerHash));
|
}
|
||||||
|
if (ledger)
|
||||||
|
{
|
||||||
|
assert(ledger->getHash() == ledgerHash);
|
||||||
|
Ledger::getSQL2(ledger);
|
||||||
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -613,7 +626,7 @@ Ledger::pointer Ledger::getSQL(const std::string& sql)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ledger::pointer Ledger::getSQL(SqliteStatement *stmt)
|
Ledger::pointer Ledger::getSQL1(SqliteStatement *stmt)
|
||||||
{
|
{
|
||||||
int iRet = stmt->step();
|
int iRet = stmt->step();
|
||||||
if (stmt->isDone(iRet))
|
if (stmt->isDone(iRet))
|
||||||
@@ -644,8 +657,12 @@ Ledger::pointer Ledger::getSQL(SqliteStatement *stmt)
|
|||||||
ledgerSeq = stmt->getUInt32(9);
|
ledgerSeq = stmt->getUInt32(9);
|
||||||
|
|
||||||
// CAUTION: code below appears in two places
|
// CAUTION: code below appears in two places
|
||||||
Ledger::pointer ret = boost::make_shared<Ledger>(prevHash, transHash, accountHash, totCoins,
|
return boost::make_shared<Ledger>(prevHash, transHash, accountHash, totCoins,
|
||||||
closingTime, prevClosingTime, closeFlags, closeResolution, ledgerSeq);
|
closingTime, prevClosingTime, closeFlags, closeResolution, ledgerSeq);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ledger::getSQL2(Ledger::pointer ret)
|
||||||
|
{
|
||||||
ret->setClosed();
|
ret->setClosed();
|
||||||
if (theApp->getOPs().haveLedger(ledgerSeq))
|
if (theApp->getOPs().haveLedger(ledgerSeq))
|
||||||
ret->setAccepted();
|
ret->setAccepted();
|
||||||
@@ -659,7 +676,6 @@ Ledger::pointer Ledger::getSQL(SqliteStatement *stmt)
|
|||||||
Log(lsERROR) << p;
|
Log(lsERROR) << p;
|
||||||
}
|
}
|
||||||
assert(false);
|
assert(false);
|
||||||
return Ledger::pointer();
|
|
||||||
}
|
}
|
||||||
cLog(lsTRACE) << "Loaded ledger: " << ledgerHash;
|
cLog(lsTRACE) << "Loaded ledger: " << ledgerHash;
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -119,7 +119,8 @@ public:
|
|||||||
Ledger(Ledger& target, bool isMutable); // snapshot
|
Ledger(Ledger& target, bool isMutable); // snapshot
|
||||||
|
|
||||||
static Ledger::pointer getSQL(const std::string& sqlStatement);
|
static Ledger::pointer getSQL(const std::string& sqlStatement);
|
||||||
static Ledger::pointer getSQL(SqliteStatement*);
|
static Ledger::pointer getSQL1(SqliteStatement*);
|
||||||
|
static Ledger::pointer getSQL2(Ledger::ref);
|
||||||
static Ledger::pointer getLastFullLedger();
|
static Ledger::pointer getLastFullLedger();
|
||||||
static int getPendingSaves();
|
static int getPendingSaves();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user