Skip to content

Commit 32625fc

Browse files
authored
fix(storage): read legacy bincode v4 segments (#20191)
* fix(storage): read legacy bincode v4 segments Decode bincode v4 segment block metas and summaries through v3 frozen metadata so old segment stats use the legacy bincode layout. Expose encoding, compression, and block_meta_size in fuse_segment for low-cost online diagnosis of segment metadata encoding. Add regression coverage for legacy bincode segments, current MessagePack segments, and the new fuse_segment diagnostic columns. * fix(storage): adapt segment tests to parquet metadata
1 parent c6d2891 commit 32625fc

6 files changed

Lines changed: 455 additions & 9 deletions

File tree

src/query/expression/src/converts/meta/bincode.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,15 @@ pub enum LegacyScalar {
4444
Decimal(DecimalScalar),
4545
Timestamp(i64),
4646
Date(i32),
47-
Interval(months_days_micros),
4847
Boolean(bool),
4948
String(Vec<u8>),
5049
Array(LegacyColumn),
5150
Map(LegacyColumn),
5251
Bitmap(Vec<u8>),
5352
Tuple(Vec<Scalar>),
5453
Variant(Vec<u8>),
54+
// Interval must be at end: old bincode data did not have this variant
55+
Interval(months_days_micros),
5556
}
5657

5758
#[allow(unused, dead_code)]

src/query/expression/tests/it/meta_scalar.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,12 +17,61 @@ use databend_common_expression::Scalar;
1717
use databend_common_expression::converts::meta::IndexScalar;
1818
use databend_common_expression::converts::meta::LegacyColumn;
1919
use databend_common_expression::converts::meta::LegacyScalar;
20+
use databend_common_expression::types::DecimalScalar;
21+
use databend_common_expression::types::NumberScalar;
2022
use databend_common_io::prelude::bincode_deserialize_from_slice;
2123
use databend_common_io::prelude::bincode_serialize_into_buf;
2224

2325
use crate::DataTypeFilter;
2426
use crate::rand_block_for_all_types;
2527

28+
#[allow(dead_code)]
29+
#[derive(serde::Serialize)]
30+
enum OldLegacyScalar {
31+
Null,
32+
EmptyArray,
33+
EmptyMap,
34+
Number(NumberScalar),
35+
Decimal(DecimalScalar),
36+
Timestamp(i64),
37+
Date(i32),
38+
Boolean(bool),
39+
String(Vec<u8>),
40+
Array(()),
41+
Map(()),
42+
Bitmap(Vec<u8>),
43+
Tuple(Vec<Scalar>),
44+
Variant(Vec<u8>),
45+
}
46+
47+
#[test]
48+
pub fn test_legacy_scalar_reads_old_bincode_layout() -> databend_common_exception::Result<()> {
49+
let old_scalars = vec![
50+
OldLegacyScalar::Boolean(true),
51+
OldLegacyScalar::String(b"abc".to_vec()),
52+
OldLegacyScalar::Tuple(vec![Scalar::String("tuple".to_string())]),
53+
OldLegacyScalar::Variant(vec![1, 2, 3]),
54+
];
55+
56+
let mut data = vec![];
57+
bincode_serialize_into_buf(&mut data, &old_scalars)?;
58+
let new_scalars: Vec<LegacyScalar> = bincode_deserialize_from_slice(&data)?;
59+
60+
let decoded = new_scalars
61+
.into_iter()
62+
.map(Scalar::from)
63+
.collect::<Vec<_>>();
64+
assert_eq!(decoded[0], Scalar::Boolean(true));
65+
assert_eq!(decoded[1], Scalar::String("abc".to_string()));
66+
assert_eq!(
67+
decoded[2],
68+
Scalar::Tuple(vec![Scalar::String("tuple".to_string())])
69+
);
70+
assert!(matches!(&decoded[3], Scalar::Variant(bytes) if bytes == &[1, 2, 3]));
71+
72+
Ok(())
73+
}
74+
2675
#[test]
2776
pub fn test_legacy_converts() -> databend_common_exception::Result<()> {
2877
use rand::Rng;

src/query/storages/common/table_meta/src/meta/v3/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
// we use "frozen" types of table meta, to make sure that the type we used for
1616
// bincode deserialization is compatible with the type we used for bincode serialization.
17-
mod frozen;
17+
pub(crate) mod frozen;
1818
mod segment;
1919
mod snapshot;
2020
mod table_snapshot_statistics;

0 commit comments

Comments
 (0)