Improved diagnostic for RocksDB error codes

Conflicts:
	Builds/VisualStudio2012/RippleD.vcxproj.filters
This commit is contained in:
Vinnie Falco
2014-01-06 20:52:27 -08:00
parent 3c7fc31c95
commit 4b1155bf32
22 changed files with 85 additions and 38 deletions

View File

@@ -105,10 +105,12 @@ class Status {
kIncomplete = 7
};
public:
Code code() const {
return (state_ == nullptr) ? kOk : static_cast<Code>(state_[4]);
}
private:
Status(Code code, const Slice& msg, const Slice& msg2);
static const char* CopyState(const char* s);
};

View File

@@ -127,7 +127,8 @@ public:
, m_nodeStoreScheduler (*m_jobQueue, *m_jobQueue)
, m_nodeStore (NodeStore::Database::New ("NodeStore.main", m_nodeStoreScheduler,
getConfig ().nodeDatabase, getConfig ().ephemeralNodeDatabase))
LogPartition::getJournal <NodeObject> (),
getConfig ().nodeDatabase, getConfig ().ephemeralNodeDatabase))
, m_sntpClient (SNTPClient::New (*this))
@@ -1246,7 +1247,8 @@ void ApplicationImp::updateTables ()
{
NodeStore::DummyScheduler scheduler;
ScopedPointer <NodeStore::Database> source (NodeStore::Database::New (
"NodeStore.import", scheduler, getConfig ().importNodeDatabase));
"NodeStore.import", scheduler, LogPartition::getJournal <NodeObject> (),
getConfig ().importNodeDatabase));
WriteLog (lsWARNING, NodeObject) <<
"Node import from '" << source->getName () << "' to '"

View File

@@ -245,7 +245,8 @@ String SqliteFactory::getName () const
NodeStore::Backend* SqliteFactory::createInstance (
size_t keyBytes,
NodeStore::Parameters const& keyValues,
NodeStore::Scheduler& scheduler)
NodeStore::Scheduler& scheduler,
Journal)
{
return new BackendImp (keyBytes, keyValues ["path"].toStdString (), scheduler);
}

View File

@@ -39,7 +39,8 @@ public:
NodeStore::Backend* createInstance (size_t keyBytes,
NodeStore::Parameters const& keyValues,
NodeStore::Scheduler& scheduler);
NodeStore::Scheduler& scheduler,
Journal journal);
};
#endif

View File

@@ -64,6 +64,7 @@ public:
*/
static Database* New (char const* name,
Scheduler& scheduler,
Journal journal,
Parameters const& backendParameters,
Parameters fastBackendParameters = Parameters ());

View File

@@ -42,7 +42,8 @@ public:
*/
virtual Backend* createInstance (size_t keyBytes,
Parameters const& parameters,
Scheduler& scheduler) = 0;
Scheduler& scheduler,
Journal journal) = 0;
};
}

View File

@@ -37,7 +37,9 @@ enum Status
ok,
notFound,
dataCorrupt,
unknown
unknown,
customCode = 100
};
/** A batch of NodeObjects to write at once. */

View File

@@ -249,7 +249,8 @@ String HyperDBFactory::getName () const
Backend* HyperDBFactory::createInstance (
size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler)
Scheduler& scheduler,
Journal journal)
{
return new HyperDBFactory::BackendImp (keyBytes, keyValues, scheduler);
}

View File

@@ -44,7 +44,8 @@ public:
NodeStore::Backend* createInstance (size_t keyBytes,
Parameters const& keyValues,
NodeStore::Scheduler& scheduler);
NodeStore::Scheduler& scheduler,
Journal journal);
};
}

View File

@@ -184,7 +184,8 @@ String KeyvaDBFactory::getName () const
Backend* KeyvaDBFactory::createInstance (
size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler)
Scheduler& scheduler,
Journal journal)
{
return new KeyvaDBFactory::BackendImp (keyBytes, keyValues, scheduler);
}

View File

@@ -42,7 +42,8 @@ public:
Backend* createInstance (size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler);
Scheduler& scheduler,
Journal journal);
};
}

