Skip to main content

risingwave_connector/connector_common/iceberg/
compaction.rs

1// Copyright 2025 RisingWave Labs
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15use ::iceberg::spec::{FormatVersion, TableMetadata};
16
17use crate::sink::catalog::SinkId;
18
19#[derive(Debug, Clone)]
20pub struct IcebergCommittedSnapshot {
21    pub branch: String,
22    pub snapshot_id: i64,
23    pub timestamp_ms: i64,
24    /// Inclusive file sequence number boundary for this snapshot. Iceberg V1
25    /// does not support file sequence numbers.
26    pub max_file_sequence_number: Option<i64>,
27}
28
29impl IcebergCommittedSnapshot {
30    /// Describes the head snapshot of `branch`, or returns `None` if the branch has no snapshot.
31    pub fn from_branch_head(metadata: &TableMetadata, branch: &str) -> Option<Self> {
32        metadata.snapshot_for_ref(branch).map(|snapshot| Self {
33            branch: branch.to_owned(),
34            snapshot_id: snapshot.snapshot_id(),
35            timestamp_ms: snapshot.timestamp_ms(),
36            max_file_sequence_number: (metadata.format_version() >= FormatVersion::V2)
37                .then_some(snapshot.sequence_number()),
38        })
39    }
40}
41
42#[derive(Debug, Clone)]
43pub struct IcebergSinkCompactionUpdate {
44    // runtime event information
45    pub sink_id: SinkId,
46    pub force_compaction: bool,
47    pub observed_snapshot: IcebergCommittedSnapshot,
48}