mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-01-07 13:52:59 +00:00
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 <discord9@163.com> * docs: note Signed-off-by: discord9 <discord9@163.com> --------- Signed-off-by: discord9 <discord9@163.com>
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user