Fix a deadlock.

This commit is contained in:
JoelKatz
2013-02-09 20:33:30 -08:00
parent f8f56b96e0
commit 4843a90910
2 changed files with 40 additions and 23 deletions

View File

@@ -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;

View File

@@ -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();