From e64469bbc444aea0a6240efc8c76ad1406a8944b Mon Sep 17 00:00:00 2001 From: discord9 <55937128+discord9@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:45:47 +0800 Subject: [PATCH] fix: not mark all deleted when partial trunc (#6654) * fix: not mark all deleted when partial trunc¬ update manifest when partial file range is empty Signed-off-by: discord9 * docs: note Signed-off-by: discord9 --------- Signed-off-by: discord9 --- src/mito2/src/region/version.rs | 42 +++++++++++++++---------- src/mito2/src/worker/handle_truncate.rs | 24 +++++++++----- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/mito2/src/region/version.rs b/src/mito2/src/region/version.rs index 5c740c3071..bf425f9f7f 100644 --- a/src/mito2/src/region/version.rs +++ b/src/mito2/src/region/version.rs @@ -209,27 +209,35 @@ impl VersionControl { next_memtable_id, Some(part_duration), )); - let new_version = match truncate_kind { + match truncate_kind { TruncateKind::All { truncated_entry_id, truncated_sequence, - } => Arc::new( - VersionBuilder::new(version.metadata.clone(), new_mutable) - .flushed_entry_id(truncated_entry_id) - .flushed_sequence(truncated_sequence) - .truncated_entry_id(Some(truncated_entry_id)) - .build(), - ), - TruncateKind::Partial { files_to_remove } => Arc::new( - VersionBuilder::from_version(version) - .remove_files(files_to_remove.into_iter()) - .build(), - ), - }; + } => { + let new_version = Arc::new( + VersionBuilder::new(version.metadata.clone(), new_mutable) + .flushed_entry_id(truncated_entry_id) + .flushed_sequence(truncated_sequence) + .truncated_entry_id(Some(truncated_entry_id)) + .build(), + ); - let mut version_data = self.data.write().unwrap(); - version_data.version.ssts.mark_all_deleted(); - version_data.version = new_version; + let mut version_data = self.data.write().unwrap(); + version_data.version.ssts.mark_all_deleted(); + version_data.version = new_version; + } + TruncateKind::Partial { files_to_remove } => { + let new_version = Arc::new( + VersionBuilder::from_version(version) + .remove_files(files_to_remove.into_iter()) + .build(), + ); + + let mut version_data = self.data.write().unwrap(); + // notice since it's partial, no need to mark all files as deleted + version_data.version = new_version; + } + }; } /// Overwrites the current version with a new version. diff --git a/src/mito2/src/worker/handle_truncate.rs b/src/mito2/src/worker/handle_truncate.rs index d571b99abe..13e7fa2520 100644 --- a/src/mito2/src/worker/handle_truncate.rs +++ b/src/mito2/src/worker/handle_truncate.rs @@ -37,7 +37,7 @@ impl RegionWorkerLoop { }; let version_data = region.version_control.current(); - let truncate = match req { + match req { RegionTruncateRequest::All => { info!("Try to fully truncate region {}", region_id); @@ -45,13 +45,15 @@ impl RegionWorkerLoop { let truncated_sequence = version_data.committed_sequence; // Write region truncated to manifest. - RegionTruncate { + let truncate = RegionTruncate { region_id, kind: TruncateKind::All { truncated_entry_id, truncated_sequence, }, - } + }; + + self.handle_manifest_truncate_action(region, truncate, sender); } RegionTruncateRequest::ByTimeRanges { time_ranges } => { info!( @@ -79,16 +81,24 @@ impl RegionWorkerLoop { files_to_truncate.len(), region_id ); - RegionTruncate { + + // this could happen if all files are not fully contained in the time ranges + if files_to_truncate.is_empty() { + info!("No files to truncate in region {}", region_id); + // directly send success back as no files to truncate + // and no background notify is needed + sender.send(Ok(0)); + return; + } + let truncate = RegionTruncate { region_id, kind: TruncateKind::Partial { files_to_remove: files_to_truncate, }, - } + }; + self.handle_manifest_truncate_action(region, truncate, sender); } }; - - self.handle_manifest_truncate_action(region, truncate, sender); } /// Handles truncate result.