ldb waldump to print the keys along with other stats + NULL to nullptr in ldb_cmd.cc
Summary: LDB tool to print the deleted/put keys in hex in the wal file. Test Plan: run ldb on a db to check if output was satisfactory Reviewers: dhruba Reviewed By: dhruba CC: leveldb Differential Revision: https://reviews.facebook.net/D8691
This commit is contained in:
parent
b2c50f1c3f
commit
9bf91c74b8
@ -2,6 +2,8 @@
|
|||||||
// Use of this source code is governed by a BSD-style license that can be
|
// Use of this source code is governed by a BSD-style license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "util/ldb_cmd.h"
|
||||||
|
|
||||||
#include <boost/algorithm/string.hpp>
|
#include <boost/algorithm/string.hpp>
|
||||||
#include <boost/lexical_cast.hpp>
|
#include <boost/lexical_cast.hpp>
|
||||||
|
|
||||||
@ -9,7 +11,6 @@
|
|||||||
#include "db/dbformat.h"
|
#include "db/dbformat.h"
|
||||||
#include "db/log_reader.h"
|
#include "db/log_reader.h"
|
||||||
#include "db/write_batch_internal.h"
|
#include "db/write_batch_internal.h"
|
||||||
#include "util/ldb_cmd.h"
|
|
||||||
|
|
||||||
namespace leveldb {
|
namespace leveldb {
|
||||||
|
|
||||||
@ -46,7 +47,7 @@ LDBCommand* LDBCommand::InitFromCmdLineArgs(int argc, char** argv) {
|
|||||||
* COMMAND <PARAM1> <PARAM2> ... [-cmdSpecificOpt1=cmdSpecificOpt1Val] ..
|
* COMMAND <PARAM1> <PARAM2> ... [-cmdSpecificOpt1=cmdSpecificOpt1Val] ..
|
||||||
* This is similar to the command line format used by HBaseClientTool.
|
* This is similar to the command line format used by HBaseClientTool.
|
||||||
* Command name is not included in args.
|
* Command name is not included in args.
|
||||||
* Returns NULL if the command-line cannot be parsed.
|
* Returns nullptr if the command-line cannot be parsed.
|
||||||
*/
|
*/
|
||||||
LDBCommand* LDBCommand::InitFromCmdLineArgs(const vector<string>& args) {
|
LDBCommand* LDBCommand::InitFromCmdLineArgs(const vector<string>& args) {
|
||||||
// --x=y command line arguments are added as x->y map entries.
|
// --x=y command line arguments are added as x->y map entries.
|
||||||
@ -81,7 +82,7 @@ LDBCommand* LDBCommand::InitFromCmdLineArgs(const vector<string>& args) {
|
|||||||
|
|
||||||
if (cmdTokens.size() < 1) {
|
if (cmdTokens.size() < 1) {
|
||||||
fprintf(stderr, "Command not specified!");
|
fprintf(stderr, "Command not specified!");
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
string cmd = cmdTokens[0];
|
string cmd = cmdTokens[0];
|
||||||
@ -113,7 +114,7 @@ LDBCommand* LDBCommand::InitFromCmdLineArgs(const vector<string>& args) {
|
|||||||
return new DBLoaderCommand(cmdParams, options, flags);
|
return new DBLoaderCommand(cmdParams, options, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -306,8 +307,8 @@ void CompactorCommand::Help(string& ret) {
|
|||||||
|
|
||||||
void CompactorCommand::DoCommand() {
|
void CompactorCommand::DoCommand() {
|
||||||
|
|
||||||
leveldb::Slice* begin = NULL;
|
leveldb::Slice* begin = nullptr;
|
||||||
leveldb::Slice* end = NULL;
|
leveldb::Slice* end = nullptr;
|
||||||
if (!null_from_) {
|
if (!null_from_) {
|
||||||
begin = new leveldb::Slice(from_);
|
begin = new leveldb::Slice(from_);
|
||||||
}
|
}
|
||||||
@ -601,7 +602,7 @@ void ReduceDBLevelsCommand::DoCommand() {
|
|||||||
}
|
}
|
||||||
// Compact the whole DB to put all files to the highest level.
|
// Compact the whole DB to put all files to the highest level.
|
||||||
fprintf(stdout, "Compacting the db...\n");
|
fprintf(stdout, "Compacting the db...\n");
|
||||||
db_->CompactRange(NULL, NULL);
|
db_->CompactRange(nullptr, nullptr);
|
||||||
CloseDB();
|
CloseDB();
|
||||||
|
|
||||||
TableCache* tc = new TableCache(db_path_, &opt, 10);
|
TableCache* tc = new TableCache(db_path_, &opt, 10);
|
||||||
@ -629,14 +630,39 @@ void ReduceDBLevelsCommand::DoCommand() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class InMemoryHandler : public WriteBatch::Handler {
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual void Put(const Slice& key, const Slice& value) {
|
||||||
|
putMap_[key.ToString()] = value.ToString();
|
||||||
|
}
|
||||||
|
virtual void Delete(const Slice& key) {
|
||||||
|
deleteList_.push_back(key.ToString(true));
|
||||||
|
}
|
||||||
|
virtual ~InMemoryHandler() { };
|
||||||
|
|
||||||
|
map<string, string> PutMap() {
|
||||||
|
return putMap_;
|
||||||
|
}
|
||||||
|
vector<string> DeleteList() {
|
||||||
|
return deleteList_;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::map<string, string> putMap_;
|
||||||
|
std::vector<string> deleteList_;
|
||||||
|
};
|
||||||
|
|
||||||
const string WALDumperCommand::ARG_WAL_FILE = "walfile";
|
const string WALDumperCommand::ARG_WAL_FILE = "walfile";
|
||||||
|
const string WALDumperCommand::ARG_PRINT_VALUE = "print_value";
|
||||||
const string WALDumperCommand::ARG_PRINT_HEADER = "header";
|
const string WALDumperCommand::ARG_PRINT_HEADER = "header";
|
||||||
|
|
||||||
WALDumperCommand::WALDumperCommand(const vector<string>& params,
|
WALDumperCommand::WALDumperCommand(const vector<string>& params,
|
||||||
const map<string, string>& options, const vector<string>& flags) :
|
const map<string, string>& options, const vector<string>& flags) :
|
||||||
LDBCommand(options, flags, true,
|
LDBCommand(options, flags, true,
|
||||||
BuildCmdLineOptions({ARG_WAL_FILE, ARG_PRINT_HEADER})),
|
BuildCmdLineOptions(
|
||||||
print_header_(false) {
|
{ARG_WAL_FILE, ARG_PRINT_HEADER, ARG_PRINT_VALUE})),
|
||||||
|
print_header_(false), print_values_(false) {
|
||||||
|
|
||||||
wal_file_.clear();
|
wal_file_.clear();
|
||||||
|
|
||||||
@ -645,8 +671,9 @@ WALDumperCommand::WALDumperCommand(const vector<string>& params,
|
|||||||
wal_file_ = itr->second;
|
wal_file_ = itr->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
print_header_ = IsFlagPresent(flags, ARG_PRINT_HEADER);
|
|
||||||
|
|
||||||
|
print_header_ = IsFlagPresent(flags, ARG_PRINT_HEADER);
|
||||||
|
print_values_ = IsFlagPresent(flags, ARG_PRINT_VALUE);
|
||||||
if (wal_file_.empty()) {
|
if (wal_file_.empty()) {
|
||||||
exec_state_ = LDBCommandExecuteResult::FAILED(
|
exec_state_ = LDBCommandExecuteResult::FAILED(
|
||||||
"Argument " + ARG_WAL_FILE + " must be specified.");
|
"Argument " + ARG_WAL_FILE + " must be specified.");
|
||||||
@ -658,6 +685,7 @@ void WALDumperCommand::Help(string& ret) {
|
|||||||
ret.append(WALDumperCommand::Name());
|
ret.append(WALDumperCommand::Name());
|
||||||
ret.append(" --" + ARG_WAL_FILE + "=<write_ahead_log_file_path>");
|
ret.append(" --" + ARG_WAL_FILE + "=<write_ahead_log_file_path>");
|
||||||
ret.append(" --[" + ARG_PRINT_HEADER + "] ");
|
ret.append(" --[" + ARG_PRINT_HEADER + "] ");
|
||||||
|
ret.append(" --[ " + ARG_PRINT_VALUE + "] ");
|
||||||
ret.append("\n");
|
ret.append("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -682,7 +710,11 @@ void WALDumperCommand::DoCommand() {
|
|||||||
Slice record;
|
Slice record;
|
||||||
std::stringstream row;
|
std::stringstream row;
|
||||||
if (print_header_) {
|
if (print_header_) {
|
||||||
std::cout<<"Sequence,Count,ByteSize,Physical Offset\n";
|
std::cout<<"Sequence,Count,ByteSize,Physical Offset,Key(s)";
|
||||||
|
if (print_values_) {
|
||||||
|
std::cout << " : value ";
|
||||||
|
}
|
||||||
|
std::cout << "\n";
|
||||||
}
|
}
|
||||||
while(reader.ReadRecord(&record, &scratch)) {
|
while(reader.ReadRecord(&record, &scratch)) {
|
||||||
row.str("");
|
row.str("");
|
||||||
@ -694,7 +726,28 @@ void WALDumperCommand::DoCommand() {
|
|||||||
row<<WriteBatchInternal::Sequence(&batch)<<",";
|
row<<WriteBatchInternal::Sequence(&batch)<<",";
|
||||||
row<<WriteBatchInternal::Count(&batch)<<",";
|
row<<WriteBatchInternal::Count(&batch)<<",";
|
||||||
row<<WriteBatchInternal::ByteSize(&batch)<<",";
|
row<<WriteBatchInternal::ByteSize(&batch)<<",";
|
||||||
row<<reader.LastRecordOffset()<<"\n";
|
row<<reader.LastRecordOffset()<<",";
|
||||||
|
InMemoryHandler handler;
|
||||||
|
batch.Iterate(&handler);
|
||||||
|
row << "PUT : ";
|
||||||
|
if (print_values_) {
|
||||||
|
for (auto& kv : handler.PutMap()) {
|
||||||
|
std::string k = StringToHex(kv.first);
|
||||||
|
std::string v = StringToHex(kv.second);
|
||||||
|
row << k << " : ";
|
||||||
|
row << v << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for(auto& kv : handler.PutMap()) {
|
||||||
|
row << StringToHex(kv.first) << " ";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
row<<",DELETE : ";
|
||||||
|
for(string& s : handler.DeleteList()) {
|
||||||
|
row << StringToHex(s) << " ";
|
||||||
|
}
|
||||||
|
row<<"\n";
|
||||||
}
|
}
|
||||||
std::cout<<row.str();
|
std::cout<<row.str();
|
||||||
}
|
}
|
||||||
|
@ -424,9 +424,11 @@ public:
|
|||||||
private:
|
private:
|
||||||
bool print_header_;
|
bool print_header_;
|
||||||
string wal_file_;
|
string wal_file_;
|
||||||
|
bool print_values_;
|
||||||
|
|
||||||
static const string ARG_WAL_FILE;
|
static const string ARG_WAL_FILE;
|
||||||
static const string ARG_PRINT_HEADER;
|
static const string ARG_PRINT_HEADER;
|
||||||
|
static const string ARG_PRINT_VALUE;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user