fix: not mark all deleted when partial trunc (#6654)

* fix: not mark all deleted when partial trunc&not update manifest when partial file range is empty

Signed-off-by: discord9 <discord9@163.com>

* docs: note

Signed-off-by: discord9 <discord9@163.com>

---------

Signed-off-by: discord9 <discord9@163.com>
This commit is contained in:
discord9
2025-08-05 19:45:47 +08:00
committed by GitHub
parent 875207d26c
commit e64469bbc4
2 changed files with 42 additions and 24 deletions

View File

@@ -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.

View File

@@ -37,7 +37,7 @@ impl<S: LogStore> RegionWorkerLoop<S> {
};
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<S: LogStore> RegionWorkerLoop<S> {
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<S: LogStore> RegionWorkerLoop<S> {
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.