Make signature threads configurable

This commit is contained in:
asonix 2023-07-26 23:04:04 -05:00
parent 78dcce5a08
commit 8071c6ce3f
7 changed files with 24 additions and 10 deletions

2
Cargo.lock generated
View file

@ -391,7 +391,7 @@ checksum = "3b13c32d80ecc7ab747b80c3784bce54ee8a7a0cc4fbda9bf4cda2cf6fe90854"
[[package]]
name = "ap-relay"
version = "0.3.90"
version = "0.3.91"
dependencies = [
"activitystreams",
"activitystreams-ext",

View file

@ -1,7 +1,7 @@
[package]
name = "ap-relay"
description = "A simple activitypub relay"
version = "0.3.90"
version = "0.3.91"
authors = ["asonix <asonix@asonix.dog>"]
license = "AGPL-3.0"
readme = "README.md"

View file

@ -108,6 +108,7 @@ PROMETHEUS_PORT=9000
CLIENT_TIMEOUT=10
CLIENT_POOL_SIZE=20
DELIVER_CONCURRENCY=8
SIGNATURE_THREADS=2
```
#### Descriptions
@ -168,6 +169,10 @@ files", you can either decrease this number or increase the ulimit for your syst
##### `DELIVER_CONCURRENCY`
Optional - How many deliver requests the relay should allow to be in-flight per thread. the default
is 8
##### `SIGNATURE_THREADS`
Optional - Override number of threads used for signing and verifying requests. Default is
`std::thread::available_parallelism()` (It tries to detect how many cores you have). If it cannot
detect the correct number of cores, it falls back to 1.
### Subscribing
Mastodon admins can subscribe to this relay by adding the `/inbox` route to their relay settings.

View file

@ -6,7 +6,7 @@
rustPlatform.buildRustPackage {
pname = "relay";
version = "0.3.90";
version = "0.3.91";
src = ./.;
cargoLock.lockFile = ./Cargo.lock;

View file

@ -48,6 +48,7 @@ pub(crate) struct ParsedConfig {
deliver_concurrency: u64,
client_timeout: u64,
client_pool_size: usize,
signature_threads: Option<usize>,
}
#[derive(Clone)]
@ -74,6 +75,7 @@ pub struct Config {
deliver_concurrency: u64,
client_timeout: u64,
client_pool_size: usize,
signature_threads: Option<usize>,
}
#[derive(Clone)]
@ -144,6 +146,7 @@ impl std::fmt::Debug for Config {
.field("deliver_concurrency", &self.deliver_concurrency)
.field("client_timeout", &self.client_timeout)
.field("client_pool_size", &self.client_pool_size)
.field("signature_threads", &self.signature_threads)
.finish()
}
}
@ -176,6 +179,7 @@ impl Config {
.set_default("deliver_concurrency", 8u64)?
.set_default("client_timeout", 10u64)?
.set_default("client_pool_size", 20u64)?
.set_default("signature_threads", None as Option<u64>)?
.add_source(Environment::default())
.build()?;
@ -250,6 +254,16 @@ impl Config {
deliver_concurrency: config.deliver_concurrency,
client_timeout: config.client_timeout,
client_pool_size: config.client_pool_size,
signature_threads: config.signature_threads,
})
}
pub(crate) fn signature_threads(&self) -> usize {
self.signature_threads.unwrap_or_else(|| {
std::thread::available_parallelism()
.map(usize::from)
.map_err(|e| tracing::warn!("Failed to get parallelism, {e}"))
.unwrap_or(1)
})
}

View file

@ -259,7 +259,7 @@ async fn do_server_main(
let keys = config.open_keys()?;
let spawner = Spawner::build()?;
let spawner = Spawner::build(config.signature_threads())?;
let bind_address = config.bind_address();
let server = HttpServer::new(move || {

View file

@ -461,12 +461,7 @@ pub(crate) struct Spawner {
}
impl Spawner {
pub(crate) fn build() -> std::io::Result<Self> {
let threads = std::thread::available_parallelism()
.map(usize::from)
.map_err(|e| tracing::warn!("Failed to get parallelism, {e}"))
.unwrap_or(1);
pub(crate) fn build(threads: usize) -> std::io::Result<Self> {
let (sender, receiver) = flume::bounded(8);
let (shutdown, shutdown_rx) = flume::bounded(threads);