Skip to content

Commit

Permalink
Move file related utilities to files.hpp
Browse files Browse the repository at this point in the history
  • Loading branch information
pwojcikdev committed Nov 3, 2024
1 parent 731acc2 commit 401a3fd
Show file tree
Hide file tree
Showing 32 changed files with 165 additions and 130 deletions.
1 change: 1 addition & 0 deletions nano/core_test/block_store.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <nano/crypto_lib/random_pool.hpp>
#include <nano/lib/block_type.hpp>
#include <nano/lib/blocks.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/lmdbconfig.hpp>
#include <nano/lib/logging.hpp>
#include <nano/lib/stats.hpp>
Expand Down
1 change: 1 addition & 0 deletions nano/core_test/entry.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/logging.hpp>
#include <nano/lib/memory.hpp>
#include <nano/secure/utility.hpp>
Expand Down
1 change: 1 addition & 0 deletions nano/core_test/utility.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/optional_ptr.hpp>
#include <nano/lib/rate_limiting.hpp>
#include <nano/lib/relaxed_atomic.hpp>
Expand Down
2 changes: 2 additions & 0 deletions nano/lib/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,8 @@ add_library(
epochs.hpp
errors.hpp
errors.cpp
files.hpp
files.cpp
fwd.hpp
id_dispenser.hpp
interval.hpp
Expand Down
3 changes: 3 additions & 0 deletions nano/lib/assert.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
#include <nano/lib/assert.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/stacktrace.hpp>

#include <boost/dll/runtime_symbol_info.hpp>

#include <iostream>

/*
Expand Down
85 changes: 85 additions & 0 deletions nano/lib/files.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
#include <nano/lib/files.hpp>

#include <cstddef>
#include <cstring>
#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <string_view>
#include <thread>

#ifndef _WIN32
#include <sys/resource.h>
#endif

std::size_t nano::get_file_descriptor_limit ()
{
std::size_t fd_limit = std::numeric_limits<std::size_t>::max ();
#ifndef _WIN32
rlimit limit{};
if (getrlimit (RLIMIT_NOFILE, &limit) == 0)
{
fd_limit = static_cast<std::size_t> (limit.rlim_cur);
}
#endif
return fd_limit;
}

void nano::set_file_descriptor_limit (std::size_t limit)
{
#ifndef _WIN32
rlimit fd_limit{};
if (-1 == getrlimit (RLIMIT_NOFILE, &fd_limit))
{
std::cerr << "WARNING: Unable to get current limits for the number of open file descriptors: " << std::strerror (errno);
return;
}

if (fd_limit.rlim_cur >= limit)
{
return;
}

fd_limit.rlim_cur = std::min (static_cast<rlim_t> (limit), fd_limit.rlim_max);
if (-1 == setrlimit (RLIMIT_NOFILE, &fd_limit))
{
std::cerr << "WARNING: Unable to set limits for the number of open file descriptors: " << std::strerror (errno);
return;
}
#endif
}

void nano::initialize_file_descriptor_limit ()
{
nano::set_file_descriptor_limit (DEFAULT_FILE_DESCRIPTOR_LIMIT);
auto limit = nano::get_file_descriptor_limit ();
if (limit < DEFAULT_FILE_DESCRIPTOR_LIMIT)
{
std::cerr << "WARNING: Current file descriptor limit of " << limit << " is lower than the " << DEFAULT_FILE_DESCRIPTOR_LIMIT << " recommended. Node was unable to change it." << std::endl;
}
}

void nano::remove_all_files_in_dir (std::filesystem::path const & dir)
{
for (auto & p : std::filesystem::directory_iterator (dir))
{
auto path = p.path ();
if (std::filesystem::is_regular_file (path))
{
std::filesystem::remove (path);
}
}
}

void nano::move_all_files_to_dir (std::filesystem::path const & from, std::filesystem::path const & to)
{
for (auto & p : std::filesystem::directory_iterator (from))
{
auto path = p.path ();
if (std::filesystem::is_regular_file (path))
{
std::filesystem::rename (path, to / path.filename ());
}
}
}
48 changes: 48 additions & 0 deletions nano/lib/files.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#pragma once

#include <filesystem>

namespace nano
{
/*
* Functions for managing filesystem permissions, platform specific
*/
void set_umask ();
void set_secure_perm_directory (std::filesystem::path const & path);
void set_secure_perm_directory (std::filesystem::path const & path, std::error_code & ec);
void set_secure_perm_file (std::filesystem::path const & path);
void set_secure_perm_file (std::filesystem::path const & path, std::error_code & ec);

/*
* Function to check if running Windows as an administrator
*/
bool is_windows_elevated ();

/*
* Function to check if the Windows Event log registry key exists
*/
bool event_log_reg_entry_exists ();

/*
* Create the load memory addresses for the executable and shared libraries.
*/
void create_load_memory_address_files ();

/**
* Some systems, especially in virtualized environments, may have very low file descriptor limits,
* causing the node to fail. This function attempts to query the limit and returns the value. If the
* limit cannot be queried, or running on a Windows system, this returns max-value of std::size_t.
* Increasing the limit programmatically can be done only for the soft limit, the hard one requiring
* super user permissions to modify.
*/
std::size_t get_file_descriptor_limit ();
void set_file_descriptor_limit (std::size_t limit);
/**
* This should be called from entry points. It sets the file descriptor limit to the maximum allowed and logs any errors.
*/
constexpr std::size_t DEFAULT_FILE_DESCRIPTOR_LIMIT = 16384;
void initialize_file_descriptor_limit ();

void remove_all_files_in_dir (std::filesystem::path const & dir);
void move_all_files_to_dir (std::filesystem::path const & from, std::filesystem::path const & to);
}
1 change: 1 addition & 0 deletions nano/lib/jsonconfig.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <nano/boost/asio/ip/address_v6.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/jsonconfig.hpp>

