A collection of small bugfixes.

This commit is contained in:
JoelKatz
2013-02-08 16:22:27 -08:00
parent 0896825b92
commit e674bcea36
5 changed files with 74 additions and 58 deletions

View File

@@ -115,15 +115,12 @@ Ledger::Ledger(const std::string& rawLedger, bool hasPrefix) :
void Ledger::setImmutable() void Ledger::setImmutable()
{ {
if (!mImmutable) updateHash();
{ mImmutable = true;
updateHash(); if (mTransactionMap)
mImmutable = true; mTransactionMap->setImmutable();
if (mTransactionMap) if (mAccountStateMap)
mTransactionMap->setImmutable(); mAccountStateMap->setImmutable();
if (mAccountStateMap)
mAccountStateMap->setImmutable();
}
} }
void Ledger::updateHash() void Ledger::updateHash()
@@ -1425,6 +1422,7 @@ void Ledger::pendSave(bool fromConsensus)
{ {
if (!fromConsensus && !theApp->isNewFlag(getHash(), SF_SAVED)) if (!fromConsensus && !theApp->isNewFlag(getHash(), SF_SAVED))
return; return;
assert(isImmutable());
{ {
boost::recursive_mutex::scoped_lock sl(sPendingSaveLock); boost::recursive_mutex::scoped_lock sl(sPendingSaveLock);

View File

@@ -158,6 +158,7 @@ public:
SHAMap::ref peekAccountStateMap() { return mAccountStateMap; } SHAMap::ref peekAccountStateMap() { return mAccountStateMap; }
void dropCache() void dropCache()
{ {
assert(isImmutable());
if (mTransactionMap) if (mTransactionMap)
mTransactionMap->dropCache(); mTransactionMap->dropCache();
if (mAccountStateMap) if (mAccountStateMap)

View File

@@ -94,65 +94,75 @@ LedgerAcquire::LedgerAcquire(const uint256& hash) : PeerSet(hash, LEDGER_ACQUIRE
bool LedgerAcquire::tryLocal() bool LedgerAcquire::tryLocal()
{ // return value: true = no more work to do { // return value: true = no more work to do
HashedObject::pointer node = theApp->getHashedObjectStore().retrieve(mHash);
if (!node)
{
mLedger = theApp->getLedgerMaster().getLedgerByHash(mHash);
if (!mLedger)
return false;
}
else
mLedger = boost::make_shared<Ledger>(strCopy(node->getData()), true);
if (mLedger->getHash() != mHash) if (!mHaveBase)
{ // We know for a fact the ledger can never be acquired
cLog(lsWARNING) << mHash << " cannot be a ledger";
mFailed = true;
return true;
}
mHaveBase = true;
if (mLedger->getTransHash().isZero())
{ {
cLog(lsDEBUG) << "No TXNs to fetch"; HashedObject::pointer node = theApp->getHashedObjectStore().retrieve(mHash);
mHaveTransactions = true; if (!node)
}
else
{
try
{ {
mLedger->peekTransactionMap()->fetchRoot(mLedger->getTransHash()); mLedger = theApp->getLedgerMaster().getLedgerByHash(mHash);
cLog(lsDEBUG) << "Got root txn map locally"; if (!mLedger)
std::vector<uint256> h = mLedger->peekTransactionMap()->getNeededHashes(1); return false;
if (h.empty()) }
else
mLedger = boost::make_shared<Ledger>(strCopy(node->getData()), true);
if (mLedger->getHash() != mHash)
{ // We know for a fact the ledger can never be acquired
cLog(lsWARNING) << mHash << " cannot be a ledger";
mFailed = true;
return true;
}
mHaveBase = true;
}
if (!mHaveTransactions)
{
if (mLedger->getTransHash().isZero())
{
cLog(lsDEBUG) << "No TXNs to fetch";
mHaveTransactions = true;
}
else
{
try
{
mLedger->peekTransactionMap()->fetchRoot(mLedger->getTransHash());
cLog(lsDEBUG) << "Got root txn map locally";
std::vector<uint256> h = mLedger->peekTransactionMap()->getNeededHashes(1);
if (h.empty())
{
cLog(lsDEBUG) << "Had full txn map locally";
mHaveTransactions = true;
}
}
catch (SHAMapMissingNode&)
{ {
cLog(lsDEBUG) << "Had full txn map locally";
mHaveTransactions = true;
} }
} }
catch (SHAMapMissingNode&)
{
}
} }
if (mLedger->getAccountHash().isZero()) if (!mHaveState)
mHaveState = true;
else
{ {
try if (mLedger->getAccountHash().isZero())
mHaveState = true;
else
{ {
mLedger->peekAccountStateMap()->fetchRoot(mLedger->getAccountHash()); try
cLog(lsDEBUG) << "Got root AS map locally"; {
std::vector<uint256> h = mLedger->peekAccountStateMap()->getNeededHashes(1); mLedger->peekAccountStateMap()->fetchRoot(mLedger->getAccountHash());
if (h.empty()) cLog(lsDEBUG) << "Got root AS map locally";
std::vector<uint256> h = mLedger->peekAccountStateMap()->getNeededHashes(1);
if (h.empty())
{
cLog(lsDEBUG) << "Had full AS map locally";
mHaveState = true;
}
}
catch (SHAMapMissingNode&)
{ {
cLog(lsDEBUG) << "Had full AS map locally";
mHaveState = true;
} }
}
catch (SHAMapMissingNode&)
{
} }
} }
@@ -161,6 +171,7 @@ bool LedgerAcquire::tryLocal()
cLog(lsDEBUG) << "Had everything locally"; cLog(lsDEBUG) << "Had everything locally";
mComplete = true; mComplete = true;
mLedger->setClosed(); mLedger->setClosed();
mLedger->setImmutable();
} }
return mComplete; return mComplete;
@@ -246,6 +257,7 @@ void LedgerAcquire::done()
if (isComplete() && !isFailed() && mLedger) if (isComplete() && !isFailed() && mLedger)
{ {
mLedger->setClosed(); mLedger->setClosed();
mLedger->setImmutable();
if (mAccept) if (mAccept)
mLedger->setAccepted(); mLedger->setAccepted();
theApp->getLedgerMaster().storeLedger(mLedger); theApp->getLedgerMaster().storeLedger(mLedger);

View File

@@ -852,8 +852,9 @@ bool SHAMap::getPath(const uint256& index, std::vector< std::vector<unsigned cha
} }
void SHAMap::dropCache() void SHAMap::dropCache()
{ // CAUTION: Changes can be lost {
boost::recursive_mutex::scoped_lock sl(mLock); boost::recursive_mutex::scoped_lock sl(mLock);
assert(mState == smsImmutable);
mTNByID.clear(); mTNByID.clear();
if (root) if (root)

View File

@@ -83,6 +83,8 @@ void SHAMap::getMissingNodes(std::vector<SHAMapNode>& nodeIDs, std::vector<uint2
if (have_all) if (have_all)
node->setFullBelow(); node->setFullBelow();
} }
if (nodeIDs.empty())
clearSynching();
} }
std::vector<uint256> SHAMap::getNeededHashes(int max) std::vector<uint256> SHAMap::getNeededHashes(int max)
@@ -134,6 +136,8 @@ std::vector<uint256> SHAMap::getNeededHashes(int max)
if (have_all) if (have_all)
node->setFullBelow(); node->setFullBelow();
} }
if (ret.empty())
clearSynching();
return ret; return ret;
} }
@@ -171,7 +175,7 @@ bool SHAMap::getNodeFat(const SHAMapNode& wanted, std::vector<SHAMapNode>& nodeI
} }
} }
return true; return true;
} }
bool SHAMap::getRootNode(Serializer& s, SHANodeFormat format) bool SHAMap::getRootNode(Serializer& s, SHANodeFormat format)