mirror of
https://github.com/XTXMarkets/ternfs.git
synced 2025-12-30 23:39:46 -06:00
91 lines
4.0 KiB
C++
91 lines
4.0 KiB
C++
#include <cstdint>
|
|
#include <cstdio>
|
|
#include <string>
|
|
|
|
#include "ShardDB.hpp"
|
|
#include "ShardDBTools.hpp"
|
|
#include "CDCDBTools.hpp"
|
|
|
|
#define die(...) do { fprintf(stderr, __VA_ARGS__); exit(1); } while(false)
|
|
|
|
static void usage(const char* binary) {
|
|
fprintf(stderr, "Usage: %s COMMAND ARGS\n\n", binary);
|
|
fprintf(stderr, "Commands:\n");
|
|
fprintf(stderr, " verify-equal DB1_PATH DB2_PATH\n");
|
|
fprintf(stderr, " Verifies two databases are the same.\n");
|
|
fprintf(stderr, " unreleased-state DB_PATH\n");
|
|
fprintf(stderr, " Outputs state of unreleased entries in DB.\n");
|
|
fprintf(stderr, " fsck DB_PATH\n");
|
|
fprintf(stderr, " Performs various integrity checks on the RocksDB state. The RocksDB database will be opened as read only.\n");
|
|
fprintf(stderr, " shard-log-entries DB_PATH START_LOG_IDX ENTRY_COUNT\n");
|
|
fprintf(stderr, " Outputs entries from distributed log. The RocksDB database will be opened as read only.\n");
|
|
fprintf(stderr, " cdc-log-entries DB_PATH START_LOG_IDX ENTRY_COUNT\n");
|
|
fprintf(stderr, " Outputs entries from distributed log. The RocksDB database will be opened as read only.\n");
|
|
fprintf(stderr, " sample-files DB_PATH OUTPUT_FILE_PATH\n");
|
|
fprintf(stderr, " Outputs per directory usage statistics in binary format. The RocksDB database will be opened as read only.\n");
|
|
fprintf(stderr, " find-failure-domain-duplicates DB_PATH OUTPUT_FILE_PATH\n");
|
|
fprintf(stderr, " Outputs files with spans that have duplicate failure domain, along with how many failure domain failures they can tolerate.\n");
|
|
fprintf(stderr, " block-service-usage DB_PATH OUTPUT_FILE_PATH\n");
|
|
fprintf(stderr, " Aggregates expected block usage per block service\n");
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
const auto dieWithUsage = [&argv]() {
|
|
usage(argv[0]);
|
|
exit(2);
|
|
};
|
|
if (argc == 1) {
|
|
dieWithUsage();
|
|
}
|
|
|
|
for (int i = 1; i < argc; i++) {
|
|
const auto getNextArg = [argc, &argv, &dieWithUsage, &i]() {
|
|
if (i+1 >= argc) {
|
|
fprintf(stderr, "Argument list ended too early.\n\n");
|
|
dieWithUsage();
|
|
}
|
|
std::string arg(argv[i+1]);
|
|
i++;
|
|
return arg;
|
|
};
|
|
std::string arg = argv[i];
|
|
if (arg == "verify-equal") {
|
|
std::string db1Path = getNextArg();
|
|
std::string db2Path = getNextArg();
|
|
ShardDBTools::verifyEqual(db1Path, db2Path);
|
|
} else if (arg == "unreleased-state") {
|
|
std::string db1Path = getNextArg();
|
|
ShardDBTools::outputUnreleasedState(db1Path);
|
|
} else if (arg == "shard-log-entries") {
|
|
std::string dbPath = getNextArg();
|
|
LogIdx startIdx = std::stoull(getNextArg());
|
|
size_t count = std::stoull(getNextArg());
|
|
ShardDBTools::outputLogEntries(dbPath, startIdx, count);
|
|
} else if (arg == "cdc-log-entries") {
|
|
std::string dbPath = getNextArg();
|
|
LogIdx startIdx = std::stoull(getNextArg());
|
|
size_t count = std::stoull(getNextArg());
|
|
CDCDBTools::outputLogEntries(dbPath, startIdx, count);
|
|
} else if (arg == "fsck") {
|
|
std::string dbPath = getNextArg();
|
|
ShardDBTools::fsck(dbPath);
|
|
} else if (arg == "sample-files") {
|
|
std::string dbPath = getNextArg();
|
|
std::string outputFilePath = getNextArg();
|
|
ShardDBTools::sampleFiles(dbPath, outputFilePath);
|
|
} else if (arg == "find-failure-domain-duplicates") {
|
|
std::string dbPath = getNextArg();
|
|
std::string outputFilePath = getNextArg();
|
|
ShardDBTools::outputFilesWithDuplicateFailureDomains(dbPath, outputFilePath);
|
|
} else if (arg == "block-service-usage") {
|
|
std::string dbPath = getNextArg();
|
|
std::string outputFilePath = getNextArg();
|
|
ShardDBTools::outputBlockServiceUsage(dbPath, outputFilePath);
|
|
} else {
|
|
dieWithUsage();
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|