aboutsummaryrefslogtreecommitdiff
path: root/src/zenutil/zenserverprocess.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/zenutil/zenserverprocess.cpp')
-rw-r--r--src/zenutil/zenserverprocess.cpp118
1 files changed, 103 insertions, 15 deletions
diff --git a/src/zenutil/zenserverprocess.cpp b/src/zenutil/zenserverprocess.cpp
index 6a93f0c63..b56df400d 100644
--- a/src/zenutil/zenserverprocess.cpp
+++ b/src/zenutil/zenserverprocess.cpp
@@ -31,6 +31,19 @@
namespace zen {
+// this needs to key off the current process child-id, in order to avoid conflicts
+// in situations where we have a tree of zenserver child processes (such as in hub
+// tests)
+
+std::atomic<int> ChildIdCounter{0};
+
+void
+ZenServerEnvironment::SetBaseChildId(int InitialValue)
+{
+ ZEN_ASSERT(ChildIdCounter == 0);
+ ChildIdCounter = InitialValue;
+}
+
namespace zenutil {
#if ZEN_PLATFORM_WINDOWS
class SecurityAttributes
@@ -507,8 +520,8 @@ ZenServerEnvironment::InitializeForTest(std::filesystem::path ProgramBaseDir,
{
using namespace std::literals;
- m_ProgramBaseDir = ProgramBaseDir;
- m_TestBaseDir = TestBaseDir;
+ m_ProgramBaseDir = ProgramBaseDir;
+ m_ChildProcessBaseDir = TestBaseDir;
ZEN_INFO("Program base dir is '{}'", ProgramBaseDir);
ZEN_INFO("Cleaning test base dir '{}'", TestBaseDir);
@@ -536,6 +549,59 @@ ZenServerEnvironment::InitializeForTest(std::filesystem::path ProgramBaseDir,
}
}
+void
+ZenServerEnvironment::InitializeForHub(std::filesystem::path ProgramBaseDir,
+ std::filesystem::path ChildBaseDir,
+ std::string_view ServerClass)
+{
+ using namespace std::literals;
+
+ m_ProgramBaseDir = ProgramBaseDir;
+ m_ChildProcessBaseDir = ChildBaseDir;
+
+ ZEN_INFO("Program base dir is '{}'", m_ProgramBaseDir);
+ ZEN_INFO("Cleaning child base dir '{}'", m_ChildProcessBaseDir);
+ DeleteDirectories(m_ChildProcessBaseDir.c_str());
+
+ m_IsHubInstance = true;
+ m_IsInitialized = true;
+
+ if (ServerClass.empty())
+ {
+#if ZEN_WITH_HTTPSYS
+ if (!zen::windows::IsRunningOnWine())
+ {
+ m_ServerClass = "httpsys"sv;
+
+ return;
+ }
+#endif
+
+ m_ServerClass = "asio"sv;
+ }
+ else
+ {
+ m_ServerClass = ServerClass;
+ }
+}
+
+std::filesystem::path
+ZenServerEnvironment::CreateChildDir(std::string_view ChildName)
+{
+ using namespace std::literals;
+
+ std::filesystem::path ChildPath = m_ChildProcessBaseDir / ChildName;
+
+ if (!IsDir(ChildPath))
+ {
+ ZEN_INFO("Creating new test dir @ '{}'", ChildPath);
+
+ CreateDirectories(ChildPath);
+ }
+
+ return ChildPath;
+}
+
std::filesystem::path
ZenServerEnvironment::CreateNewTestDir()
{
@@ -544,7 +610,7 @@ ZenServerEnvironment::CreateNewTestDir()
ExtendableWideStringBuilder<256> TestDir;
TestDir << "test"sv << int64_t(ZenServerTestCounter.fetch_add(1));
- std::filesystem::path TestPath = m_TestBaseDir / TestDir.c_str();
+ std::filesystem::path TestPath = m_ChildProcessBaseDir / TestDir.c_str();
ZEN_ASSERT(!IsDir(TestPath));
ZEN_INFO("Creating new test dir @ '{}'", TestPath);
@@ -566,11 +632,11 @@ ZenServerEnvironment::GetTestRootDir(std::string_view Path)
//////////////////////////////////////////////////////////////////////////
-std::atomic<int> ChildIdCounter{0};
-
-ZenServerInstance::ZenServerInstance(ZenServerEnvironment& TestEnvironment) : m_Env(TestEnvironment)
+ZenServerInstance::ZenServerInstance(ZenServerEnvironment& TestEnvironment, ServerMode Mode) : m_Env(TestEnvironment), m_ServerMode(Mode)
{
ZEN_ASSERT(TestEnvironment.IsInitialized());
+
+ m_ServerMode = Mode;
}
ZenServerInstance::~ZenServerInstance()
@@ -710,6 +776,22 @@ ZenServerInstance::SpawnServer(std::string_view ServerArgs, bool OpenConsole, in
SpawnServerInternal(ChildId, ServerArgs, OpenConsole, WaitTimeoutMs);
}
+std::string_view
+ToString(ZenServerInstance::ServerMode Mode)
+{
+ using namespace std::literals;
+
+ switch (Mode)
+ {
+ case ZenServerInstance::ServerMode::kStorageServer:
+ return "storage"sv;
+ case ZenServerInstance::ServerMode::kHubServer:
+ return "hub"sv;
+ default:
+ return "invalid"sv;
+ }
+}
+
void
ZenServerInstance::SpawnServerInternal(int ChildId, std::string_view ServerArgs, bool OpenConsole, int WaitTimeoutMs)
{
@@ -721,6 +803,12 @@ ZenServerInstance::SpawnServerInternal(int ChildId, std::string_view ServerArgs,
ExtendableStringBuilder<512> CommandLine;
CommandLine << "zenserver" ZEN_EXE_SUFFIX_LITERAL; // see CreateProc() call for actual binary path
+
+ if (m_ServerMode == ServerMode::kHubServer)
+ {
+ CommandLine << " hub";
+ }
+
CommandLine << " --child-id " << ChildEventName;
if (!ServerArgs.empty())
@@ -730,7 +818,7 @@ ZenServerInstance::SpawnServerInternal(int ChildId, std::string_view ServerArgs,
std::filesystem::path CurrentDirectory = std::filesystem::current_path();
- ZEN_DEBUG("Spawning server '{}'", m_Name);
+ ZEN_DEBUG("Spawning {} server '{}'", ToString(m_ServerMode), m_Name);
uint32_t CreationFlags = 0;
if (OpenConsole)
@@ -738,8 +826,9 @@ ZenServerInstance::SpawnServerInternal(int ChildId, std::string_view ServerArgs,
CreationFlags |= CreateProcOptions::Flag_NewConsole;
}
- const std::filesystem::path BaseDir = m_Env.ProgramBaseDir();
- const std::filesystem::path Executable = BaseDir / "zenserver" ZEN_EXE_SUFFIX_LITERAL;
+ const std::filesystem::path BaseDir = m_Env.ProgramBaseDir();
+ const std::filesystem::path Executable =
+ m_ServerExecutablePath.empty() ? (BaseDir / "zenserver" ZEN_EXE_SUFFIX_LITERAL) : m_ServerExecutablePath;
const std::filesystem::path OutputPath =
OpenConsole ? std::filesystem::path{} : std::filesystem::temp_directory_path() / ("zenserver_" + m_Name + ".log");
CreateProcOptions CreateOptions = {.WorkingDirectory = &CurrentDirectory, .Flags = CreationFlags, .StdoutFile = OutputPath};
@@ -799,8 +888,7 @@ ZenServerInstance::SpawnServer(int BasePort, std::string_view AdditionalServerAr
const int ChildId = AssignName();
ExtendableStringBuilder<512> CommandLine;
-
- const bool IsTest = m_Env.IsTestEnvironment();
+ const bool IsTest = m_Env.IsTestEnvironment();
if (IsTest)
{
@@ -835,10 +923,10 @@ ZenServerInstance::SpawnServer(int BasePort, std::string_view AdditionalServerAr
m_BasePort = gsl::narrow_cast<uint16_t>(BasePort);
}
- if (!m_TestDir.empty())
+ if (!m_DataDir.empty())
{
CommandLine << " --data-dir ";
- PathToUtf8(m_TestDir.c_str(), CommandLine);
+ PathToUtf8(m_DataDir.c_str(), CommandLine);
}
if (!AdditionalServerArgs.empty())
@@ -1028,10 +1116,10 @@ ZenServerInstance::GetBaseUri() const
}
void
-ZenServerInstance::SetTestDir(std::filesystem::path TestDir)
+ZenServerInstance::SetDataDir(std::filesystem::path TestDir)
{
ZEN_ASSERT(!m_Process.IsValid());
- m_TestDir = TestDir;
+ m_DataDir = TestDir;
}
bool