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()
{
if (!mImmutable)
{
updateHash();
mImmutable = true;
if (mTransactionMap)
mTransactionMap->setImmutable();
if (mAccountStateMap)
mAccountStateMap->setImmutable();
}
updateHash();
mImmutable = true;
if (mTransactionMap)
mTransactionMap->setImmutable();
if (mAccountStateMap)
mAccountStateMap->setImmutable();
}
void Ledger::updateHash()
@@ -1425,6 +1422,7 @@ void Ledger::pendSave(bool fromConsensus)
{
if (!fromConsensus && !theApp->isNewFlag(getHash(), SF_SAVED))
return;
assert(isImmutable());
{
boost::recursive_mutex::scoped_lock sl(sPendingSaveLock);

View File

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

View File

@@ -94,65 +94,75 @@ LedgerAcquire::LedgerAcquire(const uint256& hash) : PeerSet(hash, LEDGER_ACQUIRE
bool LedgerAcquire::tryLocal()
{ // 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)
{ // 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())
if (!mHaveBase)
{
cLog(lsDEBUG) << "No TXNs to fetch";
mHaveTransactions = true;
}
else
{
try
HashedObject::pointer node = theApp->getHashedObjectStore().retrieve(mHash);
if (!node)
{
mLedger->peekTransactionMap()->fetchRoot(mLedger->getTransHash());
cLog(lsDEBUG) << "Got root txn map locally";
std::vector<uint256> h = mLedger->peekTransactionMap()->getNeededHashes(1);
if (h.empty())
mLedger = theApp->getLedgerMaster().getLedgerByHash(mHash);
if (!mLedger)
return false;
}
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())
mHaveState = true;
else
if (!mHaveState)
{
try
if (mLedger->getAccountHash().isZero())
mHaveState = true;
else
{
mLedger->peekAccountStateMap()->fetchRoot(mLedger->getAccountHash());
cLog(lsDEBUG) << "Got root AS map locally";
std::vector<uint256> h = mLedger->peekAccountStateMap()->getNeededHashes(1);
if (h.empty())
try
{
mLedger->peekAccountStateMap()->fetchRoot(mLedger->getAccountHash());
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";
mComplete = true;
mLedger->setClosed();
mLedger->setImmutable();
}
return mComplete;
@@ -246,6 +257,7 @@ void LedgerAcquire::done()
if (isComplete() && !isFailed() && mLedger)
{
mLedger->setClosed();
mLedger->setImmutable();
if (mAccept)
mLedger->setAccepted();
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()
{ // CAUTION: Changes can be lost
{
boost::recursive_mutex::scoped_lock sl(mLock);
assert(mState == smsImmutable);
mTNByID.clear();
if (root)

View File

@@ -83,6 +83,8 @@ void SHAMap::getMissingNodes(std::vector<SHAMapNode>& nodeIDs, std::vector<uint2
if (have_all)
node->setFullBelow();
}
if (nodeIDs.empty())
clearSynching();
}
std::vector<uint256> SHAMap::getNeededHashes(int max)
@@ -134,6 +136,8 @@ std::vector<uint256> SHAMap::getNeededHashes(int max)
if (have_all)
node->setFullBelow();
}
if (ret.empty())
clearSynching();
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)