diff --git a/libs/pageserver_api/src/models.rs b/libs/pageserver_api/src/models.rs index 318dd307d7..608459c4c3 100644 --- a/libs/pageserver_api/src/models.rs +++ b/libs/pageserver_api/src/models.rs @@ -470,6 +470,7 @@ pub enum CompactionAlgorithm { #[strum(serialize_all = "kebab-case")] pub enum ImageCompressionAlgorithm { Zstd, + ZstdHigh, LZ4, } diff --git a/pageserver/ctl/src/layers.rs b/pageserver/ctl/src/layers.rs index 7373d7efe5..d0735cb1b6 100644 --- a/pageserver/ctl/src/layers.rs +++ b/pageserver/ctl/src/layers.rs @@ -303,6 +303,8 @@ pub(crate) async fn main(cmd: &LayerCmd) -> Result<()> { println!("Listing gave {} keys", files_list.keys.len()); + tokio::fs::create_dir_all(&layers_dir).await?; + let semaphore = Arc::new(Semaphore::new(parallelism.unwrap_or(1) as usize)); let mut tasks = JoinSet::new(); diff --git a/pageserver/src/tenant/blob_io.rs b/pageserver/src/tenant/blob_io.rs index 919b1a5162..99ddcf6f7c 100644 --- a/pageserver/src/tenant/blob_io.rs +++ b/pageserver/src/tenant/blob_io.rs @@ -11,6 +11,7 @@ //! len < 128: 0XXXXXXX //! len >= 128: 1XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX //! +use async_compression::Level; use bytes::{BufMut, BytesMut}; use pageserver_api::models::ImageCompressionAlgorithm; use tokio::io::AsyncWriteExt; @@ -266,9 +267,16 @@ impl BlobWriter { const ZSTD: u8 = UNCOMPRESSED | 0x10; const LZ4: u8 = UNCOMPRESSED | 0x20; let (high_bit_mask, len_written, srcbuf) = match algorithm { - Some(ImageCompressionAlgorithm::Zstd) => { + Some(ImageCompressionAlgorithm::Zstd | ImageCompressionAlgorithm::ZstdHigh) => { let mut encoder = - async_compression::tokio::write::ZstdEncoder::new(Vec::new()); + if matches!(algorithm, Some(ImageCompressionAlgorithm::ZstdHigh)) { + async_compression::tokio::write::ZstdEncoder::with_quality( + Vec::new(), + Level::Precise(6), + ) + } else { + async_compression::tokio::write::ZstdEncoder::new(Vec::new()) + }; let slice = srcbuf.slice(..); encoder.write_all(&slice[..]).await.unwrap(); encoder.flush().await.unwrap(); diff --git a/pageserver/src/tenant/storage_layer/image_layer.rs b/pageserver/src/tenant/storage_layer/image_layer.rs index c1cb328bad..b337a14160 100644 --- a/pageserver/src/tenant/storage_layer/image_layer.rs +++ b/pageserver/src/tenant/storage_layer/image_layer.rs @@ -382,6 +382,7 @@ impl ImageLayer { let image_compressions = [ None, Some(ImageCompressionAlgorithm::Zstd), + Some(ImageCompressionAlgorithm::ZstdHigh), Some(ImageCompressionAlgorithm::LZ4), ]; let mut stats = Vec::new();