Files
3FS/src/fuse/hf3fs_fuse.cpp
2025-02-27 21:53:53 +08:00

84 lines
2.8 KiB
C++

#ifdef ENABLE_FUSE_APPLICATION
#include "FuseApplication.h"
int main(int argc, char *argv[]) {
gflags::AllowCommandLineReparsing();
using namespace hf3fs;
return fuse::FuseApplication().run(argc, argv);
}
#else
#include <folly/ScopeGuard.h>
#include "FuseConfig.h"
#include "FuseMainLoop.h"
#include "FuseOps.h"
#include "common/logging/LogInit.h"
using namespace hf3fs;
using namespace hf3fs::fuse;
DECLARE_string(cfg);
DECLARE_bool(use_local_cfg);
auto withRetry(auto &&f, std::string_view desc) {
using RetType = decltype(f());
auto retryInterval = std::chrono::milliseconds(10);
constexpr auto maxRetryInterval = std::chrono::milliseconds(1000);
std::optional<RetType> res;
for (int i = 0; i < 20; ++i) {
res = f();
if (*res) break;
XLOGF(CRITICAL, "{} failed: {}\nretryCount: {}", desc, res->error(), i);
std::this_thread::sleep_for(retryInterval);
retryInterval = std::min(2 * retryInterval, maxRetryInterval);
}
return *res;
}
int main(int argc, char *argv[]) {
gflags::AllowCommandLineReparsing();
FuseConfig hf3fsConfig;
hf3fsConfig.init(&argc, &argv);
auto ibResult = net::IBManager::start(hf3fsConfig.ib_devices());
XLOGF_IF(FATAL, !ibResult, "Failed to start IBManager: {}", ibResult.error());
SCOPE_EXIT { hf3fs::net::IBManager::stop(); };
auto logConfigStr = logging::generateLogConfig(hf3fsConfig.log(), String("hf3fs_fuse"));
XLOGF(INFO, "LogConfig: {}", logConfigStr);
logging::initOrDie(logConfigStr);
XLOGF(INFO, "{}", VersionInfo::full());
auto monitorResult = monitor::Monitor::start(hf3fsConfig.monitor());
XLOGF_IF(FATAL, !monitorResult, "Parse config file from flags failed: {}", monitorResult.error());
auto physicalHostnameRes = SysResource::hostname(/*physicalMachineName=*/true);
XLOGF_IF(FATAL, !physicalHostnameRes, "Get physical hostname failed: {}", physicalHostnameRes.error());
auto containerHostnameRes = SysResource::hostname(/*physicalMachineName=*/false);
XLOGF_IF(FATAL, !containerHostnameRes, "Get container hostname failed: {}", containerHostnameRes.error());
auto clientId = ClientId::random(*physicalHostnameRes);
flat::AppInfo appInfo;
appInfo.clusterId = hf3fsConfig.cluster_id();
appInfo.hostname = *physicalHostnameRes;
appInfo.pid = SysResource::pid();
appInfo.releaseVersion = flat::ReleaseVersion::fromVersionInfo();
auto &d = getFuseClientsInstance();
if (auto res = d.init(appInfo, hf3fsConfig.mountpoint(), hf3fsConfig.token_file(), hf3fsConfig); !res) {
XLOGF(FATAL, "Init fuse clients failed: {}", res.error());
}
SCOPE_EXIT { d.stop(); };
return fuseMainLoop(argv[0],
hf3fsConfig.allow_other(),
hf3fsConfig.mountpoint(),
hf3fsConfig.io_bufs().max_buf_size(),
hf3fsConfig.cluster_id());
}
#endif