#pragma once #include "client/mgmtd/MgmtdClientForServer.h" #include "common/kv/mem/MemKVEngine.h" #include "meta/service/MetaServer.h" #include "mgmtd/MgmtdServer.h" namespace hf3fs { template struct ServerWithConfig { typename ServerT::Config config; String clusterId; flat::NodeId nodeId; std::unique_ptr server; String hostname; uint32_t pid = 1; ServerWithConfig(String clusterId, flat::NodeId nodeId) { this->clusterId = std::move(clusterId); this->nodeId = nodeId; auto &baseConfig = config.base(); for (size_t i = 0; i < baseConfig.groups_length(); ++i) { baseConfig.groups(i).set_network_type(net::Address::LOCAL); baseConfig.groups(i).listener().set_listen_port(0); baseConfig.groups(i).listener().set_reuse_port(true); } } Result start(std::shared_ptr kvEngine) { assert(!server); auto server = std::make_unique(config); RETURN_ON_ERROR(server->setup()); flat::AppInfo appInfo; appInfo.nodeId = nodeId; appInfo.clusterId = clusterId; appInfo.hostname = fmt::format("hostname.{}", nodeId.toUnderType()); appInfo.pid = pid++; std::vector serverAddrs; for (auto &group : server->groups()) { appInfo.serviceGroups.emplace_back(group->serviceNameList(), group->addressList()); serverAddrs.insert(serverAddrs.end(), group->addressList().begin(), group->addressList().end()); } RETURN_ON_ERROR(server->start(appInfo, std::move(kvEngine))); this->server = std::move(server); return Void{}; } void stop() { if (server) server->stopAndJoin(); server.reset(); } Result restart(std::shared_ptr kvEngine) { stop(); return start(std::move(kvEngine)); } std::vector collectAddressList(std::string_view serviceName) const { std::vector serverAddrs; for (const auto &group : server->groups()) { const auto &names = group->serviceNameList(); const auto &addrs = group->addressList(); if (std::find(names.begin(), names.end(), serviceName) != names.end()) { serverAddrs.insert(serverAddrs.end(), addrs.begin(), addrs.end()); } } return serverAddrs; } }; using MgmtdServerWithConfig = ServerWithConfig; struct MetaServerWithConfig : ServerWithConfig { using Base = ServerWithConfig; MetaServerWithConfig(String clusterId, flat::NodeId nodeId, std::vector mgmtdServerAddrs) : Base(std::move(clusterId), nodeId) { auto &mgmtdClientConfig = config.mgmtd_client(); mgmtdClientConfig.set_mgmtd_server_addresses(mgmtdServerAddrs); } }; } // namespace hf3fs