tweak shitty id handling - a bit better now
This commit is contained in:
parent
83592ca866
commit
2154ddf33e
1 changed files with 26 additions and 31 deletions
|
|
@ -4,7 +4,7 @@ use std::{
|
||||||
io::Read,
|
io::Read,
|
||||||
net::SocketAddr,
|
net::SocketAddr,
|
||||||
path::{Path, PathBuf},
|
path::{Path, PathBuf},
|
||||||
sync::Arc,
|
sync::{atomic::AtomicUsize, Arc},
|
||||||
time::Duration,
|
time::Duration,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -81,31 +81,12 @@ fn torrent_from_bytes(bytes: Bytes) -> anyhow::Result<ParsedTorrentFile> {
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct SessionDatabase {
|
pub struct SessionDatabase {
|
||||||
next_id: TorrentId,
|
|
||||||
torrents: HashMap<TorrentId, ManagedTorrentHandle>,
|
torrents: HashMap<TorrentId, ManagedTorrentHandle>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SessionDatabase {
|
impl SessionDatabase {
|
||||||
fn add_torrent(
|
fn add_torrent(&mut self, torrent: ManagedTorrentHandle, id: TorrentId) {
|
||||||
&mut self,
|
self.torrents.insert(id, torrent);
|
||||||
torrent: ManagedTorrentHandle,
|
|
||||||
preferred_id: Option<TorrentId>,
|
|
||||||
) -> TorrentId {
|
|
||||||
match preferred_id {
|
|
||||||
Some(id) if self.torrents.contains_key(&id) => {
|
|
||||||
warn!("id {id} already present in DB, ignoring \"preferred_id\" parameter");
|
|
||||||
}
|
|
||||||
Some(id) => {
|
|
||||||
self.torrents.insert(id, torrent);
|
|
||||||
self.next_id = id.max(self.next_id).wrapping_add(1);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
let idx = self.next_id;
|
|
||||||
self.torrents.insert(idx, torrent);
|
|
||||||
self.next_id = self.next_id.max(idx) + 1;
|
|
||||||
idx
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,6 +96,7 @@ pub struct Session {
|
||||||
persistence: Option<Box<dyn SessionPersistenceStore>>,
|
persistence: Option<Box<dyn SessionPersistenceStore>>,
|
||||||
peer_opts: PeerConnectionOptions,
|
peer_opts: PeerConnectionOptions,
|
||||||
spawner: BlockingSpawner,
|
spawner: BlockingSpawner,
|
||||||
|
next_id: AtomicUsize,
|
||||||
db: RwLock<SessionDatabase>,
|
db: RwLock<SessionDatabase>,
|
||||||
output_folder: PathBuf,
|
output_folder: PathBuf,
|
||||||
|
|
||||||
|
|
@ -562,6 +544,7 @@ impl Session {
|
||||||
peer_opts,
|
peer_opts,
|
||||||
spawner,
|
spawner,
|
||||||
output_folder: default_output_folder,
|
output_folder: default_output_folder,
|
||||||
|
next_id: AtomicUsize::new(0),
|
||||||
db: RwLock::new(Default::default()),
|
db: RwLock::new(Default::default()),
|
||||||
_cancellation_token_drop_guard: token.clone().drop_guard(),
|
_cancellation_token_drop_guard: token.clone().drop_guard(),
|
||||||
cancellation_token: token,
|
cancellation_token: token,
|
||||||
|
|
@ -1057,17 +1040,29 @@ impl Session {
|
||||||
builder.peer_read_write_timeout(t);
|
builder.peer_read_write_timeout(t);
|
||||||
}
|
}
|
||||||
|
|
||||||
let (managed_torrent, id) = {
|
let id = if let Some(id) = opts.preferred_id {
|
||||||
|
id
|
||||||
|
} else if let Some(p) = self.persistence.as_ref() {
|
||||||
|
p.next_id().await?
|
||||||
|
} else {
|
||||||
|
self.next_id
|
||||||
|
.fetch_add(1, std::sync::atomic::Ordering::Relaxed)
|
||||||
|
};
|
||||||
|
|
||||||
|
let managed_torrent = {
|
||||||
let mut g = self.db.write();
|
let mut g = self.db.write();
|
||||||
if let Some((id, handle)) = g.torrents.iter().find(|(_, t)| t.info_hash() == info_hash)
|
if let Some((id, handle)) = g.torrents.iter().find_map(|(eid, t)| {
|
||||||
{
|
if t.info_hash() == info_hash || *eid == id {
|
||||||
return Ok(AddTorrentResponse::AlreadyManaged(*id, handle.clone()));
|
Some((*eid, t.clone()))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}) {
|
||||||
|
return Ok(AddTorrentResponse::AlreadyManaged(id, handle));
|
||||||
}
|
}
|
||||||
let next_id = g.next_id;
|
let managed_torrent = builder.build(error_span!(parent: None, "torrent", id))?;
|
||||||
let managed_torrent =
|
g.add_torrent(managed_torrent.clone(), id);
|
||||||
builder.build(error_span!(parent: None, "torrent", id = next_id))?;
|
managed_torrent
|
||||||
let id = g.add_torrent(managed_torrent.clone(), opts.preferred_id);
|
|
||||||
(managed_torrent, id)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(p) = self.persistence.as_ref() {
|
if let Some(p) = self.persistence.as_ref() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue