From 22b7bdf9831c803eb71ecfca6477a77e7443523c Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Sun, 9 Mar 2025 14:57:01 +0400 Subject: [PATCH 1/2] configure stall protection grace period through env var --- bottomless/src/replicator.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/bottomless/src/replicator.rs b/bottomless/src/replicator.rs index 6f318fd125..9bc72376ff 100644 --- a/bottomless/src/replicator.rs +++ b/bottomless/src/replicator.rs @@ -7,7 +7,9 @@ use anyhow::{anyhow, bail}; use arc_swap::ArcSwapOption; use async_compression::tokio::write::{GzipEncoder, ZstdEncoder}; use aws_config::BehaviorVersion; -use aws_sdk_s3::config::{Credentials, Region, SharedCredentialsProvider}; +use aws_sdk_s3::config::{ + Credentials, Region, SharedCredentialsProvider, StalledStreamProtectionConfig, +}; use aws_sdk_s3::error::SdkError; use aws_sdk_s3::operation::get_object::builders::GetObjectFluentBuilder; use aws_sdk_s3::operation::get_object::GetObjectError; @@ -125,6 +127,8 @@ pub struct Options { pub skip_snapshot: bool, /// Skip uploading snapshots on shutdown pub skip_shutdown_upload: bool, + /// Stall protection grace period duration for AWS S3 client + pub stall_protection_grace_period: std::time::Duration, } impl Options { @@ -145,8 +149,13 @@ impl Options { "LIBSQL_BOTTOMLESS_AWS_SECRET_ACCESS_KEY was not set" ))?; let session_token: Option = self.session_token.clone(); + + let mut stall_protection = StalledStreamProtectionConfig::enabled(); + stall_protection.set_grace_period(Some(self.stall_protection_grace_period)); + let conf = loader .behavior_version(BehaviorVersion::latest()) + .stalled_stream_protection(stall_protection.build()) .region(Region::new(region)) .credentials_provider(SharedCredentialsProvider::new(Credentials::new( access_key_id, @@ -245,6 +254,11 @@ impl Options { let skip_shutdown_upload = env_var_or("LIBSQL_BOTTOMLESS_SKIP_SHUTDOWN_UPLOAD", false).parse::()?; + let stall_protection_grace_period_sec = + env_var_or("LIBSQL_S3_STALL_PROTECTION_GRACE_PERIOD_SEC", 20).parse::()?; + let stall_protection_grace_period = + std::time::Duration::from_secs(stall_protection_grace_period_sec); + Ok(Options { db_id, create_bucket_if_not_exists: true, @@ -263,6 +277,7 @@ impl Options { s3_max_retries, skip_snapshot, skip_shutdown_upload, + stall_protection_grace_period, }) } } From 7619de0a3fd4409ecee6690e091738aa242bb7d0 Mon Sep 17 00:00:00 2001 From: Nikita Sivukhin Date: Sun, 9 Mar 2025 15:15:50 +0400 Subject: [PATCH 2/2] fix compilation --- libsql-server/src/namespace/meta_store.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/libsql-server/src/namespace/meta_store.rs b/libsql-server/src/namespace/meta_store.rs index 721c83adc0..176cd48fa6 100644 --- a/libsql-server/src/namespace/meta_store.rs +++ b/libsql-server/src/namespace/meta_store.rs @@ -132,6 +132,7 @@ pub async fn metastore_connection_maker( s3_max_retries: 10, skip_snapshot: false, skip_shutdown_upload: false, + stall_protection_grace_period: std::time::Duration::from_secs(5 * 60), }; let mut replicator = bottomless::replicator::Replicator::with_options( db_path.join("data").to_str().unwrap(),