the thing actually works pretty good now
This commit is contained in:
parent
0f431621b9
commit
5c5cf3c24a
2 changed files with 26 additions and 5 deletions
24
TODO.md
24
TODO.md
|
|
@ -8,5 +8,27 @@
|
||||||
- [ ] per-file stats
|
- [ ] per-file stats
|
||||||
- [ ] per-peer stats
|
- [ ] per-peer stats
|
||||||
|
|
||||||
|
- [ ] slow peers cause slowness in the end, need the "end of game" algorithm
|
||||||
|
- [ ] will require implementing cancel message
|
||||||
|
|
||||||
someday:
|
someday:
|
||||||
- [ ] cancellation
|
- [ ] cancellation from the client-side for the lib (i.e. stop the torrent manager)
|
||||||
|
|
||||||
|
|
||||||
|
# concurrency
|
||||||
|
it's fucked up now, so need to rethink.
|
||||||
|
|
||||||
|
Sequencing:
|
||||||
|
- when the peer sends bitfield
|
||||||
|
- update its bitfield
|
||||||
|
- this can only happen at the start. But it can also NOT happen at all (if the peer wants to download)
|
||||||
|
- so we actually cannot use it as a trigger to start the "uploader" of it (where we upload to it)
|
||||||
|
- however both this and "have" we can use as a trigger to start the "downloader" part of it
|
||||||
|
- when the peer sends "interested"
|
||||||
|
- when the peer sends "have"
|
||||||
|
- update its bitfield
|
||||||
|
|
||||||
|
"peer downloader":
|
||||||
|
- if started, means there was some initial interest
|
||||||
|
- if we are unchoked:
|
||||||
|
- fetch new pieces forever from the queue, send requests
|
||||||
|
|
@ -791,11 +791,11 @@ impl TorrentManager {
|
||||||
.peers
|
.peers
|
||||||
.update_bitfield_from_vec(handle, bitfield.0);
|
.update_bitfield_from_vec(handle, bitfield.0);
|
||||||
if !self.am_i_interested_in_peer(handle) {
|
if !self.am_i_interested_in_peer(handle) {
|
||||||
self.inner.locked.write().peers.drop_peer(handle);
|
// self.inner.locked.write().peers.drop_peer(handle);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Additional spawn per peer.
|
// Additional spawn per peer, not good.
|
||||||
spawn(
|
spawn(
|
||||||
format!("peer_chunk_requester({})", handle),
|
format!("peer_chunk_requester({})", handle),
|
||||||
self.clone().task_peer_chunk_requester(handle),
|
self.clone().task_peer_chunk_requester(handle),
|
||||||
|
|
@ -1375,8 +1375,7 @@ impl TorrentManager {
|
||||||
match tokio::time::timeout(keep_alive_interval, outgoing_chan.recv()).await {
|
match tokio::time::timeout(keep_alive_interval, outgoing_chan.recv()).await {
|
||||||
Ok(Some(msg)) => msg,
|
Ok(Some(msg)) => msg,
|
||||||
Ok(None) => {
|
Ok(None) => {
|
||||||
// we were closed
|
anyhow::bail!("closing writer, channel closed")
|
||||||
return Ok(());
|
|
||||||
}
|
}
|
||||||
Err(_) => MessageOwned::KeepAlive,
|
Err(_) => MessageOwned::KeepAlive,
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue