mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-05 20:42:54 +00:00
## Problem
Previously, we couldn't read from an in-memory layer while a batch was
being written to it. Vice-versa, we couldn't write to it while there
was an on-going read.
## Summary of Changes
The goal of this change is to improve concurrency. Writes happened
through a &mut self method so the enforcement was at the type system
level.
We attempt to improve by:
1. Adding interior mutability to EphemeralLayer. This involves wrapping
the buffered writer in a read-write lock.
2. Minimise the time that the read lock is held for. Only hold the read
lock while reading from the buffers (recently flushed or pending
flush). If we need to read from the file, drop the lock and allow IO
to be concurrent.
The new benchmark variants with concurrent reads improve between 70 to
200 percent (against main).
Benchmark results are in this
[commit](891f094ce6).
## Future Changes
We can push the interior mutability into the buffered writer. The
mutable tail goes under a read lock, the flushed part goes into an
ArcSwap and then we can read from anything that is flushed _without_ any
locking.
146 lines
4.0 KiB
TOML
146 lines
4.0 KiB
TOML
[package]
|
|
name = "pageserver"
|
|
version = "0.1.0"
|
|
edition = "2024"
|
|
license.workspace = true
|
|
|
|
[features]
|
|
default = []
|
|
# Enables test-only APIs, incuding failpoints. In particular, enables the `fail_point!` macro,
|
|
# which adds some runtime cost to run tests on outage conditions
|
|
testing = ["fail/failpoints", "pageserver_api/testing", "wal_decoder/testing", "pageserver_client/testing"]
|
|
|
|
fuzz-read-path = ["testing"]
|
|
|
|
# Enables benchmarking only APIs
|
|
benchmarking = []
|
|
|
|
[dependencies]
|
|
anyhow.workspace = true
|
|
arc-swap.workspace = true
|
|
async-compression.workspace = true
|
|
async-stream.workspace = true
|
|
bincode.workspace = true
|
|
bit_field.workspace = true
|
|
byteorder.workspace = true
|
|
bytes.workspace = true
|
|
camino-tempfile.workspace = true
|
|
camino.workspace = true
|
|
chrono = { workspace = true, features = ["serde"] }
|
|
clap = { workspace = true, features = ["string"] }
|
|
consumption_metrics.workspace = true
|
|
crc32c.workspace = true
|
|
either.workspace = true
|
|
enum-map.workspace = true
|
|
enumset = { workspace = true, features = ["serde"]}
|
|
fail.workspace = true
|
|
futures.workspace = true
|
|
hashlink.workspace = true
|
|
hex.workspace = true
|
|
http.workspace = true
|
|
http-utils.workspace = true
|
|
humantime-serde.workspace = true
|
|
humantime.workspace = true
|
|
hyper0.workspace = true
|
|
itertools.workspace = true
|
|
jsonwebtoken.workspace = true
|
|
md5.workspace = true
|
|
metrics.workspace = true
|
|
nix.workspace = true
|
|
num_cpus.workspace = true # hack to get the number of worker threads tokio uses
|
|
num-traits.workspace = true
|
|
once_cell.workspace = true
|
|
pageserver_api.workspace = true
|
|
pageserver_client.workspace = true # for ResponseErrorMessageExt TOOD refactor that
|
|
pageserver_compaction.workspace = true
|
|
pageserver_page_api.workspace = true
|
|
pem.workspace = true
|
|
pin-project-lite.workspace = true
|
|
postgres_backend.workspace = true
|
|
postgres_connection.workspace = true
|
|
postgres_ffi.workspace = true
|
|
postgres_ffi_types.workspace = true
|
|
postgres_initdb.workspace = true
|
|
postgres-protocol.workspace = true
|
|
postgres-types.workspace = true
|
|
posthog_client_lite.workspace = true
|
|
pprof.workspace = true
|
|
pq_proto.workspace = true
|
|
rand.workspace = true
|
|
range-set-blaze = { version = "0.1.16", features = ["alloc"] }
|
|
regex.workspace = true
|
|
remote_storage.workspace = true
|
|
reqwest.workspace = true
|
|
rpds.workspace = true
|
|
rustls.workspace = true
|
|
scopeguard.workspace = true
|
|
send-future.workspace = true
|
|
serde_json = { workspace = true, features = ["raw_value"] }
|
|
serde_path_to_error.workspace = true
|
|
serde_with.workspace = true
|
|
serde.workspace = true
|
|
smallvec.workspace = true
|
|
storage_broker.workspace = true
|
|
strum_macros.workspace = true
|
|
strum.workspace = true
|
|
sysinfo.workspace = true
|
|
tenant_size_model.workspace = true
|
|
thiserror.workspace = true
|
|
tikv-jemallocator.workspace = true
|
|
tokio = { workspace = true, features = ["process", "sync", "fs", "rt", "io-util", "time"] }
|
|
tokio-epoll-uring.workspace = true
|
|
tokio-io-timeout.workspace = true
|
|
tokio-postgres.workspace = true
|
|
tokio-rustls.workspace = true
|
|
tokio-stream.workspace = true
|
|
tokio-tar.workspace = true
|
|
tokio-util.workspace = true
|
|
toml_edit = { workspace = true, features = [ "serde" ] }
|
|
tonic.workspace = true
|
|
tonic-reflection.workspace = true
|
|
tower.workspace = true
|
|
tracing.workspace = true
|
|
tracing-utils.workspace = true
|
|
url.workspace = true
|
|
utils.workspace = true
|
|
wal_decoder.workspace = true
|
|
walkdir.workspace = true
|
|
workspace_hack.workspace = true
|
|
twox-hash.workspace = true
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
procfs.workspace = true
|
|
|
|
[dev-dependencies]
|
|
criterion.workspace = true
|
|
hex-literal.workspace = true
|
|
tokio = { workspace = true, features = ["process", "sync", "fs", "rt", "io-util", "time", "test-util"] }
|
|
indoc.workspace = true
|
|
uuid.workspace = true
|
|
rstest.workspace = true
|
|
|
|
[[bench]]
|
|
name = "bench_layer_map"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "bench_walredo"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "bench_ingest"
|
|
harness = false
|
|
required-features = ["benchmarking"]
|
|
|
|
[[bench]]
|
|
name = "upload_queue"
|
|
harness = false
|
|
|
|
[[bench]]
|
|
name = "bench_metrics"
|
|
harness = false
|
|
|
|
[[bin]]
|
|
name = "test_helper_slow_client_reads"
|
|
required-features = [ "testing" ]
|