Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions crates/metadata-store/src/metadata_store.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,17 @@ use bytes::BytesMut;
use bytestring::ByteString;
use metrics::{counter, histogram};
use tokio::time::Instant;
use tracing::debug;
use tracing::{debug, warn};

use restate_time_util::DurationExt;
use restate_types::errors::{
BoxedMaybeRetryableError, GenericError, IntoMaybeRetryable, MaybeRetryableError,
};
use restate_types::metadata::{Precondition, VersionedValue};
use restate_types::metadata::{GlobalMetadata, Precondition, VersionedValue};
use restate_types::metadata_store::keys::NODES_CONFIG_KEY;
use restate_types::nodes_config::NodesConfiguration;
use restate_types::retries::RetryPolicy;
use restate_types::schema::Schema;
use restate_types::storage::{StorageCodec, StorageDecode, StorageEncode, StorageEncodeError};
use restate_types::{Version, Versioned};

Expand All @@ -37,6 +38,8 @@ use crate::metric_definitions::{
#[cfg(feature = "test-util")]
use crate::test_util::InMemoryMetadataStore;

const METADATA_SIZE_WARNING: usize = 4 * 1024 * 1024; //4MB

#[derive(Debug, thiserror::Error)]
pub enum ReadError {
#[error("codec error: {0}")]
Expand Down Expand Up @@ -350,6 +353,7 @@ impl MetadataStoreClient {
let versioned_value =
serialize_value(value).map_err(|err| WriteError::Codec(err.into()))?;

self.warn_if_oversized(&key, &versioned_value);
self.inner.put(key, versioned_value, precondition).await
};

Expand Down Expand Up @@ -494,6 +498,34 @@ impl MetadataStoreClient {
) -> Result<bool, ProvisionError> {
self.inner.provision(nodes_configuration).await
}

fn warn_if_oversized(&self, key: &ByteString, value: &VersionedValue) {
let size = value.value.len();

if size < METADATA_SIZE_WARNING {
return;
}

match &key[..] {
Schema::KEY => {
warn!(
"Schema metadata is {size} bytes (soft limit {METADATA_SIZE_WARNING}). \
Remove unused deployments or services to keep metadata manageable."
);
}
NodesConfiguration::KEY => {
warn!(
"Nodes metadata is {size} bytes (soft limit {METADATA_SIZE_WARNING}). \
Remove dead nodes to keep metadata manageable."
);
}
_ => {
warn!(
"Metadata entry '{key}' is {size} bytes, above the soft limit of {METADATA_SIZE_WARNING} bytes."
);
}
}
}
}

pub fn serialize_value<T: Versioned + StorageEncode>(
Expand Down
Loading