aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2023-06-12 22:24:13 +0200
committerGitHub <[email protected]>2023-06-12 22:24:13 +0200
commit32868966b705f2a4a72dbc7c427587b3717b758d (patch)
tree286a2eb19bb599f268bb07457703ec771eb78667 /src
parentfix jupiter access token for oplog upload (#330) (diff)
downloadzen-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.cpp73
-rw-r--r--src/zen/cmds/projectstore.h16
-rw-r--r--src/zen/zen.cpp2
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"},