mirror of
https://github.com/XRPLF/rippled.git
synced 2025-12-01 00:15:51 +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()
|
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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user