Integrate nix::errno into Error.
Split sys/limits.rs; float dep:nix version. Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -274,7 +274,7 @@ version = "0.6"
|
|||||||
features = ["std"]
|
features = ["std"]
|
||||||
|
|
||||||
[workspace.dependencies.nix]
|
[workspace.dependencies.nix]
|
||||||
version = "0.30"
|
version = "0"
|
||||||
default-features = false
|
default-features = false
|
||||||
features = [
|
features = [
|
||||||
"resource",
|
"resource",
|
||||||
|
|||||||
@@ -52,6 +52,9 @@ pub enum Error {
|
|||||||
CargoToml(#[from] cargo_toml::Error),
|
CargoToml(#[from] cargo_toml::Error),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Clap(#[from] clap::error::Error),
|
Clap(#[from] clap::error::Error),
|
||||||
|
#[cfg(unix)]
|
||||||
|
#[error(transparent)]
|
||||||
|
Errno(#[from] nix::errno::Errno),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
Extension(#[from] axum::extract::rejection::ExtensionRejection),
|
Extension(#[from] axum::extract::rejection::ExtensionRejection),
|
||||||
#[error(transparent)]
|
#[error(transparent)]
|
||||||
|
|||||||
@@ -1,32 +1,11 @@
|
|||||||
pub mod compute;
|
pub mod compute;
|
||||||
|
pub mod limits;
|
||||||
pub mod storage;
|
pub mod storage;
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
pub use compute::available_parallelism;
|
pub use self::{compute::available_parallelism, limits::*};
|
||||||
|
use crate::{Result, at};
|
||||||
use crate::{Result, at, debug};
|
|
||||||
|
|
||||||
/// This is needed for opening lots of file descriptors, which tends to
|
|
||||||
/// happen more often when using RocksDB and making lots of federation
|
|
||||||
/// connections at startup. The soft limit is usually 1024, and the hard
|
|
||||||
/// limit is usually 512000; I've personally seen it hit >2000.
|
|
||||||
///
|
|
||||||
/// * <https://www.freedesktop.org/software/systemd/man/systemd.exec.html#id-1.12.2.1.17.6>
|
|
||||||
/// * <https://github.com/systemd/systemd/commit/0abf94923b4a95a7d89bc526efc84e7ca2b71741>
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub fn maximize_fd_limit() -> Result<(), nix::errno::Errno> {
|
|
||||||
use nix::sys::resource::{Resource::RLIMIT_NOFILE as NOFILE, getrlimit, setrlimit};
|
|
||||||
|
|
||||||
let (soft_limit, hard_limit) = getrlimit(NOFILE)?;
|
|
||||||
if soft_limit < hard_limit {
|
|
||||||
setrlimit(NOFILE, hard_limit, hard_limit)?;
|
|
||||||
assert_eq!((hard_limit, hard_limit), getrlimit(NOFILE)?, "getrlimit != setrlimit");
|
|
||||||
debug!(to = hard_limit, from = soft_limit, "Raised RLIMIT_NOFILE",);
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Return a possibly corrected std::env::current_exe() even if the path is
|
/// Return a possibly corrected std::env::current_exe() even if the path is
|
||||||
/// marked deleted.
|
/// marked deleted.
|
||||||
|
|||||||
36
src/core/utils/sys/limits.rs
Normal file
36
src/core/utils/sys/limits.rs
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#[cfg(unix)]
|
||||||
|
use nix::sys::resource::{Resource, getrlimit};
|
||||||
|
|
||||||
|
use crate::{Result, debug};
|
||||||
|
|
||||||
|
/// This is needed for opening lots of file descriptors, which tends to
|
||||||
|
/// happen more often when using RocksDB and making lots of federation
|
||||||
|
/// connections at startup. The soft limit is usually 1024, and the hard
|
||||||
|
/// limit is usually 512000; I've personally seen it hit >2000.
|
||||||
|
///
|
||||||
|
/// * <https://www.freedesktop.org/software/systemd/man/systemd.exec.html#id-1.12.2.1.17.6>
|
||||||
|
/// * <https://github.com/systemd/systemd/commit/0abf94923b4a95a7d89bc526efc84e7ca2b71741>
|
||||||
|
#[cfg(unix)]
|
||||||
|
pub fn maximize_fd_limit() -> Result {
|
||||||
|
use nix::sys::resource::setrlimit;
|
||||||
|
|
||||||
|
let (soft_limit, hard_limit) = max_file_descriptors()?;
|
||||||
|
if soft_limit < hard_limit {
|
||||||
|
setrlimit(Resource::RLIMIT_NOFILE, hard_limit, hard_limit)?;
|
||||||
|
assert_eq!((hard_limit, hard_limit), max_file_descriptors()?, "getrlimit != setrlimit");
|
||||||
|
debug!(to = hard_limit, from = soft_limit, "Raised RLIMIT_NOFILE");
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
pub fn maximize_fd_limit() -> Result { Ok(()) }
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
pub fn max_file_descriptors() -> Result<(u64, u64)> {
|
||||||
|
getrlimit(Resource::RLIMIT_NOFILE).map_err(Into::into)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
pub fn max_file_descriptors() -> Result<(u64, u64)> { Ok((u64::MAX, u64::MAX)) }
|
||||||
@@ -51,7 +51,6 @@ pub fn new(args: Option<&Args>, runtime: Option<&runtime::Handle>) -> Result<Arc
|
|||||||
#[cfg(feature = "sentry_telemetry")]
|
#[cfg(feature = "sentry_telemetry")]
|
||||||
let sentry_guard = crate::sentry::init(&config);
|
let sentry_guard = crate::sentry::init(&config);
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
sys::maximize_fd_limit()
|
sys::maximize_fd_limit()
|
||||||
.expect("Unable to increase maximum soft and hard file descriptor limit");
|
.expect("Unable to increase maximum soft and hard file descriptor limit");
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user