View File

@@ -258,7 +258,8 @@ String LevelDBFactory::getName () const
Backend* LevelDBFactory::createInstance (
size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler)
Scheduler& scheduler,
Journal journal)
{
return new LevelDBFactory::BackendImp (keyBytes, keyValues, scheduler);
}

View File

@@ -42,7 +42,8 @@ public:
Backend* createInstance (size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler);
Scheduler& scheduler,
Journal journal);
private:
void* m_lruCache;

View File

@@ -121,7 +121,8 @@ String MemoryFactory::getName () const
Backend* MemoryFactory::createInstance (
size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler)
Scheduler& scheduler,
Journal journal)
{
return new MemoryFactory::BackendImp (keyBytes, keyValues, scheduler);
}

View File

@@ -42,7 +42,8 @@ public:
Backend* createInstance (size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler);
Scheduler& scheduler,
Journal journal);
};
}

View File

@@ -86,7 +86,8 @@ String NullFactory::getName () const
Backend* NullFactory::createInstance (
size_t,
Parameters const&,
Scheduler& scheduler)
Scheduler& scheduler,
Journal journal)
{
return new NullFactory::BackendImp (scheduler);
}

View File

@@ -44,7 +44,8 @@ public:
Backend* createInstance (size_t keyBytes,
Parameters const& keyValues,
Scheduler& scheduler);
Scheduler& scheduler,
Journal journal);
};
}

View File

@@ -86,8 +86,10 @@ public:
BackendImp (int keyBytes,
Parameters const& keyValues,
Scheduler& scheduler)
: m_keyBytes (keyBytes)
Scheduler& scheduler,
Journal journal)
: m_journal (journal)
, m_keyBytes (keyBytes)
, m_scheduler (scheduler)
, m_batch (*this, scheduler)
, m_name (keyValues ["path"].toStdString ())
@@ -200,7 +202,9 @@ public:
}
else
{
status = unknown;
status = Status (customCode + getStatus.code());
m_journal.error << getStatus.ToString ();
}
}
}
@@ -285,6 +289,7 @@ public:
}
private:
Journal m_journal;
size_t const m_keyBytes;
Scheduler& m_scheduler;
BatchWriter m_batch;
@@ -323,10 +328,10 @@ public:
Backend* createInstance (
size_t keyBytes, Parameters const& keyValues,
Scheduler& scheduler)
Scheduler& scheduler, Journal journal)
{
return new RocksDBFactory::BackendImp (
keyBytes, keyValues, scheduler);
keyBytes, keyValues, scheduler, journal);
}
};

View File

@@ -28,11 +28,13 @@ public:
DatabaseImp (char const* name,
Scheduler& scheduler,
Parameters const& backendParameters,
Parameters const& fastBackendParameters)
: m_scheduler (scheduler)
, m_backend (createBackend (backendParameters, scheduler))
Parameters const& fastBackendParameters,
Journal journal)
: m_journal (journal)
, m_scheduler (scheduler)
, m_backend (createBackend (backendParameters, scheduler, journal))
, m_fastBackend ((fastBackendParameters.size () > 0)
? createBackend (fastBackendParameters, scheduler) : nullptr)
? createBackend (fastBackendParameters, scheduler, journal) : nullptr)
, m_cache ("NodeStore", 16384, 300)
{
}
@@ -259,7 +261,8 @@ public:
fatal_error ("Your rippled.cfg is missing a [node_db] entry, please see the rippled-example.cfg file!");
}
static Backend* createBackend (Parameters const& parameters, Scheduler& scheduler)
static Backend* createBackend (Parameters const& parameters,
Scheduler& scheduler, Journal journal)
{
Backend* backend = nullptr;
@@ -271,7 +274,8 @@ public:
if (factory != nullptr)
{
backend = factory->createInstance (NodeObject::keyBytes, parameters, scheduler);
backend = factory->createInstance (
NodeObject::keyBytes, parameters, scheduler, journal);
}
else
{
@@ -289,6 +293,8 @@ public:
//------------------------------------------------------------------------------
private:
Journal m_journal;
Scheduler& m_scheduler;
// Persistent key/value storage.
@@ -333,11 +339,12 @@ void Database::addAvailableBackends ()
Database* Database::New (char const* name,
Scheduler& scheduler,
Journal journal,
Parameters const& backendParameters,
Parameters fastBackendParameters)
{
return new DatabaseImp (name,
scheduler, backendParameters, fastBackendParameters);
scheduler, backendParameters, fastBackendParameters, journal);
}
}

