diff --git a/pageserver/src/lib.rs b/pageserver/src/lib.rs index c160851b40..5bf93bc997 100644 --- a/pageserver/src/lib.rs +++ b/pageserver/src/lib.rs @@ -40,7 +40,7 @@ use tracing::info; /// format, bump this! /// Note that TimelineMetadata uses its own version number to track /// backwards-compatible changes to the metadata format. -pub const STORAGE_FORMAT_VERSION: u16 = 4; +pub const STORAGE_FORMAT_VERSION: u16 = 3; /// Minimal sorage format version with compression support pub const COMPRESSED_STORAGE_FORMAT_VERSION: u16 = 4; diff --git a/pageserver/src/tenant/storage_layer/image_layer.rs b/pageserver/src/tenant/storage_layer/image_layer.rs index ed490fed21..3ec5a89b21 100644 --- a/pageserver/src/tenant/storage_layer/image_layer.rs +++ b/pageserver/src/tenant/storage_layer/image_layer.rs @@ -396,8 +396,8 @@ impl ImageLayerInner { let actual_summary = Summary::des_prefix(summary_blk.as_ref()).context("deserialize first block")?; - if actual_summary.format_version > STORAGE_FORMAT_VERSION { - bail!("Forward compatibility of storage is not supported: current format version is {}, format version of layer {} is {}", STORAGE_FORMAT_VERSION, path, actual_summary.format_version); + if actual_summary.format_version > COMPRESSED_STORAGE_FORMAT_VERSION { + bail!("Forward compatibility of storage is not supported: current format version is {}, format version of layer {} is {}", COMPRESSED_STORAGE_FORMAT_VERSION, path, actual_summary.format_version); } if let Some(mut expected_summary) = summary { // assume backward compatibility @@ -697,10 +697,15 @@ impl ImageLayerWriterInner { /// async fn put_image(&mut self, key: Key, img: Bytes) -> anyhow::Result<()> { ensure!(self.key_range.contains(&key)); - let off = self - .blob_writer - .write_compressed_blob(img, self.compression) - .await?; + let off = if STORAGE_FORMAT_VERSION >= COMPRESSED_STORAGE_FORMAT_VERSION { + self.blob_writer + .write_compressed_blob(img, self.compression) + .await? + } else { + let (_img, res) = self.blob_writer.write_blob(img).await; + // TODO: re-use the buffer for `img` further upstack + res? + }; let mut keybuf: [u8; KEY_SIZE] = [0u8; KEY_SIZE]; key.write_to_byte_slice(&mut keybuf); self.tree.append(&keybuf, off)?; diff --git a/test_runner/regress/test_compatibility.py b/test_runner/regress/test_compatibility.py index 9f743e23be..5f815d3e6c 100644 --- a/test_runner/regress/test_compatibility.py +++ b/test_runner/regress/test_compatibility.py @@ -195,7 +195,6 @@ def test_backward_compatibility( @check_ondisk_data_compatibility_if_enabled @pytest.mark.xdist_group("compatibility") @pytest.mark.order(after="test_create_snapshot") -@pytest.mark.skip("Compression support breaks forward compatibility") def test_forward_compatibility( neon_env_builder: NeonEnvBuilder, test_output_dir: Path,