diff --git a/TODO.md b/TODO.md index 987dd0d..0bb33c0 100644 --- a/TODO.md +++ b/TODO.md @@ -30,4 +30,5 @@ refactor: - [x] start from error state should be possible from UI - [ ] if the torrent was completed, not need to re-check it -- [ ] checking is very slow on raspberry \ No newline at end of file +- [ ] 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 \ No newline at end of file diff --git a/crates/librqbit/Cargo.toml b/crates/librqbit/Cargo.toml index 1104017..9e18974 100644 --- a/crates/librqbit/Cargo.toml +++ b/crates/librqbit/Cargo.toml @@ -64,4 +64,4 @@ dashmap = "5.5.3" [dev-dependencies] futures = {version = "0.3"} -tracing-subscriber = "0.3" \ No newline at end of file +tracing-subscriber = "0.3" diff --git a/crates/librqbit/src/session.rs b/crates/librqbit/src/session.rs index c673eac..700fd2b 100644 --- a/crates/librqbit/src/session.rs +++ b/crates/librqbit/src/session.rs @@ -242,11 +242,11 @@ impl Session { Some(dht) }; let peer_opts = opts.peer_opts.unwrap_or_default(); - let session_filename = opts + let persistence_filename = opts .persistence_filename .unwrap_or_else(|| output_folder.join(".rqbit-session.json")); let session = Arc::new(Self { - persistence_filename: session_filename, + persistence_filename, peer_id, dht, peer_opts, @@ -298,34 +298,42 @@ impl Session { ); let db: SerializedSessionDatabase = serde_json::from_reader(&mut rdr).context("error deserializing session database")?; + let mut futures = Vec::new(); for storrent in db.torrents.into_iter() { let magnet = Magnet { info_hash: Id20::from_str(&storrent.info_hash) .context("error deserializing info_hash")?, trackers: storrent.trackers.into_iter().collect(), }; - if let Err(e) = self - .add_torrent( - AddTorrent::Url(Cow::Owned(magnet.to_string())), - Some(AddTorrentOptions { - paused: storrent.is_paused, - output_folder: Some( - storrent - .output_folder - .to_str() - .context("broken path")? - .to_owned(), - ), - only_files: storrent.only_files, - overwrite: true, - ..Default::default() - }), - ) - .await - { - error!("error adding torrent from stored session: {:?}", e) - } + futures.push({ + let session = self.clone(); + async move { + session + .add_torrent( + AddTorrent::Url(Cow::Owned(magnet.to_string())), + Some(AddTorrentOptions { + paused: storrent.is_paused, + output_folder: Some( + storrent + .output_folder + .to_str() + .context("broken path")? + .to_owned(), + ), + only_files: storrent.only_files, + overwrite: true, + ..Default::default() + }), + ) + .await + .map_err(|e| { + error!("error adding torrent from stored session: {:?}", e); + e + }) + } + }); } + futures::future::join_all(futures).await; Ok(()) }