#include <boost/property_tree/json_parser.hpp>
Expand Down
1 change: 1 addition & 0 deletions nano/lib/jsonconfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include <boost/lexical_cast.hpp>
#include <boost/property_tree/ptree.hpp>

#include <filesystem>
#include <fstream>

namespace boost
Expand Down
1 change: 1 addition & 0 deletions nano/lib/plat/default/debugging.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/utility.hpp>

void nano::create_load_memory_address_files ()
Expand Down
1 change: 1 addition & 0 deletions nano/lib/plat/linux/debugging.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/utility.hpp>

#include <cstring>
Expand Down
1 change: 1 addition & 0 deletions nano/lib/plat/posix/perms.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/utility.hpp>

#include <sys/stat.h>
Expand Down
1 change: 1 addition & 0 deletions nano/lib/plat/windows/perms.cpp
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
#include <nano/lib/files.hpp>
#include <nano/lib/utility.hpp>

// clang-format off
Expand Down
1 change: 1 addition & 0 deletions nano/lib/plat/windows/priority.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <windows.h>

namespace nano
{
void work_thread_reprioritize ()
Expand Down
1 change: 1 addition & 0 deletions nano/lib/tomlconfig.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <nano/boost/asio/ip/address_v6.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/tomlconfig.hpp>

nano::tomlconfig::tomlconfig () :
Expand Down
2 changes: 2 additions & 0 deletions nano/lib/tomlconfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
#include <boost/lexical_cast.hpp>
#include <boost/optional.hpp>

#include <filesystem>

#include <cpptoml.h>

namespace boost
Expand Down
85 changes: 0 additions & 85 deletions nano/lib/utility.cpp
Original file line number Diff line number Diff line change
@@ -1,92 +1,7 @@
#include <nano/lib/stacktrace.hpp>
#include <nano/lib/utility.hpp>

#include <boost/dll/runtime_symbol_info.hpp>
#include <boost/program_options.hpp>

#include <cstddef>
#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <string_view>
#include <thread>

#ifndef _WIN32
#include <sys/resource.h>
#endif

std::size_t nano::get_file_descriptor_limit ()
{
std::size_t fd_limit = std::numeric_limits<std::size_t>::max ();
#ifndef _WIN32
rlimit limit{};
if (getrlimit (RLIMIT_NOFILE, &limit) == 0)
{
fd_limit = static_cast<std::size_t> (limit.rlim_cur);
}
#endif
return fd_limit;
}

void nano::set_file_descriptor_limit (std::size_t limit)
{
#ifndef _WIN32
rlimit fd_limit{};
if (-1 == getrlimit (RLIMIT_NOFILE, &fd_limit))
{
std::cerr << "WARNING: Unable to get current limits for the number of open file descriptors: " << std::strerror (errno);
return;
}

if (fd_limit.rlim_cur >= limit)
{
return;
}

fd_limit.rlim_cur = std::min (static_cast<rlim_t> (limit), fd_limit.rlim_max);
if (-1 == setrlimit (RLIMIT_NOFILE, &fd_limit))
{
std::cerr << "WARNING: Unable to set limits for the number of open file descriptors: " << std::strerror (errno);
return;
}
#endif
}

void nano::initialize_file_descriptor_limit ()
{
nano::set_file_descriptor_limit (DEFAULT_FILE_DESCRIPTOR_LIMIT);
auto limit = nano::get_file_descriptor_limit ();
if (limit < DEFAULT_FILE_DESCRIPTOR_LIMIT)
{
std::cerr << "WARNING: Current file descriptor limit of " << limit << " is lower than the " << DEFAULT_FILE_DESCRIPTOR_LIMIT << " recommended. Node was unable to change it." << std::endl;
}
}

void nano::remove_all_files_in_dir (std::filesystem::path const & dir)
{
for (auto & p : std::filesystem::directory_iterator (dir))
{
auto path = p.path ();
if (std::filesystem::is_regular_file (path))
{
std::filesystem::remove (path);
}
}
}

void nano::move_all_files_to_dir (std::filesystem::path const & from, std::filesystem::path const & to)
{
for (auto & p : std::filesystem::directory_iterator (from))
{
auto path = p.path ();
if (std::filesystem::is_regular_file (path))
{
std::filesystem::rename (path, to / path.filename ());
}
}
}

// Issue #3748
void nano::sort_options_description (const boost::program_options::options_description & source, boost::program_options::options_description & target)
{
Expand Down
45 changes: 0 additions & 45 deletions nano/lib/utility.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,7 @@

#include <boost/lexical_cast.hpp>

#include <cassert>
#include <filesystem>
#include <functional>
#include <mutex>
#include <sstream>
#include <vector>

Expand All @@ -31,48 +28,6 @@ namespace nano
// Lower priority of calling work generating thread
void work_thread_reprioritize ();

/*
* Functions for managing filesystem permissions, platform specific
*/
void set_umask ();
void set_secure_perm_directory (std::filesystem::path const & path);
void set_secure_perm_directory (std::filesystem::path const & path, std::error_code & ec);
void set_secure_perm_file (std::filesystem::path const & path);
void set_secure_perm_file (std::filesystem::path const & path, std::error_code & ec);

/*
* Function to check if running Windows as an administrator
*/
bool is_windows_elevated ();

/*
* Function to check if the Windows Event log registry key exists
*/
bool event_log_reg_entry_exists ();

/*
* Create the load memory addresses for the executable and shared libraries.
*/
void create_load_memory_address_files ();

/**
* Some systems, especially in virtualized environments, may have very low file descriptor limits,
* causing the node to fail. This function attempts to query the limit and returns the value. If the
* limit cannot be queried, or running on a Windows system, this returns max-value of std::size_t.
* Increasing the limit programmatically can be done only for the soft limit, the hard one requiring
* super user permissions to modify.
*/
std::size_t get_file_descriptor_limit ();
void set_file_descriptor_limit (std::size_t limit);
/**
* This should be called from entry points. It sets the file descriptor limit to the maximum allowed and logs any errors.
*/
constexpr std::size_t DEFAULT_FILE_DESCRIPTOR_LIMIT = 16384;
void initialize_file_descriptor_limit ();

void remove_all_files_in_dir (std::filesystem::path const & dir);
void move_all_files_to_dir (std::filesystem::path const & from, std::filesystem::path const & to);

template <class InputIt, class OutputIt, class Pred, class Func>
void transform_if (InputIt first, InputIt last, OutputIt dest, Pred pred, Func transform)
{
Expand Down
1 change: 1 addition & 0 deletions nano/nano_node/daemon.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include <nano/boost/process/child.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/signal_manager.hpp>
#include <nano/lib/stacktrace.hpp>
#include <nano/lib/thread_runner.hpp>
Expand Down
1 change: 1 addition & 0 deletions nano/nano_node/entry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#include <nano/lib/block_type.hpp>
#include <nano/lib/blocks.hpp>
#include <nano/lib/cli.hpp>
#include <nano/lib/files.hpp>
#include <nano/lib/thread_runner.hpp>
#include <nano/lib/utility.hpp>
#include <nano/lib/work_version.hpp>
Expand Down
Loading

0 comments on commit 401a3fd

Please sign in to comment.