summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock32
-rw-r--r--Cargo.toml3
-rw-r--r--src/main.rs21
3 files changed, 55 insertions, 1 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 3480c01..7ddf487 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -382,6 +382,7 @@ dependencies = [
"jsonwebtoken",
"lazy_static",
"lru-cache",
+ "nix",
"num_cpus",
"opentelemetry",
"opentelemetry-jaeger",
@@ -533,7 +534,7 @@ dependencies = [
"autocfg",
"cfg-if",
"crossbeam-utils",
- "memoffset",
+ "memoffset 0.9.0",
"scopeguard",
]
@@ -1473,6 +1474,15 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "memoffset"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "memoffset"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
@@ -1514,6 +1524,20 @@ dependencies = [
]
[[package]]
+name = "nix"
+version = "0.26.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if",
+ "libc",
+ "memoffset 0.7.1",
+ "pin-utils",
+ "static_assertions",
+]
+
+[[package]]
name = "nom"
version = "7.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2674,6 +2698,12 @@ dependencies = [
]
[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
name = "subslice"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 9196cf4..7a157f4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -104,6 +104,9 @@ async-trait = "0.1.68"
sd-notify = { version = "0.4.1", optional = true }
+[target.'cfg(unix)'.dependencies]
+nix = { version = "0.26.2", features = ["resource"] }
+
[features]
default = ["conduit_bin", "backend_sqlite", "backend_rocksdb", "systemd"]
#backend_sled = ["sled"]
diff --git a/src/main.rs b/src/main.rs
index 579eeb1..eb7e833 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -54,6 +54,16 @@ static GLOBAL: Jemalloc = Jemalloc;
#[tokio::main]
async fn main() {
+ // 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)]
+ maximize_fd_limit().expect("should be able to increase the soft limit to the hard limit");
+
// Initialize DB
let raw_config =
Figment::new()
@@ -550,3 +560,14 @@ fn method_to_filter(method: Method) -> MethodFilter {
m => panic!("Unsupported HTTP method: {m:?}"),
}
}
+
+#[cfg(unix)]
+fn maximize_fd_limit() -> Result<(), nix::errno::Errno> {
+ use nix::sys::resource::{getrlimit, setrlimit, Resource};
+
+ let res = Resource::RLIMIT_NOFILE;
+
+ let (_, hard_limit) = getrlimit(res)?;
+
+ setrlimit(res, hard_limit, hard_limit)
+}