View File

@@ -40,9 +40,12 @@ public:
Batch batch;
createPredictableBatch (batch, 0, numObjectsToTest, seedValue);
Journal j ((journal ()));
{
// Open the backend
ScopedPointer <Backend> backend (DatabaseImp::createBackend (params, scheduler));
ScopedPointer <Backend> backend (DatabaseImp::createBackend (
params, scheduler, j));
// Write the batch
storeBatch (*backend, batch);
@@ -65,7 +68,8 @@ public:
{
// Re-open the backend
ScopedPointer <Backend> backend (DatabaseImp::createBackend (params, scheduler));
ScopedPointer <Backend> backend (DatabaseImp::createBackend (
params, scheduler, j));
// Read it back in
Batch copy;

View File

@@ -47,9 +47,12 @@ public:
Batch batch;
createPredictableBatch (batch, 0, numObjectsToTest, seedValue);
Journal j ((journal ()));
// Write to source db
{
ScopedPointer <Database> src (Database::New ("test", scheduler, srcParams));
ScopedPointer <Database> src (Database::New (
"test", scheduler, j, srcParams));
storeBatch (*src, batch);
}
@@ -57,7 +60,8 @@ public:
{
// Re-open the db
ScopedPointer <Database> src (Database::New ("test", scheduler, srcParams));
ScopedPointer <Database> src (Database::New (
"test", scheduler, j, srcParams));
// Set up the destination database
File const dest_db (File::createTempFile ("dest_db"));
@@ -65,7 +69,8 @@ public:
destParams.set ("type", destBackendType);
destParams.set ("path", dest_db.getFullPathName ());
ScopedPointer <Database> dest (Database::New ("test", scheduler, destParams));
ScopedPointer <Database> dest (Database::New (
"test", scheduler, j, destParams));
beginTestCase (String ("import into '") + destBackendType + "' from '" + srcBackendType + "'");
@@ -80,7 +85,6 @@ public:
std::sort (batch.begin (), batch.end (), NodeObject::LessThan ());
std::sort (copy.begin (), copy.end (), NodeObject::LessThan ());
expect (areBatchesEqual (batch, copy), "Should be equal");
}
//--------------------------------------------------------------------------
@@ -117,9 +121,12 @@ public:
Batch batch;
createPredictableBatch (batch, 0, numObjectsToTest, seedValue);
Journal j ((journal ()));
{
// Open the database
ScopedPointer <Database> db (Database::New ("test", scheduler, nodeParams, tempParams));
ScopedPointer <Database> db (Database::New ("test", scheduler,
j, nodeParams, tempParams));
// Write the batch
storeBatch (*db, batch);
@@ -144,7 +151,8 @@ public:
{
{
// Re-open the database without the ephemeral DB
ScopedPointer <Database> db (Database::New ("test", scheduler, nodeParams));
ScopedPointer <Database> db (Database::New (
"test", scheduler, j, nodeParams));
// Read it back in
Batch copy;
@@ -160,7 +168,7 @@ public:
{
// Verify the ephemeral db
ScopedPointer <Database> db (Database::New ("test",
scheduler, tempParams, StringPairArray ()));
scheduler, j, tempParams, StringPairArray ()));
// Read it back in
Batch copy;

View File

@@ -77,8 +77,11 @@ public:
NodeStore::Batch batch2;
createPredictableBatch (batch2, 0, numObjectsToTest, seedValue);
Journal j ((journal ()));
// Open the backend
ScopedPointer <Backend> backend (DatabaseImp::createBackend (params, scheduler));
ScopedPointer <Backend> backend (DatabaseImp::createBackend (
params, scheduler, j));
Stopwatch t;