Reorder removal so that mmap is removed before storage
This commit is contained in:
parent
816838cdf0
commit
00daae97ed
2 changed files with 15 additions and 8 deletions
|
|
@ -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 =
|
||||||
|
|
|
||||||
|
|
@ -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) => {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue