Merge pull request #6688
131c23d
Fix locking in GetTransaction. (Alex Morcos)
This commit is contained in:
commit
4939eabb75
1 changed files with 36 additions and 38 deletions
74
src/main.cpp
74
src/main.cpp
|
@ -965,47 +965,45 @@ bool AcceptToMemoryPool(CTxMemPool& pool, CValidationState &state, const CTransa
|
||||||
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow)
|
bool GetTransaction(const uint256 &hash, CTransaction &txOut, uint256 &hashBlock, bool fAllowSlow)
|
||||||
{
|
{
|
||||||
CBlockIndex *pindexSlow = NULL;
|
CBlockIndex *pindexSlow = NULL;
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
|
|
||||||
|
if (mempool.lookup(hash, txOut))
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fTxIndex) {
|
||||||
|
CDiskTxPos postx;
|
||||||
|
if (pblocktree->ReadTxIndex(hash, postx)) {
|
||||||
|
CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
|
||||||
|
if (file.IsNull())
|
||||||
|
return error("%s: OpenBlockFile failed", __func__);
|
||||||
|
CBlockHeader header;
|
||||||
|
try {
|
||||||
|
file >> header;
|
||||||
|
fseek(file.Get(), postx.nTxOffset, SEEK_CUR);
|
||||||
|
file >> txOut;
|
||||||
|
} catch (const std::exception& e) {
|
||||||
|
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
||||||
|
}
|
||||||
|
hashBlock = header.GetHash();
|
||||||
|
if (txOut.GetHash() != hash)
|
||||||
|
return error("%s: txid mismatch", __func__);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fAllowSlow) { // use coin database to locate block that contains transaction, and scan it
|
||||||
|
int nHeight = -1;
|
||||||
{
|
{
|
||||||
if (mempool.lookup(hash, txOut))
|
CCoinsViewCache &view = *pcoinsTip;
|
||||||
{
|
const CCoins* coins = view.AccessCoins(hash);
|
||||||
return true;
|
if (coins)
|
||||||
}
|
nHeight = coins->nHeight;
|
||||||
}
|
|
||||||
|
|
||||||
if (fTxIndex) {
|
|
||||||
CDiskTxPos postx;
|
|
||||||
if (pblocktree->ReadTxIndex(hash, postx)) {
|
|
||||||
CAutoFile file(OpenBlockFile(postx, true), SER_DISK, CLIENT_VERSION);
|
|
||||||
if (file.IsNull())
|
|
||||||
return error("%s: OpenBlockFile failed", __func__);
|
|
||||||
CBlockHeader header;
|
|
||||||
try {
|
|
||||||
file >> header;
|
|
||||||
fseek(file.Get(), postx.nTxOffset, SEEK_CUR);
|
|
||||||
file >> txOut;
|
|
||||||
} catch (const std::exception& e) {
|
|
||||||
return error("%s: Deserialize or I/O error - %s", __func__, e.what());
|
|
||||||
}
|
|
||||||
hashBlock = header.GetHash();
|
|
||||||
if (txOut.GetHash() != hash)
|
|
||||||
return error("%s: txid mismatch", __func__);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fAllowSlow) { // use coin database to locate block that contains transaction, and scan it
|
|
||||||
int nHeight = -1;
|
|
||||||
{
|
|
||||||
CCoinsViewCache &view = *pcoinsTip;
|
|
||||||
const CCoins* coins = view.AccessCoins(hash);
|
|
||||||
if (coins)
|
|
||||||
nHeight = coins->nHeight;
|
|
||||||
}
|
|
||||||
if (nHeight > 0)
|
|
||||||
pindexSlow = chainActive[nHeight];
|
|
||||||
}
|
}
|
||||||
|
if (nHeight > 0)
|
||||||
|
pindexSlow = chainActive[nHeight];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pindexSlow) {
|
if (pindexSlow) {
|
||||||
|
|
Loading…
Reference in a new issue