diff --git a/pageserver/src/repository.rs b/pageserver/src/repository.rs index c726139524..1e74e0a915 100644 --- a/pageserver/src/repository.rs +++ b/pageserver/src/repository.rs @@ -33,6 +33,9 @@ impl Value { } } +/// The maximum size of a value supported by the pageserver +pub const MAX_VALUE_SIZE: usize = 10_000_000; + #[cfg(test)] mod test { use super::*; diff --git a/pageserver/src/tenant/storage_layer/inmemory_layer.rs b/pageserver/src/tenant/storage_layer/inmemory_layer.rs index 7c9103eea8..806dc85ccc 100644 --- a/pageserver/src/tenant/storage_layer/inmemory_layer.rs +++ b/pageserver/src/tenant/storage_layer/inmemory_layer.rs @@ -6,7 +6,7 @@ //! use crate::config::PageServerConf; use crate::context::{PageContentKind, RequestContext, RequestContextBuilder}; -use crate::repository::{Key, Value}; +use crate::repository::{Key, Value, MAX_VALUE_SIZE}; use crate::tenant::block_io::BlockReader; use crate::tenant::ephemeral_file::EphemeralFile; use crate::tenant::storage_layer::{ValueReconstructResult, ValueReconstructState}; @@ -284,6 +284,15 @@ impl InMemoryLayer { ) -> Result<()> { trace!("put_value key {} at {}/{}", key, self.timeline_id, lsn); + if let Value::Image(buf) = val { + if buf.len() > MAX_VALUE_SIZE { + tracing::warn!( + "Can't put value of size {} above limit {MAX_VALUE_SIZE} for key {key}", + buf.len() + ); + } + } + let off = { // Avoid doing allocations for "small" values. // In the regression test suite, the limit of 256 avoided allocations in 95% of cases: