From 72769c5c40943485a82496a3142a0c807055a1c7 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 10 Jul 2013 11:48:31 -0700 Subject: [PATCH] Plug backends into NodeStore --- Builds/VisualStudio2012/RippleD.vcxproj | 8 +- .../VisualStudio2012/RippleD.vcxproj.filters | 8 +- ...B.cpp => ripple_LevelDBBackendFactory.cpp} | 4 +- ...velDB.h => ripple_LevelDBBackendFactory.h} | 6 +- modules/ripple_app/node/ripple_NodeStore.cpp | 96 ++++++++++++- modules/ripple_app/node/ripple_NodeStore.h | 64 ++++----- ...te.cpp => ripple_SqliteBackendFactory.cpp} | 4 +- ...Sqlite.h => ripple_SqliteBackendFactory.h} | 6 +- modules/ripple_app/ripple_app.cpp | 8 +- .../utility/ripple_StringUtilities.cpp | 39 +++++ .../utility/ripple_StringUtilities.h | 4 + src/cpp/ripple/Ledger.cpp | 2 +- src/cpp/ripple/RPCHandler.cpp | 6 +- src/cpp/ripple/ripple_Application.cpp | 133 +++++++++--------- src/cpp/ripple/ripple_IApplication.h | 2 +- src/cpp/ripple/ripple_InboundLedger.cpp | 6 +- src/cpp/ripple/ripple_Main.cpp | 7 +- src/cpp/ripple/ripple_Peer.cpp | 2 +- src/cpp/ripple/ripple_SHAMap.cpp | 4 +- src/cpp/ripple/ripple_SHAMapSyncFilters.cpp | 4 +- 20 files changed, 270 insertions(+), 143 deletions(-) rename modules/ripple_app/node/{ripple_NodeStoreLevelDB.cpp => ripple_LevelDBBackendFactory.cpp} (95%) rename modules/ripple_app/node/{ripple_NodeStoreLevelDB.h => ripple_LevelDBBackendFactory.h} (74%) rename modules/ripple_app/node/{ripple_NodeStoreSqlite.cpp => ripple_SqliteBackendFactory.cpp} (96%) rename modules/ripple_app/node/{ripple_NodeStoreSqlite.h => ripple_SqliteBackendFactory.h} (74%) diff --git a/Builds/VisualStudio2012/RippleD.vcxproj b/Builds/VisualStudio2012/RippleD.vcxproj index 357c14a63..ff1e40ed1 100644 --- a/Builds/VisualStudio2012/RippleD.vcxproj +++ b/Builds/VisualStudio2012/RippleD.vcxproj @@ -37,13 +37,13 @@ true true - + true true true true - + true true true @@ -1344,8 +1344,8 @@ - - + + diff --git a/Builds/VisualStudio2012/RippleD.vcxproj.filters b/Builds/VisualStudio2012/RippleD.vcxproj.filters index 36a921803..72f166073 100644 --- a/Builds/VisualStudio2012/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2012/RippleD.vcxproj.filters @@ -855,10 +855,10 @@ [1] Ripple\ripple_app\node - + [1] Ripple\ripple_app\node - + [1] Ripple\ripple_app\node @@ -1602,10 +1602,10 @@ [1] Ripple\ripple_app\node - + [1] Ripple\ripple_app\node - + [1] Ripple\ripple_app\node diff --git a/modules/ripple_app/node/ripple_NodeStoreLevelDB.cpp b/modules/ripple_app/node/ripple_LevelDBBackendFactory.cpp similarity index 95% rename from modules/ripple_app/node/ripple_NodeStoreLevelDB.cpp rename to modules/ripple_app/node/ripple_LevelDBBackendFactory.cpp index b02cdd3eb..8742c84ec 100644 --- a/modules/ripple_app/node/ripple_NodeStoreLevelDB.cpp +++ b/modules/ripple_app/node/ripple_LevelDBBackendFactory.cpp @@ -133,9 +133,9 @@ String LevelDBBackendFactory::getName () const return "LevelDB"; } -NodeStore::Backend* LevelDBBackendFactory::createInstance (HashMap const& keyValueParameters) +NodeStore::Backend* LevelDBBackendFactory::createInstance (StringPairArray const& keyValues) { - return nullptr; + return new LevelDBBackendFactory::Backend (keyValues ["path"].toStdString ()); } //------------------------------------------------------------------------------ diff --git a/modules/ripple_app/node/ripple_NodeStoreLevelDB.h b/modules/ripple_app/node/ripple_LevelDBBackendFactory.h similarity index 74% rename from modules/ripple_app/node/ripple_NodeStoreLevelDB.h rename to modules/ripple_app/node/ripple_LevelDBBackendFactory.h index cc53c8595..b2f324f92 100644 --- a/modules/ripple_app/node/ripple_NodeStoreLevelDB.h +++ b/modules/ripple_app/node/ripple_LevelDBBackendFactory.h @@ -4,8 +4,8 @@ */ //============================================================================== -#ifndef RIPPLE_NODESTORELEVELDB_H_INCLUDED -#define RIPPLE_NODESTORELEVELDB_H_INCLUDED +#ifndef RIPPLE_LEVELDBBACKENDFACTORY_H_INCLUDED +#define RIPPLE_LEVELDBBACKENDFACTORY_H_INCLUDED /** Factory to produce LevelDB backends for the NodeStore. */ @@ -21,7 +21,7 @@ public: static LevelDBBackendFactory& getInstance (); String getName () const; - NodeStore::Backend* createInstance (HashMap const& keyValueParameters); + NodeStore::Backend* createInstance (StringPairArray const& keyValues); }; #endif diff --git a/modules/ripple_app/node/ripple_NodeStore.cpp b/modules/ripple_app/node/ripple_NodeStore.cpp index e8aa1f90a..8e5663026 100644 --- a/modules/ripple_app/node/ripple_NodeStore.cpp +++ b/modules/ripple_app/node/ripple_NodeStore.cpp @@ -4,16 +4,62 @@ */ //============================================================================== -NodeStore::NodeStore (int cacheSize, int cacheAge) : - mCache ("NodeStore", cacheSize, cacheAge), mNegativeCache ("HashedObjectNegativeCache", 0, 120), - mWriteGeneration (0), mWriteLoad (0), mWritePending (false), mLevelDB (false), mEphemeralDB (false) +Array NodeStore::s_factories; + +NodeStore::NodeStore (String parameters, int cacheSize, int cacheAge) + : mCache ("NodeStore", cacheSize, cacheAge) + , mNegativeCache ("HashedObjectNegativeCache", 0, 120) + , mWriteGeneration (0) + , mWriteLoad (0) + , mWritePending (false) + , mLevelDB (false) + , mEphemeralDB (false) { + StringPairArray keyValues = parseKeyValueParameters (parameters, '|'); + + String const& type = keyValues ["type"]; + + if (type.isNotEmpty ()) + { + BackendFactory* factory = nullptr; + + for (int i = 0; i < s_factories.size (); ++i) + { + if (s_factories [i]->getName () == type) + { + factory = s_factories [i]; + break; + } + } + + if (factory != nullptr) + { + m_backend = factory->createInstance (keyValues); + } + else + { + throw std::runtime_error ("unkown backend type"); + } + } + else + { + throw std::runtime_error ("missing backend type"); + } + mWriteSet.reserve (128); + // VFALCO TODO Eliminate usage of theConfig + // This can be done by passing required parameters through + // the backendParameters string. + // if (theConfig.NODE_DB == "leveldb" || theConfig.NODE_DB == "LevelDB") + { mLevelDB = true; + } else if (theConfig.NODE_DB == "SQLite" || theConfig.NODE_DB == "sqlite") + { mLevelDB = false; + } else { WriteLog (lsFATAL, NodeObject) << "Incorrect database selection"; @@ -21,7 +67,43 @@ NodeStore::NodeStore (int cacheSize, int cacheAge) : } if (!theConfig.LDB_EPHEMERAL.empty ()) + { + // VFALCO NOTE This is cryptic mEphemeralDB = true; + } +} + +void NodeStore::addBackendFactory (BackendFactory& factory) +{ + s_factories.add (&factory); +} + +// DEPRECATED +bool NodeStore::isLevelDB () +{ + return mLevelDB; +} + +float NodeStore::getCacheHitRate () +{ + return mCache.getHitRate (); +} + +bool NodeStore::store (NodeObjectType type, uint32 index, Blob const& data, + uint256 const& hash) +{ + if (mLevelDB) + return storeLevelDB (type, index, data, hash); + + return storeSQLite (type, index, data, hash); +} + +NodeObject::pointer NodeStore::retrieve (uint256 const& hash) +{ + if (mLevelDB) + return retrieveLevelDB (hash); + + return retrieveSQLite (hash); } void NodeStore::tune (int size, int age) @@ -30,6 +112,12 @@ void NodeStore::tune (int size, int age) mCache.setTargetAge (age); } +void NodeStore::sweep () +{ + mCache.sweep (); + mNegativeCache.sweep (); +} + void NodeStore::waitWrite () { boost::mutex::scoped_lock sl (mWriteMutex); @@ -617,5 +705,3 @@ int NodeStore::import (const std::string& file) WriteLog (lsWARNING, NodeObject) << "Imported " << count << " nodes"; return count; } - -// vim:ts=4 diff --git a/modules/ripple_app/node/ripple_NodeStore.h b/modules/ripple_app/node/ripple_NodeStore.h index 6e3b64273..232db5263 100644 --- a/modules/ripple_app/node/ripple_NodeStore.h +++ b/modules/ripple_app/node/ripple_NodeStore.h @@ -23,15 +23,14 @@ public: // typedef boost::shared_ptr pointer; - Backend() { ; } - virtual ~Backend() { ; } + virtual ~Backend () { } virtual std::string getDataBaseName() = 0; // Store/retrieve a single object // These functions must be thread safe - virtual bool store(NodeObject::ref) = 0; - virtual NodeObject::pointer retrieve(uint256 const &hash) = 0; + virtual bool store (NodeObject::ref) = 0; + virtual NodeObject::pointer retrieve (uint256 const &hash) = 0; // Store a group of objects // This function will only be called from a single thread @@ -56,38 +55,36 @@ public: /** Create an instance of this factory's backend. */ - virtual Backend* createInstance (HashMap const& keyValueParameters) = 0; + virtual Backend* createInstance (StringPairArray const& keyValues) = 0; }; public: - NodeStore (int cacheSize, int cacheAge); + /** Construct a node store. - bool isLevelDB () - { - return mLevelDB; - } + parameters has the format: - float getCacheHitRate () - { - return mCache.getHitRate (); - } + =['|'=] + + The key "type" must exist, it defines the backend. For example + "type=LevelDB|path=/mnt/ephemeral" + */ + NodeStore (String parameters, int cacheSize, int cacheAge); + + /** Add the specified backend factory to the list of available factories. + + The names of available factories are compared against the "type" + value in the parameter list on construction. + */ + static void addBackendFactory (BackendFactory& factory); + + bool isLevelDB (); + + float getCacheHitRate (); bool store (NodeObjectType type, uint32 index, Blob const& data, - uint256 const& hash) - { - if (mLevelDB) - return storeLevelDB (type, index, data, hash); + uint256 const& hash); - return storeSQLite (type, index, data, hash); - } - - NodeObject::pointer retrieve (uint256 const& hash) - { - if (mLevelDB) - return retrieveLevelDB (hash); - - return retrieveSQLite (hash); - } + NodeObject::pointer retrieve (uint256 const& hash); bool storeSQLite (NodeObjectType type, uint32 index, Blob const& data, uint256 const& hash); @@ -102,11 +99,7 @@ public: void waitWrite (); void tune (int size, int age); - void sweep () - { - mCache.sweep (); - mNegativeCache.sweep (); - } + void sweep (); int getWriteLoad (); int import (const std::string& fileName); @@ -117,6 +110,11 @@ private: static void LLWrite (const std::vector< boost::shared_ptr >& set, leveldb::DB* db); private: + static Array s_factories; + +private: + ScopedPointer m_backend; + TaggedCache mCache; KeyCache mNegativeCache; diff --git a/modules/ripple_app/node/ripple_NodeStoreSqlite.cpp b/modules/ripple_app/node/ripple_SqliteBackendFactory.cpp similarity index 96% rename from modules/ripple_app/node/ripple_NodeStoreSqlite.cpp rename to modules/ripple_app/node/ripple_SqliteBackendFactory.cpp index 82b4b488e..f1e74d3bb 100644 --- a/modules/ripple_app/node/ripple_NodeStoreSqlite.cpp +++ b/modules/ripple_app/node/ripple_SqliteBackendFactory.cpp @@ -159,7 +159,7 @@ String SqliteBackendFactory::getName () const return "Sqlite"; } -NodeStore::Backend* SqliteBackendFactory::createInstance (HashMap const& keyValueParameters) +NodeStore::Backend* SqliteBackendFactory::createInstance (StringPairArray const& keyValues) { - return new Backend (keyValueParameters ["path"].toStdString ()); + return new Backend (keyValues ["path"].toStdString ()); } diff --git a/modules/ripple_app/node/ripple_NodeStoreSqlite.h b/modules/ripple_app/node/ripple_SqliteBackendFactory.h similarity index 74% rename from modules/ripple_app/node/ripple_NodeStoreSqlite.h rename to modules/ripple_app/node/ripple_SqliteBackendFactory.h index 9ee4ff9e4..e6420cbde 100644 --- a/modules/ripple_app/node/ripple_NodeStoreSqlite.h +++ b/modules/ripple_app/node/ripple_SqliteBackendFactory.h @@ -4,8 +4,8 @@ */ //============================================================================== -#ifndef RIPPLE_NODESTORESQLITE_H_INCLUDED -#define RIPPLE_NODESTORESQLITE_H_INCLUDED +#ifndef RIPPLE_SQLITEBACKENDFACTORY_H_INCLUDED +#define RIPPLE_SQLITEBACKENDFACTORY_H_INCLUDED /** Factory to produce SQLite backends for the NodeStore. */ @@ -21,7 +21,7 @@ public: static SqliteBackendFactory& getInstance (); String getName () const; - NodeStore::Backend* createInstance (HashMap const& keyValueParameters); + NodeStore::Backend* createInstance (StringPairArray const& keyValues); }; #endif diff --git a/modules/ripple_app/ripple_app.cpp b/modules/ripple_app/ripple_app.cpp index 8f0eadcc6..3df7dd400 100644 --- a/modules/ripple_app/ripple_app.cpp +++ b/modules/ripple_app/ripple_app.cpp @@ -96,8 +96,8 @@ namespace ripple #include "node/ripple_NodeObject.h" #include "node/ripple_NodeStore.h" -#include "node/ripple_NodeStoreLevelDB.h" -#include "node/ripple_NodeStoreSqlite.h" +#include "node/ripple_SqliteBackendFactory.h" +#include "node/ripple_LevelDBBackendFactory.h" #include "src/cpp/ripple/ripple_SHAMapItem.h" #include "src/cpp/ripple/ripple_SHAMapNode.h" @@ -236,8 +236,8 @@ static const uint64 tenTo17m1 = tenTo17 - 1; #include "basics/ripple_RPCServerHandler.cpp" #include "node/ripple_NodeObject.cpp" #include "node/ripple_NodeStore.cpp" -#include "node/ripple_NodeStoreLevelDB.cpp" -#include "node/ripple_NodeStoreSqlite.cpp" +#include "node/ripple_LevelDBBackendFactory.cpp" +#include "node/ripple_SqliteBackendFactory.cpp" #include "src/cpp/ripple/Ledger.cpp" #include "src/cpp/ripple/ripple_SHAMapDelta.cpp" diff --git a/modules/ripple_basics/utility/ripple_StringUtilities.cpp b/modules/ripple_basics/utility/ripple_StringUtilities.cpp index 5813164a0..cdc438a6e 100644 --- a/modules/ripple_basics/utility/ripple_StringUtilities.cpp +++ b/modules/ripple_basics/utility/ripple_StringUtilities.cpp @@ -271,3 +271,42 @@ std::string addressToString (void const* address) return strHex (static_cast (address) - static_cast (0)); } +StringPairArray parseKeyValueParameters (String parameters, beast_wchar delimiter) +{ + StringPairArray keyValues; + + while (parameters.isNotEmpty ()) + { + String pair; + + { + int const delimiterPos = parameters.indexOfChar (delimiter); + + if (delimiterPos != -1) + { + pair = parameters.substring (0, delimiterPos); + + parameters = parameters.substring (delimiterPos + 1); + } + else + { + pair = parameters; + + parameters = String::empty; + } + } + + int const equalPos = pair.indexOfChar ('='); + + if (equalPos != -1) + { + String const key = pair.substring (0, equalPos); + String const value = pair.substring (equalPos + 1, pair.length ()); + + keyValues.set (key, value); + } + } + + return keyValues; +} + diff --git a/modules/ripple_basics/utility/ripple_StringUtilities.h b/modules/ripple_basics/utility/ripple_StringUtilities.h index 3ddcf75ae..dd002a2a2 100644 --- a/modules/ripple_basics/utility/ripple_StringUtilities.h +++ b/modules/ripple_basics/utility/ripple_StringUtilities.h @@ -214,4 +214,8 @@ bool parseUrl (const std::string& strUrl, std::string& strScheme, std::string& s */ extern std::string addressToString (void const* address); +/** Parse a pipe delimited key/value parameter string. +*/ +StringPairArray parseKeyValueParameters (String parameters, beast_wchar delimiter); + #endif diff --git a/src/cpp/ripple/Ledger.cpp b/src/cpp/ripple/Ledger.cpp index ac9ae3239..a3d968241 100644 --- a/src/cpp/ripple/Ledger.cpp +++ b/src/cpp/ripple/Ledger.cpp @@ -533,7 +533,7 @@ void Ledger::saveAcceptedLedger (Job&, bool fromConsensus) Serializer s (128); s.add32 (HashPrefix::ledgerMaster); addRaw (s); - getApp().getHashedObjectStore ().store (hotLEDGER, mLedgerSeq, s.peekData (), mHash); + getApp().getNodeStore ().store (hotLEDGER, mLedgerSeq, s.peekData (), mHash); AcceptedLedger::pointer aLedger = AcceptedLedger::makeAcceptedLedger (shared_from_this ()); diff --git a/src/cpp/ripple/RPCHandler.cpp b/src/cpp/ripple/RPCHandler.cpp index 42ffcbffa..e934d7559 100644 --- a/src/cpp/ripple/RPCHandler.cpp +++ b/src/cpp/ripple/RPCHandler.cpp @@ -2401,7 +2401,7 @@ Json::Value RPCHandler::doGetCounts (Json::Value params, LoadType* loadType, Sco if (dbKB > 0) ret["dbKBLedger"] = dbKB; - if (!getApp().getHashedObjectStore ().isLevelDB ()) + if (!getApp().getNodeStore ().isLevelDB ()) { dbKB = getApp().getHashNodeDB ()->getDB ()->getKBUsedDB (); @@ -2414,10 +2414,10 @@ Json::Value RPCHandler::doGetCounts (Json::Value params, LoadType* loadType, Sco if (dbKB > 0) ret["dbKBTransaction"] = dbKB; - ret["write_load"] = getApp().getHashedObjectStore ().getWriteLoad (); + ret["write_load"] = getApp().getNodeStore ().getWriteLoad (); ret["SLE_hit_rate"] = getApp().getSLECache ().getHitRate (); - ret["node_hit_rate"] = getApp().getHashedObjectStore ().getCacheHitRate (); + ret["node_hit_rate"] = getApp().getNodeStore ().getCacheHitRate (); ret["ledger_hit_rate"] = getApp().getLedgerMaster ().getCacheHitRate (); ret["AL_hit_rate"] = AcceptedLedger::getCacheHitRate (); diff --git a/src/cpp/ripple/ripple_Application.cpp b/src/cpp/ripple/ripple_Application.cpp index c4795e8ee..24461b7cd 100644 --- a/src/cpp/ripple/ripple_Application.cpp +++ b/src/cpp/ripple/ripple_Application.cpp @@ -25,7 +25,62 @@ public: class Holder; - Application (); + Application () + // + // VFALCO NOTE Change this to control whether or not the Application + // object is destroyed on exit + // + #if 1 + // Application object will be deleted on exit. If the code doesn't exit + // cleanly this could cause hangs or crashes on exit. + // + : SharedSingleton (SingletonLifetime::persistAfterCreation) + #else + // This will make it so that the Application object is not deleted on exit. + // + : SharedSingleton (SingletonLifetime::neverDestroyed) + #endif + , mIOService ((theConfig.NODE_SIZE >= 2) ? 2 : 1) + , mIOWork (mIOService) + , mNetOps (&mLedgerMaster) + , m_rpcServerHandler (mNetOps) + , mTempNodeCache ("NodeCache", 16384, 90) + , m_nodeStore ("type=LevelDB|path=/mnt/stuff|compact=1", 16384, 300) + , mSLECache ("LedgerEntryCache", 4096, 120) + , mSNTPClient (mAuxService) + , mJobQueue (mIOService) + // VFALCO New stuff + , mFeatures (IFeatures::New (2 * 7 * 24 * 60 * 60, 200)) // two weeks, 200/256 + , mFeeVote (IFeeVote::New (10, 50 * SYSTEM_CURRENCY_PARTS, 12.5 * SYSTEM_CURRENCY_PARTS)) + , mFeeTrack (ILoadFeeTrack::New ()) + , mHashRouter (IHashRouter::New (IHashRouter::getDefaultHoldTime ())) + , mValidations (IValidations::New ()) + , mUNL (UniqueNodeList::New ()) + , mProofOfWorkFactory (IProofOfWorkFactory::New ()) + , mPeers (IPeers::New (mIOService)) + , m_loadManager (ILoadManager::New ()) + // VFALCO End new stuff + // VFALCO TODO replace all NULL with nullptr + , mRpcDB (NULL) + , mTxnDB (NULL) + , mLedgerDB (NULL) + , mWalletDB (NULL) // VFALCO NOTE are all these 'NULL' ctor params necessary? + , mNetNodeDB (NULL) + , mPathFindDB (NULL) + , mHashNodeDB (NULL) + , mHashNodeLDB (NULL) + , mEphemeralLDB (NULL) + , mPeerDoor (NULL) + , mRPCDoor (NULL) + , mWSPublicDoor (NULL) + , mWSPrivateDoor (NULL) + , mSweepTimer (mAuxService) + , mShutdown (false) + { + // VFALCO TODO remove these once the call is thread safe. + HashMaps::getInstance ().initializeNonce (); + } + ~Application (); LocalCredentials& getLocalCredentials () @@ -63,9 +118,9 @@ public: return mTempNodeCache; } - NodeStore& getHashedObjectStore () + NodeStore& getNodeStore () { - return mHashedObjectStore; + return m_nodeStore; } JobQueue& getJobQueue () @@ -223,7 +278,7 @@ private: NetworkOPs mNetOps; RPCServerHandler m_rpcServerHandler; NodeCache mTempNodeCache; - NodeStore mHashedObjectStore; + NodeStore m_nodeStore; SLECache mSLECache; SNTPClient mSNTPClient; JobQueue mJobQueue; @@ -264,62 +319,6 @@ private: bool volatile mShutdown; }; -Application::Application () -// -// VFALCO NOTE Change this to control whether or not the Application -// object is destroyed on exit -// -#if 1 - // Application object will be deleted on exit. If the code doesn't exit - // cleanly this could cause hangs or crashes on exit. - // - : SharedSingleton (SingletonLifetime::persistAfterCreation) -#else - // This will make it so that the Application object is not deleted on exit. - // - : SharedSingleton (SingletonLifetime::neverDestroyed) -#endif - , mIOService ((theConfig.NODE_SIZE >= 2) ? 2 : 1) - , mIOWork (mIOService) - , mNetOps (&mLedgerMaster) - , m_rpcServerHandler (mNetOps) - , mTempNodeCache ("NodeCache", 16384, 90) - , mHashedObjectStore (16384, 300) - , mSLECache ("LedgerEntryCache", 4096, 120) - , mSNTPClient (mAuxService) - , mJobQueue (mIOService) - // VFALCO New stuff - , mFeatures (IFeatures::New (2 * 7 * 24 * 60 * 60, 200)) // two weeks, 200/256 - , mFeeVote (IFeeVote::New (10, 50 * SYSTEM_CURRENCY_PARTS, 12.5 * SYSTEM_CURRENCY_PARTS)) - , mFeeTrack (ILoadFeeTrack::New ()) - , mHashRouter (IHashRouter::New (IHashRouter::getDefaultHoldTime ())) - , mValidations (IValidations::New ()) - , mUNL (UniqueNodeList::New ()) - , mProofOfWorkFactory (IProofOfWorkFactory::New ()) - , mPeers (IPeers::New (mIOService)) - , m_loadManager (ILoadManager::New ()) - // VFALCO End new stuff - // VFALCO TODO replace all NULL with nullptr - , mRpcDB (NULL) - , mTxnDB (NULL) - , mLedgerDB (NULL) - , mWalletDB (NULL) // VFALCO NOTE are all these 'NULL' ctor params necessary? - , mNetNodeDB (NULL) - , mPathFindDB (NULL) - , mHashNodeDB (NULL) - , mHashNodeLDB (NULL) - , mEphemeralLDB (NULL) - , mPeerDoor (NULL) - , mRPCDoor (NULL) - , mWSPublicDoor (NULL) - , mWSPrivateDoor (NULL) - , mSweepTimer (mAuxService) - , mShutdown (false) -{ - // VFALCO TODO remove these once the call is thread safe. - HashMaps::getInstance ().initializeNonce (); -} - Application::~Application () { // VFALCO TODO Wrap these in ScopedPointer @@ -341,7 +340,7 @@ void Application::stop () StopSustain (); mShutdown = true; mIOService.stop (); - mHashedObjectStore.waitWrite (); + m_nodeStore.waitWrite (); mValidations->flush (); mAuxService.stop (); mJobQueue.shutdown (); @@ -452,7 +451,7 @@ void Application::setup () if (theConfig.LDB_IMPORT) options.write_buffer_size = 32 << 20; - if (mHashedObjectStore.isLevelDB ()) + if (m_nodeStore.isLevelDB ()) { WriteLog (lsINFO, Application) << "LevelDB used for nodes"; leveldb::Status status = leveldb::DB::Open (options, (theConfig.DATA_DIR / "hashnode").string (), &mHashNodeLDB); @@ -486,7 +485,7 @@ void Application::setup () } } - if (!mHashedObjectStore.isLevelDB ()) + if (!m_nodeStore.isLevelDB ()) { getApp().getHashNodeDB ()->getDB ()->executeSQL (boost::str (boost::format ("PRAGMA cache_size=-%d;") % (theConfig.getSize (siHashNodeDBCache) * 1024))); @@ -548,7 +547,7 @@ void Application::setup () getUNL ().nodeBootstrap (); mValidations->tune (theConfig.getSize (siValidationsSize), theConfig.getSize (siValidationsAge)); - mHashedObjectStore.tune (theConfig.getSize (siNodeCacheSize), theConfig.getSize (siNodeCacheAge)); + m_nodeStore.tune (theConfig.getSize (siNodeCacheSize), theConfig.getSize (siNodeCacheAge)); mLedgerMaster.tune (theConfig.getSize (siLedgerSize), theConfig.getSize (siLedgerAge)); mSLECache.setTargetSize (theConfig.getSize (siSLECacheSize)); mSLECache.setTargetAge (theConfig.getSize (siSLECacheAge)); @@ -723,7 +722,7 @@ void Application::sweep () // have listeners register for "onSweep ()" notification. // mMasterTransaction.sweep (); - mHashedObjectStore.sweep (); + m_nodeStore.sweep (); mLedgerMaster.sweep (); mTempNodeCache.sweep (); mValidations->sweep (); @@ -995,7 +994,7 @@ void Application::updateTables (bool ldbImport) exit (1); } - if (getApp().getHashedObjectStore ().isLevelDB ()) + if (getApp().getNodeStore ().isLevelDB ()) { boost::filesystem::path hashPath = theConfig.DATA_DIR / "hashnode.db"; @@ -1004,7 +1003,7 @@ void Application::updateTables (bool ldbImport) if (theConfig.LDB_IMPORT) { Log (lsWARNING) << "Importing SQLite -> LevelDB"; - getApp().getHashedObjectStore ().import (hashPath.string ()); + getApp().getNodeStore ().import (hashPath.string ()); Log (lsWARNING) << "Remove or remname the hashnode.db file"; } else diff --git a/src/cpp/ripple/ripple_IApplication.h b/src/cpp/ripple/ripple_IApplication.h index 741453719..f7a39e61d 100644 --- a/src/cpp/ripple/ripple_IApplication.h +++ b/src/cpp/ripple/ripple_IApplication.h @@ -68,7 +68,7 @@ public: virtual UniqueNodeList& getUNL () = 0; virtual IValidations& getValidations () = 0; - virtual NodeStore& getHashedObjectStore () = 0; + virtual NodeStore& getNodeStore () = 0; virtual JobQueue& getJobQueue () = 0; virtual InboundLedgers& getInboundLedgers () = 0; virtual LedgerMaster& getLedgerMaster () = 0; diff --git a/src/cpp/ripple/ripple_InboundLedger.cpp b/src/cpp/ripple/ripple_InboundLedger.cpp index 8f749ba1b..0f2c4edb0 100644 --- a/src/cpp/ripple/ripple_InboundLedger.cpp +++ b/src/cpp/ripple/ripple_InboundLedger.cpp @@ -49,7 +49,7 @@ bool InboundLedger::tryLocal () if (!mHaveBase) { // Nothing we can do without the ledger base - NodeObject::pointer node = getApp().getHashedObjectStore ().retrieve (mHash); + NodeObject::pointer node = getApp().getNodeStore ().retrieve (mHash); if (!node) { @@ -60,7 +60,7 @@ bool InboundLedger::tryLocal () WriteLog (lsTRACE, InboundLedger) << "Ledger base found in fetch pack"; mLedger = boost::make_shared (data, true); - getApp().getHashedObjectStore ().store (hotLEDGER, mLedger->getLedgerSeq (), data, mHash); + getApp().getNodeStore ().store (hotLEDGER, mLedger->getLedgerSeq (), data, mHash); } else { @@ -658,7 +658,7 @@ bool InboundLedger::takeBase (const std::string& data) // data must not have has Serializer s (data.size () + 4); s.add32 (HashPrefix::ledgerMaster); s.addRaw (data); - getApp().getHashedObjectStore ().store (hotLEDGER, mLedger->getLedgerSeq (), s.peekData (), mHash); + getApp().getNodeStore ().store (hotLEDGER, mLedger->getLedgerSeq (), s.peekData (), mHash); progress (); diff --git a/src/cpp/ripple/ripple_Main.cpp b/src/cpp/ripple/ripple_Main.cpp index 484746e9b..417c056fe 100644 --- a/src/cpp/ripple/ripple_Main.cpp +++ b/src/cpp/ripple/ripple_Main.cpp @@ -181,9 +181,10 @@ int rippleMain (int argc, char** argv) po::positional_options_description p; p.add ("parameters", -1); - // - // Prepare to run - // + // These must be added before the Application object is created + NodeStore::addBackendFactory (SqliteBackendFactory::getInstance ()); + NodeStore::addBackendFactory (LevelDBBackendFactory::getInstance ()); + if (! RandomNumbers::getInstance ().initialize ()) { diff --git a/src/cpp/ripple/ripple_Peer.cpp b/src/cpp/ripple/ripple_Peer.cpp index 062e362a9..11b5eee7a 100644 --- a/src/cpp/ripple/ripple_Peer.cpp +++ b/src/cpp/ripple/ripple_Peer.cpp @@ -1535,7 +1535,7 @@ void PeerImp::recvGetObjectByHash (const boost::shared_ptrsecond->getNodeHash ()); + getApp().getNodeStore ().store (t, seq, s.peekData (), it->second->getNodeHash ()); if (flushed++ >= maxNodes) return flushed; diff --git a/src/cpp/ripple/ripple_SHAMapSyncFilters.cpp b/src/cpp/ripple/ripple_SHAMapSyncFilters.cpp index cea381f9a..db451f56c 100644 --- a/src/cpp/ripple/ripple_SHAMapSyncFilters.cpp +++ b/src/cpp/ripple/ripple_SHAMapSyncFilters.cpp @@ -73,7 +73,7 @@ void AccountStateSF::gotNode (bool fromFilter, Blob const& nodeData, SHAMapTreeNode::TNType) { - getApp().getHashedObjectStore ().store (hotACCOUNT_NODE, mLedgerSeq, nodeData, nodeHash); + getApp().getNodeStore ().store (hotACCOUNT_NODE, mLedgerSeq, nodeData, nodeHash); } bool AccountStateSF::haveNode (SHAMapNode const& id, @@ -96,7 +96,7 @@ void TransactionStateSF::gotNode (bool fromFilter, Blob const& nodeData, SHAMapTreeNode::TNType type) { - getApp().getHashedObjectStore ().store ( + getApp().getNodeStore ().store ( (type == SHAMapTreeNode::tnTRANSACTION_NM) ? hotTRANSACTION : hotTRANSACTION_NODE, mLedgerSeq, nodeData,