diff options
| author | Dan Engelbrecht <[email protected]> | 2024-04-18 12:44:26 +0200 |
|---|---|---|
| committer | GitHub Enterprise <[email protected]> | 2024-04-18 12:44:26 +0200 |
| commit | 6d634ab59c05adf1ba028d95b16031a7f8e8db2a (patch) | |
| tree | 87e8215fed65506f98f6838b2af08c4ffd5819f0 /src/zen/cmds/status_cmd.cpp | |
| parent | zen startup hardening (#49) (diff) | |
| download | archived-zen-6d634ab59c05adf1ba028d95b16031a7f8e8db2a.tar.xz archived-zen-6d634ab59c05adf1ba028d95b16031a7f8e8db2a.zip | |
improved lock file handling (#50)
- Feature: `zen down`
- --`data-dir` to specify a data directory to deduce which zen instance to bring down
- Feature: `zen attach`
- --`data-dir` to specify a data directory to deduce which zen instance to attach to222
- Feature: `zen status`
- --`port` filter running zen instances based on port
- --`data-dir` filter running zen instances based on information in the data directory
- Improvement: Trying to load a compact binary object from an empty file no longer causes access violation
Diffstat (limited to 'src/zen/cmds/status_cmd.cpp')
| -rw-r--r-- | src/zen/cmds/status_cmd.cpp | 40 |
1 files changed, 36 insertions, 4 deletions
diff --git a/src/zen/cmds/status_cmd.cpp b/src/zen/cmds/status_cmd.cpp index cc936835a..16754e747 100644 --- a/src/zen/cmds/status_cmd.cpp +++ b/src/zen/cmds/status_cmd.cpp @@ -2,6 +2,7 @@ #include "status_cmd.h" +#include <zencore/compactbinary.h> #include <zencore/fmtutils.h> #include <zencore/logging.h> #include <zencore/string.h> @@ -12,6 +13,8 @@ namespace zen { StatusCommand::StatusCommand() { + m_Options.add_option("", "p", "port", "Host port", cxxopts::value(m_Port)->default_value("0"), "<hostport>"); + m_Options.add_option("", "", "data-dir", "Path to data directory to inspect for running server", cxxopts::value(m_DataDir), "<file>"); } StatusCommand::~StatusCommand() = default; @@ -19,7 +22,30 @@ StatusCommand::~StatusCommand() = default; int StatusCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) { - ZEN_UNUSED(GlobalOptions, argc, argv); + ZEN_UNUSED(GlobalOptions); + + if (!ParseOptions(argc, argv)) + { + return 0; + } + + uint16_t EffectivePort = 0; + if (!m_DataDir.empty()) + { + if (!std::filesystem::is_regular_file(m_DataDir / ".lock")) + { + ZEN_CONSOLE("lock file does not exist in directory '{}'", m_DataDir); + return 1; + } + LockFileInfo Info = ReadLockFilePayload(LoadCompactBinaryObject(IoBufferBuilder::MakeFromFile(m_DataDir / ".lock"))); + std::string Reason; + if (!ValidateLockFileInfo(Info, Reason)) + { + ZEN_CONSOLE("lock file in directory '{}' is not valid. Reason: '{}'", m_DataDir, Reason); + return 1; + } + EffectivePort = Info.EffectiveListenPort; + } ZenServerState State; if (!State.InitializeReadOnly()) @@ -31,9 +57,15 @@ StatusCommand::Run(const ZenCliOptions& GlobalOptions, int argc, char** argv) ZEN_CONSOLE("{:>5} {:>6} {:>24}", "port", "pid", "session"); State.Snapshot([&](const ZenServerState::ZenServerEntry& Entry) { - StringBuilder<25> SessionStringBuilder; - Entry.GetSessionId().ToString(SessionStringBuilder); - ZEN_CONSOLE("{:>5} {:>6} {:>24}", Entry.EffectiveListenPort.load(), Entry.Pid.load(), SessionStringBuilder); + bool MatchesAnyPort = (m_Port == 0) && (EffectivePort == 0); + bool MatchesEffectivePort = (EffectivePort != 0) && (Entry.EffectiveListenPort.load() == EffectivePort); + bool MatchesDesiredPort = (m_Port != 0) && (Entry.DesiredListenPort.load() == m_Port); + if (MatchesAnyPort || MatchesEffectivePort || MatchesDesiredPort) + { + StringBuilder<25> SessionStringBuilder; + Entry.GetSessionId().ToString(SessionStringBuilder); + ZEN_CONSOLE("{:>5} {:>6} {:>24}", Entry.EffectiveListenPort.load(), Entry.Pid.load(), SessionStringBuilder); + } }); return 0; |