mirror of
https://github.com/Xahau/xahaud.git
synced 2025-12-06 17:27:52 +00:00
A collection of small bugfixes.
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -158,6 +158,7 @@ public:
|
||||
SHAMap::ref peekAccountStateMap() { return mAccountStateMap; }
|
||||
void dropCache()
|
||||
{
|
||||
assert(isImmutable());
|
||||
if (mTransactionMap)
|
||||
mTransactionMap->dropCache();
|
||||
if (mAccountStateMap)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user