#pragma once #include #include #include #include #include #include #include #include #include #include #include "client/mgmtd/ICommonMgmtdClient.h" #include "client/storage/StorageClient.h" #include "common/app/NodeId.h" #include "common/kv/IKVEngine.h" #include "common/kv/mem/MemKVEngine.h" #include "common/serde/ClientMockContext.h" #include "common/utils/CPUExecutorGroup.h" #include "common/utils/ConfigBase.h" #include "common/utils/Coroutine.h" #include "meta/components/ChainAllocator.h" #include "meta/components/FileHelper.h" #include "meta/components/GcManager.h" #include "meta/service/MetaOperator.h" #include "meta/service/MetaSerdeService.h" #include "meta/store/MetaStore.h" namespace hf3fs::meta::server { class MockMeta : folly::NonCopyableNonMovable { public: static CoTryTask> create(const Config &cfg, std::shared_ptr kv, std::shared_ptr mgmtdClient) { auto meta = std::unique_ptr(new MockMeta(cfg, kv, mgmtdClient)); for (auto &moperator : meta->operators_) { CO_RETURN_ON_ERROR(co_await moperator->init(Layout::newEmpty(ChainTableId(1), 512 << 10, 128))); } co_return meta; } ~MockMeta() { stop(); } void start(CPUExecutorGroup &exec) { for (auto &moperator : operators_) { moperator->start(exec); } } void stop() { for (auto &moperator : operators_) { moperator->beforeStop(); moperator->afterStop(); } } std::unique_ptr getService() { return std::make_unique(*operators_.at(0)); } MetaOperator &getOperator() { return *operators_.at(0); } MetaStore &getStore() { return dynamic_cast(*getOperator().metaStore_); } storage::client::StorageClient &getStorageClient() { return *storageClient_; } FileHelper &getFileHelper() { return *getOperator().fileHelper_; } GcManager &getGcManager() { return *getOperator().gcManager_; } SessionManager &getSessionManager() { return *getOperator().sessionManager_; } private: MockMeta(const Config &cfg, std::shared_ptr kv, std::shared_ptr mgmtdClient) : cfg_(cfg), mgmtdClient_(mgmtdClient) { storageClientCfg_.set_implementation_type(storage::client::StorageClient::ImplementationType::InMem); storageClient_ = storage::client::StorageClient::create(ClientId::random(), storageClientCfg_, *mgmtdClient_); auto routing = mgmtdClient->getRoutingInfo(); XLOGF_IF(FATAL, !routing, "routing info not available"); auto nodes = routing->getNodeBy(flat::selectNodeByType(flat::NodeType::META) && flat::selectActiveNode()); XLOGF_IF(FATAL, nodes.empty(), "no active metas"); for (auto &node : nodes) { XLOGF_IF(FATAL, contexts_.contains(node.app.nodeId), "duplicated {}", node.app.nodeId); auto moperator = std::make_unique( cfg, node.app.nodeId, kv, mgmtdClient_, storageClient_, std::make_unique(cfg.forward(), node.app.nodeId, contexts_, mgmtdClient_)); contexts_[node.app.nodeId] = serde::ClientMockContext::create(std::make_unique(*moperator)); operators_.push_back(std::move(moperator)); } } [[maybe_unused]] const Config &cfg_; storage::client::StorageClient::Config storageClientCfg_; std::vector> operators_; std::map contexts_; std::shared_ptr mgmtdClient_; std::shared_ptr storageClient_; }; } // namespace hf3fs::meta::server