mirror of
https://github.com/XRPLF/rippled.git
synced 2025-11-26 05:55:51 +00:00
Startup and shutdown improvements. Performance improvements.
This commit is contained in:
@@ -45,7 +45,7 @@ Application::Application() :
|
|||||||
mSNTPClient(mAuxService), mRPCHandler(&mNetOps), mFeeTrack(),
|
mSNTPClient(mAuxService), mRPCHandler(&mNetOps), mFeeTrack(),
|
||||||
mRpcDB(NULL), mTxnDB(NULL), mLedgerDB(NULL), mWalletDB(NULL), mHashNodeDB(NULL), mNetNodeDB(NULL),
|
mRpcDB(NULL), mTxnDB(NULL), mLedgerDB(NULL), mWalletDB(NULL), mHashNodeDB(NULL), mNetNodeDB(NULL),
|
||||||
mConnectionPool(mIOService), mPeerDoor(NULL), mRPCDoor(NULL), mWSPublicDoor(NULL), mWSPrivateDoor(NULL),
|
mConnectionPool(mIOService), mPeerDoor(NULL), mRPCDoor(NULL), mWSPublicDoor(NULL), mWSPrivateDoor(NULL),
|
||||||
mSweepTimer(mAuxService)
|
mSweepTimer(mAuxService), mShutdown(false)
|
||||||
{
|
{
|
||||||
getRand(mNonce256.begin(), mNonce256.size());
|
getRand(mNonce256.begin(), mNonce256.size());
|
||||||
getRand(reinterpret_cast<unsigned char *>(&mNonceST), sizeof(mNonceST));
|
getRand(reinterpret_cast<unsigned char *>(&mNonceST), sizeof(mNonceST));
|
||||||
@@ -58,6 +58,7 @@ bool Instance::running = true;
|
|||||||
void Application::stop()
|
void Application::stop()
|
||||||
{
|
{
|
||||||
cLog(lsINFO) << "Received shutdown request";
|
cLog(lsINFO) << "Received shutdown request";
|
||||||
|
mShutdown = true;
|
||||||
mIOService.stop();
|
mIOService.stop();
|
||||||
mHashedObjectStore.bulkWrite();
|
mHashedObjectStore.bulkWrite();
|
||||||
mValidations.flush();
|
mValidations.flush();
|
||||||
|
|||||||
@@ -87,6 +87,8 @@ class Application
|
|||||||
std::map<std::string, Peer::pointer> mPeerMap;
|
std::map<std::string, Peer::pointer> mPeerMap;
|
||||||
boost::recursive_mutex mPeerMapLock;
|
boost::recursive_mutex mPeerMapLock;
|
||||||
|
|
||||||
|
volatile bool mShutdown;
|
||||||
|
|
||||||
void startNewLedger();
|
void startNewLedger();
|
||||||
void loadOldLedger(const std::string&);
|
void loadOldLedger(const std::string&);
|
||||||
|
|
||||||
@@ -140,6 +142,7 @@ public:
|
|||||||
uint256 getNonce256() { return mNonce256; }
|
uint256 getNonce256() { return mNonce256; }
|
||||||
std::size_t getNonceST() { return mNonceST; }
|
std::size_t getNonceST() { return mNonceST; }
|
||||||
|
|
||||||
|
bool isShutdown() { return mShutdown; }
|
||||||
void setup();
|
void setup();
|
||||||
void run();
|
void run();
|
||||||
void stop();
|
void stop();
|
||||||
|
|||||||
@@ -781,6 +781,45 @@ bool Ledger::getHashesByIndex(uint32 ledgerIndex, uint256& ledgerHash, uint256&
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::map< uint32, std::pair<uint256, uint256> > Ledger::getHashesByIndex(uint32 minSeq, uint32 maxSeq)
|
||||||
|
{
|
||||||
|
#ifndef NO_SQLITE_PREPARE
|
||||||
|
std::map< uint32, std::pair<uint256, uint256> > ret;
|
||||||
|
DatabaseCon *con = theApp->getLedgerDB();
|
||||||
|
ScopedLock sl(con->getDBLock());
|
||||||
|
|
||||||
|
static SqliteStatement pSt(con->getDB()->getSqliteDB(),
|
||||||
|
"SELECT LedgerSeq,LedgerHash,PrevHash FROM Ledgers INDEXED BY SeqLedger "
|
||||||
|
"WHERE LedgerSeq >= ? AND LedgerSeq <= ?;");
|
||||||
|
|
||||||
|
std::pair<uint256, uint256> hashes;
|
||||||
|
|
||||||
|
pSt.bind(1, minSeq);
|
||||||
|
pSt.bind(2, maxSeq);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
int r = pSt.step();
|
||||||
|
if (pSt.isDone(r))
|
||||||
|
{
|
||||||
|
pSt.reset();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
if (!pSt.isRow(r))
|
||||||
|
{
|
||||||
|
pSt.reset();
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
hashes.first.SetHex(pSt.peekString(1), true);
|
||||||
|
hashes.second.SetHex(pSt.peekString(2), true);
|
||||||
|
ret[pSt.getUInt32(0)] = hashes;
|
||||||
|
} while(1);
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error SQLite prepare is required
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
Ledger::pointer Ledger::getLastFullLedger()
|
Ledger::pointer Ledger::getLastFullLedger()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ public:
|
|||||||
static Ledger::pointer loadByHash(const uint256& ledgerHash);
|
static Ledger::pointer loadByHash(const uint256& ledgerHash);
|
||||||
static uint256 getHashByIndex(uint32 index);
|
static uint256 getHashByIndex(uint32 index);
|
||||||
static bool getHashesByIndex(uint32 index, uint256& ledgerHash, uint256& parentHash);
|
static bool getHashesByIndex(uint32 index, uint256& ledgerHash, uint256& parentHash);
|
||||||
|
static std::map< uint32, std::pair<uint256, uint256> > getHashesByIndex(uint32 minSeq, uint32 maxSeq);
|
||||||
void pendSave(bool fromConsensus);
|
void pendSave(bool fromConsensus);
|
||||||
|
|
||||||
// next/prev function
|
// next/prev function
|
||||||
|
|||||||
@@ -145,6 +145,8 @@ void LedgerMaster::asyncAccept(Ledger::pointer ledger)
|
|||||||
uint32 seq = ledger->getLedgerSeq();
|
uint32 seq = ledger->getLedgerSeq();
|
||||||
uint256 prevHash = ledger->getParentHash();
|
uint256 prevHash = ledger->getParentHash();
|
||||||
|
|
||||||
|
std::map< uint32, std::pair<uint256, uint256> > ledgerHashes;
|
||||||
|
|
||||||
while (seq > 0)
|
while (seq > 0)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@@ -155,10 +157,20 @@ void LedgerMaster::asyncAccept(Ledger::pointer ledger)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint256 tHash, pHash;
|
std::map< uint32, std::pair<uint256, uint256> >::iterator it = ledgerHashes.find(seq);
|
||||||
if (!Ledger::getHashesByIndex(seq, tHash, pHash) || (tHash != prevHash))
|
if (it == ledgerHashes.end())
|
||||||
|
{
|
||||||
|
if (theApp->isShutdown())
|
||||||
|
return;
|
||||||
|
ledgerHashes = Ledger::getHashesByIndex((seq < 500) ? 0 : (seq - 499), seq);
|
||||||
|
it = ledgerHashes.find(seq);
|
||||||
|
if (it == ledgerHashes.end())
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (it->second.first != prevHash)
|
||||||
break;
|
break;
|
||||||
prevHash = pHash;
|
prevHash = it->second.second;
|
||||||
}
|
}
|
||||||
|
|
||||||
resumeAcquiring();
|
resumeAcquiring();
|
||||||
|
|||||||
@@ -23,8 +23,12 @@ DECLARE_INSTANCE(SHAMapTreeNode);
|
|||||||
|
|
||||||
void SHAMapNode::setHash() const
|
void SHAMapNode::setHash() const
|
||||||
{
|
{
|
||||||
std::size_t h = theApp->getNonceST() + mDepth;
|
std::size_t h = theApp->getNonceST() + (mDepth * 0x9e3779b9);
|
||||||
mHash = mNodeID.hash_combine(h);
|
|
||||||
|
const unsigned int *ptr = reinterpret_cast<const unsigned int *>(mNodeID.begin());
|
||||||
|
for (int i = (mDepth + 3) / 4; i >= 0; --i)
|
||||||
|
boost::hash_combine(h, *ptr++);
|
||||||
|
mHash = h;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t hash_value(const SHAMapNode& mn)
|
std::size_t hash_value(const SHAMapNode& mn)
|
||||||
|
|||||||
@@ -43,20 +43,21 @@ public:
|
|||||||
|
|
||||||
SHAMapNode() : mDepth(0), mHash(0) { ; }
|
SHAMapNode() : mDepth(0), mHash(0) { ; }
|
||||||
SHAMapNode(int depth, const uint256& hash);
|
SHAMapNode(int depth, const uint256& hash);
|
||||||
virtual ~SHAMapNode() { ; }
|
|
||||||
|
|
||||||
int getDepth() const { return mDepth; }
|
int getDepth() const { return mDepth; }
|
||||||
const uint256& getNodeID() const { return mNodeID; }
|
const uint256& getNodeID() const { return mNodeID; }
|
||||||
bool isValid() const { return (mDepth >= 0) && (mDepth < 64); }
|
bool isValid() const { return (mDepth >= 0) && (mDepth < 64); }
|
||||||
|
bool isRoot() const { return mDepth == 0; }
|
||||||
size_t getHash() const { if (mHash == 0) setHash(); return mHash; }
|
size_t getHash() const { if (mHash == 0) setHash(); return mHash; }
|
||||||
|
|
||||||
virtual bool isPopulated() const { return false; }
|
virtual bool isPopulated() const { return false; }
|
||||||
|
|
||||||
SHAMapNode getParentNodeID() const
|
SHAMapNode getParentNodeID() const
|
||||||
{
|
{
|
||||||
assert(mDepth);
|
assert(mDepth);
|
||||||
return SHAMapNode(mDepth - 1, mNodeID);
|
return SHAMapNode(mDepth - 1, mNodeID);
|
||||||
}
|
}
|
||||||
|
|
||||||
SHAMapNode getChildNodeID(int m) const;
|
SHAMapNode getChildNodeID(int m) const;
|
||||||
int selectBranch(const uint256& hash) const;
|
int selectBranch(const uint256& hash) const;
|
||||||
|
|
||||||
@@ -68,7 +69,6 @@ public:
|
|||||||
bool operator!=(const uint256&) const;
|
bool operator!=(const uint256&) const;
|
||||||
bool operator<=(const SHAMapNode&) const;
|
bool operator<=(const SHAMapNode&) const;
|
||||||
bool operator>=(const SHAMapNode&) const;
|
bool operator>=(const SHAMapNode&) const;
|
||||||
bool isRoot() const { return mDepth == 0; }
|
|
||||||
|
|
||||||
virtual std::string getString() const;
|
virtual std::string getString() const;
|
||||||
void dump() const;
|
void dump() const;
|
||||||
|
|||||||
Reference in New Issue
Block a user