2021-03-16 11:44:43 +00:00
|
|
|
#include <Poco/ConsoleChannel.h>
|
|
|
|
#include <Poco/Logger.h>
|
2021-03-29 09:16:58 +00:00
|
|
|
#include <Coordination/KeeperStateMachine.h>
|
2021-03-16 11:44:43 +00:00
|
|
|
#include <Common/ZooKeeper/ZooKeeperCommon.h>
|
|
|
|
#include <Common/ZooKeeper/ZooKeeperIO.h>
|
|
|
|
#include <Common/Exception.h>
|
2021-11-02 11:41:30 +00:00
|
|
|
#include <libnuraft/nuraft.hxx>
|
2021-03-29 09:16:58 +00:00
|
|
|
#include <Coordination/KeeperLogStore.h>
|
2021-03-16 11:44:43 +00:00
|
|
|
#include <Coordination/Changelog.h>
|
2022-04-27 15:05:45 +00:00
|
|
|
#include <Common/logger_useful.h>
|
2023-05-24 09:46:07 +00:00
|
|
|
#include <Disks/DiskLocal.h>
|
2021-03-16 11:44:43 +00:00
|
|
|
|
|
|
|
using namespace Coordination;
|
|
|
|
using namespace DB;
|
|
|
|
|
2021-03-29 09:16:58 +00:00
|
|
|
void dumpMachine(std::shared_ptr<KeeperStateMachine> machine)
|
2021-03-16 11:44:43 +00:00
|
|
|
{
|
|
|
|
auto & storage = machine->getStorage();
|
|
|
|
std::queue<std::string> keys;
|
|
|
|
keys.push("/");
|
|
|
|
|
|
|
|
while (!keys.empty())
|
|
|
|
{
|
|
|
|
auto key = keys.front();
|
|
|
|
keys.pop();
|
|
|
|
std::cout << key << "\n";
|
2021-03-16 12:37:46 +00:00
|
|
|
auto value = storage.container.getValue(key);
|
2021-03-16 11:44:43 +00:00
|
|
|
std::cout << "\tStat: {version: " << value.stat.version <<
|
|
|
|
", mtime: " << value.stat.mtime <<
|
|
|
|
", emphemeralOwner: " << value.stat.ephemeralOwner <<
|
|
|
|
", czxid: " << value.stat.czxid <<
|
|
|
|
", mzxid: " << value.stat.mzxid <<
|
|
|
|
", numChildren: " << value.stat.numChildren <<
|
|
|
|
", dataLength: " << value.stat.dataLength <<
|
|
|
|
"}" << std::endl;
|
2022-04-06 07:43:48 +00:00
|
|
|
std::cout << "\tData: " << storage.container.getValue(key).getData() << std::endl;
|
2021-03-16 11:44:43 +00:00
|
|
|
|
2022-04-06 07:43:48 +00:00
|
|
|
for (const auto & child : value.getChildren())
|
2021-03-16 11:44:43 +00:00
|
|
|
{
|
|
|
|
if (key == "/")
|
2022-01-24 10:23:58 +00:00
|
|
|
keys.push(key + child.toString());
|
2021-03-16 11:44:43 +00:00
|
|
|
else
|
2022-01-24 10:23:58 +00:00
|
|
|
keys.push(key + "/" + child.toString());
|
2021-03-16 11:44:43 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
std::cout << std::flush;
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
|
|
{
|
|
|
|
if (argc != 3)
|
|
|
|
{
|
|
|
|
std::cerr << "usage: " << argv[0] << " snapshotpath logpath" << std::endl;
|
|
|
|
return 3;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Poco::AutoPtr<Poco::ConsoleChannel> channel(new Poco::ConsoleChannel(std::cerr));
|
|
|
|
Poco::Logger::root().setChannel(channel);
|
|
|
|
Poco::Logger::root().setLevel("trace");
|
|
|
|
}
|
2021-03-30 07:45:51 +00:00
|
|
|
auto * logger = &Poco::Logger::get("keeper-dumper");
|
2021-10-08 08:48:08 +00:00
|
|
|
ResponsesQueue queue(std::numeric_limits<size_t>::max());
|
2021-03-16 11:44:43 +00:00
|
|
|
SnapshotsQueue snapshots_queue{1};
|
|
|
|
CoordinationSettingsPtr settings = std::make_shared<CoordinationSettings>();
|
2023-05-24 09:46:07 +00:00
|
|
|
KeeperContextPtr keeper_context = std::make_shared<DB::KeeperContext>(true);
|
2023-07-06 23:41:36 +00:00
|
|
|
keeper_context->setLogDisk(std::make_shared<DB::DiskLocal>("LogDisk", argv[2]));
|
|
|
|
keeper_context->setSnapshotDisk(std::make_shared<DB::DiskLocal>("LogDisk", argv[1]));
|
2023-05-24 09:46:07 +00:00
|
|
|
|
|
|
|
auto state_machine = std::make_shared<KeeperStateMachine>(queue, snapshots_queue, settings, keeper_context, nullptr);
|
2021-03-16 11:44:43 +00:00
|
|
|
state_machine->init();
|
|
|
|
size_t last_commited_index = state_machine->last_commit_index();
|
|
|
|
|
2021-03-23 07:28:14 +00:00
|
|
|
LOG_INFO(logger, "Last committed index: {}", last_commited_index);
|
2021-03-16 11:44:43 +00:00
|
|
|
|
2023-02-01 12:28:44 +00:00
|
|
|
DB::KeeperLogStore changelog(
|
2023-05-24 09:46:07 +00:00
|
|
|
LogFileSettings{.force_sync = true, .compress_logs = settings->compress_logs, .rotate_interval = 10000000}, keeper_context);
|
2021-03-16 11:44:43 +00:00
|
|
|
changelog.init(last_commited_index, 10000000000UL); /// collect all logs
|
|
|
|
if (changelog.size() == 0)
|
|
|
|
LOG_INFO(logger, "Changelog empty");
|
|
|
|
else
|
|
|
|
LOG_INFO(logger, "Last changelog entry {}", changelog.next_slot() - 1);
|
|
|
|
|
|
|
|
for (size_t i = last_commited_index + 1; i < changelog.next_slot(); ++i)
|
|
|
|
{
|
|
|
|
if (changelog.entry_at(i)->get_val_type() == nuraft::log_val_type::app_log)
|
2022-11-02 18:26:50 +00:00
|
|
|
{
|
|
|
|
state_machine->pre_commit(i, changelog.entry_at(i)->get_buf());
|
2021-03-16 11:44:43 +00:00
|
|
|
state_machine->commit(i, changelog.entry_at(i)->get_buf());
|
2022-11-02 18:26:50 +00:00
|
|
|
}
|
2021-03-16 11:44:43 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
dumpMachine(state_machine);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|