During startup, the contents of the data directory are verified to ensure that they have the right owner and permissions. Verifying all the contents, which includes files that will be read and closed immediately, and files that will be held open for longer durations, together, can lead to memory fragementation in the dentry/inode cache. Prevent this by updating the verification in a such way that these two set of files will be verified separately ensuring their separation in the dentry/inode cache. Fixes #14506 Signed-off-by: Lakshmi Narayanan Sreethar <lakshmi.sreethar@scylladb.com>
56 lines
1.3 KiB
C++
56 lines
1.3 KiB
C++
/*
|
|
* Copyright (C) 2019-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <set>
|
|
#include <vector>
|
|
#include <seastar/core/future.hh>
|
|
#include <seastar/core/smp.hh>
|
|
#include "utils/file_lock.hh"
|
|
|
|
using namespace seastar;
|
|
|
|
namespace db {
|
|
class config;
|
|
}
|
|
|
|
namespace utils {
|
|
|
|
class directories {
|
|
public:
|
|
class set {
|
|
public:
|
|
void add(fs::path path);
|
|
void add(sstring path);
|
|
void add(std::vector<sstring> path);
|
|
void add_sharded(sstring path);
|
|
|
|
const std::set<fs::path> get_paths() const {
|
|
return _paths;
|
|
}
|
|
|
|
private:
|
|
std::set<fs::path> _paths;
|
|
};
|
|
|
|
using recursive = bool_class<struct recursive_tag>;
|
|
|
|
directories(bool developer_mode);
|
|
future<> create_and_verify(set dir_set, recursive recursive = recursive::yes);
|
|
static future<> verify_owner_and_mode(std::filesystem::path path, recursive recursive = recursive::yes);
|
|
static future<> verify_owner_and_mode_of_data_dir(set dir_set);
|
|
private:
|
|
bool _developer_mode;
|
|
std::vector<file_lock> _locks;
|
|
|
|
static future<> do_verify_owner_and_mode(std::filesystem::path path, recursive, int level, std::function<bool(const fs::path&)> do_verify_subpath = {});
|
|
};
|
|
|
|
} // namespace utils
|