limit directory cache to directory operations

This commit is contained in:
2025-01-22 07:39:41 -06:00
parent 1e25fb57f1
commit b507643d23

View File

@ -501,28 +501,16 @@ auto fuse_drive::getattr_impl(std::string api_path, struct stat *unix_st)
return res;
}
auto found = false;
directory_cache_->execute_action(parent, [&](directory_iterator &iter) {
directory_item dir_item{};
found = (iter.get_directory_item(api_path, dir_item) == api_error::success);
if (found) {
fuse_drive_base::populate_stat(api_path, dir_item.size, dir_item.meta,
dir_item.directory, provider_, unix_st);
}
});
if (not found) {
api_meta_map meta{};
res = provider_.get_item_meta(api_path, meta);
if (res != api_error::success) {
return res;
}
fuse_drive_base::populate_stat(
api_path, utils::string::to_uint64(meta[META_SIZE]), meta,
utils::string::to_bool(meta[META_DIRECTORY]), provider_, unix_st);
api_meta_map meta{};
res = provider_.get_item_meta(api_path, meta);
if (res != api_error::success) {
return res;
}
fuse_drive_base::populate_stat(
api_path, utils::string::to_uint64(meta[META_SIZE]), meta,
utils::string::to_bool(meta[META_DIRECTORY]), provider_, unix_st);
return api_error::success;
}
@ -583,24 +571,24 @@ void *fuse_drive::init_impl(struct fuse_conn_info *conn) {
auto *ret = fuse_drive_base::init_impl(conn);
#endif
if (console_enabled_) {
console_consumer_ =
std::make_unique<console_consumer>(config_.get_event_level());
}
logging_consumer_ = std::make_unique<logging_consumer>(
config_.get_event_level(), config_.get_log_directory());
event_system::instance().start();
was_mounted_ = true;
fm_ = std::make_unique<file_manager>(config_, provider_);
server_ = std::make_unique<full_server>(config_, provider_, *fm_);
if (not provider_.is_read_only()) {
eviction_ = std::make_unique<eviction>(provider_, config_, *fm_);
}
directory_cache_ = std::make_unique<directory_cache>();
try {
if (console_enabled_) {
console_consumer_ =
std::make_unique<console_consumer>(config_.get_event_level());
}
logging_consumer_ = std::make_unique<logging_consumer>(
config_.get_event_level(), config_.get_log_directory());
event_system::instance().start();
was_mounted_ = true;
fm_ = std::make_unique<file_manager>(config_, provider_);
server_ = std::make_unique<full_server>(config_, provider_, *fm_);
if (not provider_.is_read_only()) {
eviction_ = std::make_unique<eviction>(provider_, config_, *fm_);
}
directory_cache_ = std::make_unique<directory_cache>();
directory_cache_->start();
server_->start();
@ -907,19 +895,7 @@ auto fuse_drive::getxattr_common(std::string api_path, const char *name,
}
api_meta_map meta;
auto found{false};
directory_cache_->execute_action(
utils::path::get_parent_api_path(api_path),
[&](directory_iterator &iterator) {
directory_item dir_item{};
found = (iterator.get_directory_item(api_path, dir_item) ==
api_error::success);
if (found) {
meta = dir_item.meta;
}
});
res = found ? api_error::success : provider_.get_item_meta(api_path, meta);
res = provider_.get_item_meta(api_path, meta);
if (res != api_error::success) {
return res;
}