Session: add all at once

This commit is contained in:
Igor Katson 2023-11-26 09:59:44 +00:00
parent c6b4e78747
commit 7292522139
No known key found for this signature in database
GPG key ID: B4EC22B66D61A3F5
3 changed files with 34 additions and 25 deletions

View file

@ -30,4 +30,5 @@ refactor:
- [x] start from error state should be possible from UI - [x] start from error state should be possible from UI
- [ ] if the torrent was completed, not need to re-check it - [ ] if the torrent was completed, not need to re-check it
- [ ] checking is very slow on raspberry - [ ] checking is very slow on raspberry
- [ ] .rqbit-session.json file has 0 bytes when disk full. I guess fs::rename does this when disk is full? at least on linux

View file

@ -64,4 +64,4 @@ dashmap = "5.5.3"
[dev-dependencies] [dev-dependencies]
futures = {version = "0.3"} futures = {version = "0.3"}
tracing-subscriber = "0.3" tracing-subscriber = "0.3"

View file

@ -242,11 +242,11 @@ impl Session {
Some(dht) Some(dht)
}; };
let peer_opts = opts.peer_opts.unwrap_or_default(); let peer_opts = opts.peer_opts.unwrap_or_default();
let session_filename = opts let persistence_filename = opts
.persistence_filename .persistence_filename
.unwrap_or_else(|| output_folder.join(".rqbit-session.json")); .unwrap_or_else(|| output_folder.join(".rqbit-session.json"));
let session = Arc::new(Self { let session = Arc::new(Self {
persistence_filename: session_filename, persistence_filename,
peer_id, peer_id,
dht, dht,
peer_opts, peer_opts,
@ -298,34 +298,42 @@ impl Session {
); );
let db: SerializedSessionDatabase = let db: SerializedSessionDatabase =
serde_json::from_reader(&mut rdr).context("error deserializing session database")?; serde_json::from_reader(&mut rdr).context("error deserializing session database")?;
let mut futures = Vec::new();
for storrent in db.torrents.into_iter() { for storrent in db.torrents.into_iter() {
let magnet = Magnet { let magnet = Magnet {
info_hash: Id20::from_str(&storrent.info_hash) info_hash: Id20::from_str(&storrent.info_hash)
.context("error deserializing info_hash")?, .context("error deserializing info_hash")?,
trackers: storrent.trackers.into_iter().collect(), trackers: storrent.trackers.into_iter().collect(),
}; };
if let Err(e) = self futures.push({
.add_torrent( let session = self.clone();
AddTorrent::Url(Cow::Owned(magnet.to_string())), async move {
Some(AddTorrentOptions { session
paused: storrent.is_paused, .add_torrent(
output_folder: Some( AddTorrent::Url(Cow::Owned(magnet.to_string())),
storrent Some(AddTorrentOptions {
.output_folder paused: storrent.is_paused,
.to_str() output_folder: Some(
.context("broken path")? storrent
.to_owned(), .output_folder
), .to_str()
only_files: storrent.only_files, .context("broken path")?
overwrite: true, .to_owned(),
..Default::default() ),
}), only_files: storrent.only_files,
) overwrite: true,
.await ..Default::default()
{ }),
error!("error adding torrent from stored session: {:?}", e) )
} .await
.map_err(|e| {
error!("error adding torrent from stored session: {:?}", e);
e
})
}
});
} }
futures::future::join_all(futures).await;
Ok(()) Ok(())
} }