mirror of
https://github.com/element-hq/synapse.git
synced 2026-08-14 20:10:26 +00:00
A checkout from the Rust connection pool (`ConnectionPool.connect`) previously blocked indefinitely while waiting for a free slot or establishing a new connection, so an unreachable or overloaded server could hang the worker threads handling requests forever. Bound the whole checkout with a configurable timeout: deadpool's `wait` and `create` timeouts (enabled via its `rt_tokio_1` runtime feature, driven on our own tokio runtime). Hitting it raises an OperationalError, which Synapse already treats as a retryable operational error. Configurable via the `pool_checkout_timeout` database option (milliseconds; default 30s, `0` disables), read by the Rust engine and plumbed to both the connection pool and the bootstrap (pool-of-one) connection. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W3G4M92AmwSSZCbmtMJU3d
100 lines
3.2 KiB
TOML
100 lines
3.2 KiB
TOML
[package]
|
|
# We name the package `synapse` so that things like logging have the right
|
|
# logging target.
|
|
name = "synapse"
|
|
|
|
# dummy version. See pyproject.toml for the Synapse's version number.
|
|
version = "0.1.0"
|
|
|
|
edition = "2021"
|
|
rust-version = "1.82.0"
|
|
|
|
[lib]
|
|
name = "synapse"
|
|
# We generate a `cdylib` for Python and a standard `lib` for running
|
|
# tests/benchmarks.
|
|
crate-type = ["lib", "cdylib"]
|
|
|
|
# This is deprecated, see tool.maturin in pyproject.toml.
|
|
# It is left here for compatibilty with maturin < 0.15.
|
|
[package.metadata.maturin]
|
|
# This is where we tell maturin where to place the built library.
|
|
name = "synapse.synapse_rust"
|
|
|
|
[dependencies]
|
|
async-trait = "0.1.89"
|
|
anyhow = "1.0.63"
|
|
base64 = "0.22.1"
|
|
bytes = "1.6.0"
|
|
# Matches the version postgres-protocol uses, for iterating a decoded array's
|
|
# elements (`ArrayValues` is a `FallibleIterator`); see database/postgres/value.rs.
|
|
fallible-iterator = "0.2"
|
|
headers = "0.4.0"
|
|
http = "1.1.0"
|
|
lazy_static = "1.4.0"
|
|
log = "0.4.17"
|
|
mime = "0.3.17"
|
|
pyo3 = { version = "0.28.3", features = [
|
|
"macros",
|
|
"anyhow",
|
|
"abi3",
|
|
"abi3-py310",
|
|
# So we can pass `bytes::Bytes` directly back to Python efficiently,
|
|
# https://docs.rs/pyo3/latest/pyo3/bytes/index.html
|
|
"bytes",
|
|
] }
|
|
pyo3-log = "0.13.3"
|
|
pythonize = { version = "0.28.0", features = ["arbitrary_precision"] }
|
|
regex = "1.6.0"
|
|
sha2 = "0.10.8"
|
|
serde = { version = "1.0.144", features = ["derive", "rc"] }
|
|
serde_json = { version = "1.0.85", features = [
|
|
"raw_value",
|
|
# We need to be able to parse arbitrary precision numbers, as some numbers
|
|
# in the database may be out of range of i64 (as Python uses arbitrary
|
|
# precision integers).
|
|
"arbitrary_precision",
|
|
] }
|
|
ulid = "1.1.2"
|
|
icu_segmenter = "2.0.0"
|
|
reqwest = { version = "0.12.15", default-features = false, features = [
|
|
"http2",
|
|
"stream",
|
|
"rustls-tls-native-roots",
|
|
] }
|
|
http-body-util = "0.1.3"
|
|
futures = "0.3.31"
|
|
tokio = { version = "1.44.2", features = ["rt", "rt-multi-thread"] }
|
|
tokio-postgres = "0.7"
|
|
# Connection pooling for the native Rust Postgres backend. We use the generic
|
|
# `deadpool::managed` pool with our own manager (rather than `deadpool-postgres`)
|
|
# so it reuses our `connect`/default-host logic and connection-task spawning.
|
|
# `rt_tokio_1` lets the pool enforce checkout timeouts (it sleeps via tokio time),
|
|
# which we drive on our own tokio runtime.
|
|
deadpool = { version = "0.12", features = ["rt_tokio_1"] }
|
|
once_cell = "1.18.0"
|
|
itertools = "0.14.0"
|
|
postgres-protocol = "0.6.10"
|
|
# Raw libpq bindings, used by `database::postgres::libpq` to resolve libpq's
|
|
# default host. Ships pre-generated bindings and links the system libpq itself,
|
|
# so — unlike a bindgen-based binding — the build needs no libclang.
|
|
pq-sys = "0.7.5"
|
|
# Use the `ring` crypto provider (not the default `aws-lc-rs`, which needs cmake
|
|
# and isn't available here) — `ring` is already in the tree via reqwest.
|
|
rustls = { version = "0.23", default-features = false, features = [
|
|
"ring",
|
|
"logging",
|
|
"std",
|
|
"tls12",
|
|
] }
|
|
rustls-native-certs = "0.8"
|
|
rustls-pemfile = "2"
|
|
tokio-postgres-rustls = { version = "0.14.0", default-features = false, features = [
|
|
"ring",
|
|
] }
|
|
|
|
[build-dependencies]
|
|
blake2 = "0.10.4"
|
|
hex = "0.4.3"
|
|
rustc_version = "0.4.1"
|