Skip to content

Commit 4491789

Browse files
committed
fix: only remove file handles once a deleted segment actually drops
1 parent c1684bd commit 4491789

File tree

2 files changed

+6
-18
lines changed

2 files changed

+6
-18
lines changed

src/compaction/worker.rs

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -484,17 +484,6 @@ fn merge_segments(
484484
levels.show_segments(payload.segment_ids.iter().copied());
485485
drop(levels);
486486

487-
log::trace!(
488-
"Closing file handles for old segment files: {:?}",
489-
payload.segment_ids
490-
);
491-
492-
for segment_id in &payload.segment_ids {
493-
opts.config
494-
.descriptor_table
495-
.remove((opts.tree_id, *segment_id).into());
496-
}
497-
498487
log::trace!("Compaction successful");
499488

500489
Ok(())
@@ -548,11 +537,6 @@ fn drop_segments(
548537
segment.mark_as_deleted();
549538
}
550539

551-
for key in segment_ids {
552-
log::trace!("Closing file handles for segment data file");
553-
opts.config.descriptor_table.remove(*key);
554-
}
555-
556540
log::trace!("Dropped {} segments", segment_ids.len());
557541

558542
Ok(())

src/segment/inner.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,14 +42,18 @@ pub struct Inner {
4242

4343
impl Drop for Inner {
4444
fn drop(&mut self) {
45+
let global_id = (self.tree_id, self.metadata.id).into();
46+
4547
if self.is_deleted.load(std::sync::atomic::Ordering::Acquire) {
4648
if let Err(e) = std::fs::remove_file(&self.path) {
4749
log::warn!(
48-
"Failed to cleanup deleted segment {} at {:?}: {e:?}",
49-
self.metadata.id,
50+
"Failed to cleanup deleted segment {global_id:?} at {:?}: {e:?}",
5051
self.path,
5152
);
5253
}
5354
}
55+
56+
log::trace!("Closing file handles for old segment file {global_id:?}",);
57+
self.descriptor_table.remove(global_id);
5458
}
5559
}

0 commit comments

Comments
 (0)