aboutsummaryrefslogtreecommitdiff
path: root/src/zen/cmds/up_cmd.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2024-08-27 17:07:11 +0200
committerGitHub Enterprise <[email protected]>2024-08-27 17:07:11 +0200
commitba16864865dbbb3f69783d210b4f07f599906a73 (patch)
tree17efb792f14f5fc8df7831593ab4d764e6617193 /src/zen/cmds/up_cmd.cpp
parentMake sure `noexcept` functions does not leak exceptions (#136) (diff)
downloadarchived-zen-ba16864865dbbb3f69783d210b4f07f599906a73.tar.xz
archived-zen-ba16864865dbbb3f69783d210b4f07f599906a73.zip
zenserver process launch/termination improvements (#138)
* zenserver process launch/termination improvements * fix GetPidStatus to return error code on Linux * fix linux FindProcess() * cleanup IsZombieProcess
Diffstat (limited to 'src/zen/cmds/up_cmd.cpp')
-rw-r--r--src/zen/cmds/up_cmd.cpp80
1 files changed, 62 insertions, 18 deletions
diff --git a/src/zen/cmds/up_cmd.cpp b/src/zen/cmds/up_cmd.cpp
index 5344a078d..c65dc5d5a 100644
--- a/src/zen/cmds/up_cmd.cpp
+++ b/src/zen/cmds/up_cmd.cpp
@@ -17,13 +17,15 @@ namespace zen {
UpCommand::UpCommand()
{
m_Options.add_option("", "p", "port", "Host port", cxxopts::value(m_Port)->default_value("0"), "<hostport>");
- m_Options.add_option("lifetime",
- "",
- "owner-pid",
- "Specify owning process id",
- cxxopts::value(m_OwnerPid)->default_value("0"),
- "<identifier>");
m_Options.add_option("", "b", "base-dir", "Parent folder of server executable", cxxopts::value(m_ProgramBaseDir), "<directory>");
+ m_Options
+ .add_option("", "c", "show-console", "Open a console window for the zenserver process", cxxopts::value(m_ShowConsole), "<console>");
+ m_Options.add_option("",
+ "l",
+ "show-log",
+ "Show the output log of the zenserver process after successful start",
+ cxxopts::value(m_ShowLog),
+ "<showlog>");
}
UpCommand::~UpCommand() = default;
@@ -31,6 +33,8 @@ UpCommand::~UpCommand() = default;
int
UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
+ using namespace std::literals;
+
ZEN_UNUSED(GlobalOptions);
if (!ParseOptions(argc, argv))
@@ -38,6 +42,11 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
return 0;
}
+ if (m_ShowConsole && m_ShowLog)
+ {
+ throw OptionParseException("--show-console can not be used in combination with --show-log");
+ }
+
{
ZenServerState State;
if (State.InitializeReadOnly())
@@ -76,11 +85,12 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
ZenServerEnvironment ServerEnvironment;
ServerEnvironment.Initialize(m_ProgramBaseDir);
ZenServerInstance Server(ServerEnvironment);
- if (m_OwnerPid != 0)
+ std::string ServerArguments = GlobalOptions.PassthroughCommandLine;
+ if ((m_Port != 0) && (ServerArguments.find("--port"sv) == std::string::npos))
{
- Server.SetOwnerPid(m_OwnerPid);
+ ServerArguments.append(fmt::format(" --port {}", m_Port));
}
- Server.SpawnServer(m_Port, GlobalOptions.PassthroughCommandLine);
+ Server.SpawnServer(ServerArguments, m_ShowConsole, /*WaitTimeoutMs*/ 0);
int Timeout = 10000;
@@ -90,15 +100,29 @@ UpCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
{
ZEN_ERROR("zen server launch failed (timed out), terminating");
Server.Terminate();
+ if (!m_ShowConsole)
+ {
+ ZEN_CONSOLE("{}", Server.GetLogOutput());
+ }
return 111;
}
int ReturnCode = Server.Shutdown();
- ZEN_CONSOLE("{}", Server.GetLogOutput());
+ if (!m_ShowConsole)
+ {
+ ZEN_CONSOLE("{}", Server.GetLogOutput());
+ }
return ReturnCode;
}
else
{
- ZEN_CONSOLE("zen server up");
+ if (m_ShowLog)
+ {
+ ZEN_CONSOLE("{}", Server.GetLogOutput());
+ }
+ else
+ {
+ ZEN_CONSOLE("zen server up");
+ }
}
return 0;
}
@@ -225,11 +249,30 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
ZEN_CONSOLE("attached to server on port {} (pid {}), requesting shutdown", EntryPort, ServerProcessPid);
- Server.Shutdown();
-
- ZEN_CONSOLE("shutdown complete");
-
- return 0;
+ std::error_code Ec;
+ if (Server.SignalShutdown(Ec) && !Ec)
+ {
+ Stopwatch Timer;
+ while (Timer.GetElapsedTimeMs() < 10000)
+ {
+ if (Server.WaitUntilExited(100, Ec) && !Ec)
+ {
+ ZEN_CONSOLE("shutdown complete");
+ return 0;
+ }
+ else if (Ec)
+ {
+ ZEN_CONSOLE("Waiting for server on port {} (pid {}) failed. Reason: '{}'",
+ EntryPort,
+ ServerProcessPid,
+ Ec.message());
+ }
+ }
+ }
+ else if (Ec)
+ {
+ ZEN_CONSOLE("requesting shutdown of server on port {} failed. Reason: '{}'", EntryPort, Ec.message());
+ }
}
catch (const std::exception& Ex)
{
@@ -240,11 +283,11 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
// handle to determine when the server has shut down. Thus we signal that we would like
// a shutdown via the shutdown flag and the check if the entry is still running.
- ZEN_CONSOLE("requesting shutdown of server on port {}", EntryPort);
+ ZEN_CONSOLE("requesting detached shutdown of server on port {}", EntryPort);
Entry->SignalShutdownRequest();
Stopwatch Timer;
- while (Timer.GetElapsedTimeMs() < 5000)
+ while (Timer.GetElapsedTimeMs() < 10000)
{
Instance.Sweep();
Entry = Instance.Lookup(EntryPort);
@@ -261,6 +304,7 @@ DownCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv)
Sleep(100);
}
}
+
if (m_ForceTerminate)
{
// Try to find the running executable by path name