fix(distributed): a server with no parent figures leaves our cap alone
The speed-derived child limit read a missing ratio as a refusal, so on any server that never announces ParentSpeedRatio — soulfind among them — the client carried no children at all, however it was configured. A ratio we were never told is not a decision: the server's figures set the limit only when it has given them, and otherwise the configured cap stands, which is how slskd runs throughout. A speed below the announced minimum still means none, which is the safety property the rule exists for. Also stops repeating AcceptChildren: it is a standing state on the server, so it goes out when the answer changes rather than on every message that happens to prompt a recount.
This commit is contained in:
@@ -1253,8 +1253,16 @@ impl Client {
|
||||
/// (`AcceptChildren`, code 100). Sent whenever that answer changes: the
|
||||
/// server only offers us to peers while it is true.
|
||||
fn announce_child_capacity(client_context: &Arc<RwLock<ClientContext>>) {
|
||||
let (sender, has_room) = match client_context.read_safe() {
|
||||
Ok(ctx) => (ctx.server_sender.clone(), ctx.children.has_room()),
|
||||
let (sender, has_room) = match client_context.write_safe() {
|
||||
Ok(mut ctx) => {
|
||||
// Only on a change: the server holds this as a standing
|
||||
// state, and repeating it on every message we happen to
|
||||
// receive would be noise.
|
||||
let Some(has_room) = ctx.accept_children_change() else {
|
||||
return;
|
||||
};
|
||||
(ctx.server_sender.clone(), has_room)
|
||||
}
|
||||
Err(_) => return,
|
||||
};
|
||||
let Some(sender) = sender else { return };
|
||||
|
||||
Reference in New Issue
Block a user