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,