#pragma once #include "FuseConfig.h" #include "common/utils/AtomicSharedPtrTable.h" #include "fbs/meta/Common.h" #include "fbs/meta/Schema.h" namespace hf3fs::fuse { class UserConfig { public: UserConfig() = default; void init(FuseConfig &config); Result setConfig(const char *key, const char *val, const meta::UserInfo &ui); Result lookupConfig(const char *key, const meta::UserInfo &ui); Result statConfig(meta::InodeId iid, const meta::UserInfo &ui); std::pair>, std::shared_ptr>>> listConfig(const meta::UserInfo &ui); public: const FuseConfig &getConfig(const meta::UserInfo &ui); public: const std::vector systemKeys{"storage.net_client.rdma_control.max_concurrent_transmission", "periodic_sync.enable", "periodic_sync.interval", "periodic_sync.flush_write_buf", "io_worker_coros.hi", "io_worker_coros.lo", "max_jobs_per_ioring", "io_job_deq_timeout"}; const std::vector userKeys{"enable_read_cache", "readonly", "dryrun_bench_mode", "flush_on_stat", "sync_on_stat", "attr_timeout", "entry_timeout", "negative_timeout", "symlink_timeout"}; private: Result> parseKey(const char *key); meta::InodeId configIid(bool isGet, bool isSys, int kidx) { return meta::InodeId{(isGet ? meta::InodeId::getConf() : meta::InodeId::setConf()).u64() - 1 - (isSys ? 0 : systemKeys.size()) - kidx}; } private: FuseConfig *config_; struct LocalConfig { LocalConfig(const FuseConfig &globalConfig) : config(globalConfig) {} std::mutex mtx; FuseConfig config; std::vector updatedItems; }; std::unique_ptr> configs_; std::mutex userMtx_; std::set users_; private: std::atomic storageMaxConcXmit_; }; } // namespace hf3fs::fuse