diff options
| author | Dan Engelbrecht <[email protected]> | 2023-06-12 22:24:13 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-06-12 22:24:13 +0200 |
| commit | 32868966b705f2a4a72dbc7c427587b3717b758d (patch) | |
| tree | 286a2eb19bb599f268bb07457703ec771eb78667 /src | |
| parent | fix jupiter access token for oplog upload (#330) (diff) | |
| download | zen-32868966b705f2a4a72dbc7c427587b3717b758d.tar.xz zen-32868966b705f2a4a72dbc7c427587b3717b758d.zip | |
add oplog snapshot command (#331)
* add zen oplog-snapshot command line tool
* changelog
Diffstat (limited to 'src')
| -rw-r--r-- | src/zen/cmds/projectstore.cpp | 73 | ||||
| -rw-r--r-- | src/zen/cmds/projectstore.h | 16 | ||||
| -rw-r--r-- | src/zen/zen.cpp | 2 |
3 files changed, 91 insertions, 0 deletions
diff --git a/src/zen/cmds/projectstore.cpp b/src/zen/cmds/projectstore.cpp index e95b230b8..cca155e19 100644 --- a/src/zen/cmds/projectstore.cpp +++ b/src/zen/cmds/projectstore.cpp @@ -844,6 +844,77 @@ ImportOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** arg return MapHttpToCommandReturnCode(Response); } +//////////////////////////// + +SnapshotOplogCommand::SnapshotOplogCommand() +{ + m_Options.add_options()("h,help", "Print help"); + m_Options.add_option("", "u", "hosturl", "Host URL", cxxopts::value(m_HostName)->default_value(""), "<hosturl>"); + m_Options.add_option("", "p", "project", "Project name", cxxopts::value(m_ProjectName), "<projectid>"); + m_Options.add_option("", "o", "oplog", "Oplog name", cxxopts::value(m_OplogName), "<oplogid>"); + + m_Options.parse_positional({"project", "oplog"}); +} + +SnapshotOplogCommand::~SnapshotOplogCommand() +{ +} + +int +SnapshotOplogCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) +{ + using namespace std::literals; + + ZEN_UNUSED(GlobalOptions); + + if (!ParseOptions(argc, argv)) + { + return 0; + } + + m_HostName = ResolveTargetHostSpec(m_HostName); + + if (m_HostName.empty()) + { + throw zen::OptionParseException("unable to resolve server specification"); + } + + if (m_ProjectName.empty()) + { + ZEN_ERROR("Project name must be given"); + return 1; + } + + if (m_OplogName.empty()) + { + ZEN_ERROR("Oplog name must be given"); + return 1; + } + + cpr::Session Session; + + const std::string TargetUrlBase = fmt::format("{}/prj", m_HostName); + + Session.SetUrl(fmt::format("{}/{}/oplog/{}/rpc", TargetUrlBase, m_ProjectName, m_OplogName)); + Session.SetHeader( + {{"Accept", "application/json"}, {"Content-Type", std::string(zen::MapContentTypeToString(zen::HttpContentType::kCbObject))}}); + + zen::CbObjectWriter Writer; + Writer.AddString("method"sv, "snapshot"sv); + + zen::BinaryWriter MemOut; + Writer.Save(MemOut); + Session.SetBody(cpr::Body{(const char*)MemOut.GetData(), MemOut.GetSize()}); + + ZEN_CONSOLE("Snapshotting oplog '{}/{}' to {}", m_ProjectName, m_OplogName, m_HostName); + cpr::Response Response = Session.Post(); + + ZEN_CONSOLE("{}", FormatHttpResponse(Response)); + return MapHttpToCommandReturnCode(Response); +} + +//////////////////////////// + ProjectStatsCommand::ProjectStatsCommand() { m_Options.add_options()("h,help", "Print help"); @@ -896,6 +967,8 @@ ProjectStatsCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** ar return 1; } +//////////////////////////// + ProjectDetailsCommand::ProjectDetailsCommand() { m_Options.add_options()("h,help", "Print help"); diff --git a/src/zen/cmds/projectstore.h b/src/zen/cmds/projectstore.h index 10927a546..2327285b8 100644 --- a/src/zen/cmds/projectstore.h +++ b/src/zen/cmds/projectstore.h @@ -146,6 +146,22 @@ private: std::string m_FileName; }; +class SnapshotOplogCommand : public ZenCmdBase +{ +public: + SnapshotOplogCommand(); + ~SnapshotOplogCommand(); + + virtual int Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) override; + virtual cxxopts::Options& Options() override { return m_Options; } + +private: + cxxopts::Options m_Options{"oplog-snapshot", "Snapshot external file references in project store oplog into zen"}; + std::string m_HostName; + std::string m_ProjectName; + std::string m_OplogName; +}; + class ProjectStatsCommand : public ZenCmdBase { public: diff --git a/src/zen/zen.cpp b/src/zen/zen.cpp index 51f030e25..464b2817c 100644 --- a/src/zen/zen.cpp +++ b/src/zen/zen.cpp @@ -207,6 +207,7 @@ main(int argc, char** argv) RpcStartRecordingCommand RpcStartRecordingCmd; RpcStopRecordingCommand RpcStopRecordingCmd; ScrubCommand ScrubCmd; + SnapshotOplogCommand SnapshotOplogCmd; StatusCommand StatusCmd; TopCommand TopCmd; UpCommand UpCmd; @@ -249,6 +250,7 @@ main(int argc, char** argv) {"rpc-record-start", &RpcStartRecordingCmd, "Replays a previously recorded session of rpc requests"}, {"rpc-record-stop", &RpcStopRecordingCmd, "Starts recording of cache rpc requests on a host"}, {"scrub", &ScrubCmd, "Scrub zen storage (verify data integrity)"}, + {"oplog-snapshot", &SnapshotOplogCmd, "Snapshot project store oplog"}, {"status", &StatusCmd, "Show zen status"}, {"top", &TopCmd, "Monitor zen server activity"}, {"up", &UpCmd, "Bring zen server up"}, |