Reorder removal so that mmap is removed before storage

This commit is contained in:
Igor Katson 2024-09-13 00:20:37 +01:00
parent 816838cdf0
commit 00daae97ed
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
2 changed files with 15 additions and 8 deletions

View file

@ -8,6 +8,7 @@ use bitvec::{
vec::BitVec, vec::BitVec,
view::{AsBits, AsMutBits}, view::{AsBits, AsMutBits},
}; };
use tracing::trace;
pub trait BitV: Send + Sync { pub trait BitV: Send + Sync {
fn as_slice(&self) -> &BitSlice<u8, Msb0>; fn as_slice(&self) -> &BitSlice<u8, Msb0>;
@ -24,6 +25,12 @@ pub struct MmapBitV {
mmap: memmap2::MmapMut, mmap: memmap2::MmapMut,
} }
impl Drop for MmapBitV {
fn drop(&mut self) {
trace!("dropping MmapBitV, this should unmap the .bitv file")
}
}
impl MmapBitV { impl MmapBitV {
pub fn new(file: File) -> anyhow::Result<Self> { pub fn new(file: File) -> anyhow::Result<Self> {
let mmap = let mmap =

View file

@ -1251,14 +1251,6 @@ impl Session {
debug!("error pausing torrent before deletion: {e:?}") debug!("error pausing torrent before deletion: {e:?}")
} }
if let Some(p) = self.persistence.as_ref() {
if let Err(e) = p.delete(id).await {
error!(error=?e, "error deleting torrent from persistence database");
} else {
debug!(?id, "deleted torrent from persistence database")
}
}
let storage = removed let storage = removed
.with_state_mut(|s| match s.take() { .with_state_mut(|s| match s.take() {
ManagedTorrentState::Initializing(p) => p.files.take().ok(), ManagedTorrentState::Initializing(p) => p.files.take().ok(),
@ -1277,6 +1269,14 @@ impl Session {
.map(Ok) .map(Ok)
.unwrap_or_else(|| removed.shared.storage_factory.create(removed.shared())); .unwrap_or_else(|| removed.shared.storage_factory.create(removed.shared()));
if let Some(p) = self.persistence.as_ref() {
if let Err(e) = p.delete(id).await {
error!(error=?e, "error deleting torrent from persistence database");
} else {
debug!(?id, "deleted torrent from persistence database")
}
}
match (storage, delete_files) { match (storage, delete_files) {
(Err(e), true) => return Err(e).context("torrent deleted, but could not delete files"), (Err(e), true) => return Err(e).context("torrent deleted, but could not delete files"),
(Ok(storage), true) => { (Ok(storage), true) => {