Index: donkey/donkeyFiles.ml =================================================================== RCS file: /cvsroot/mldonkey/mldonkey/donkey/donkeyFiles.ml,v retrieving revision 1.25 diff -u -r1.25 donkeyFiles.ml --- donkey/donkeyFiles.ml 22 Dec 2002 03:03:00 -0000 1.25 +++ donkey/donkeyFiles.ml 29 Dec 2002 01:55:04 -0000 @@ -266,13 +266,15 @@ (* New sources: fake-connection 25 minutes before added *) let good_last_conn = last_time () -. 45. *. 60. in + let nall_sources = ref 0 in + let nfull_lists = ref 0 in + (* How many good sources is enough ? *) let good_threshold = !!max_sources_per_file * !!good_sources_threshold / 100 in List.iter (fun file -> (* First, remove sources older than max_sources_age *) let old_sources = ref [] in - let young_sources = ref [] in let nkept_sources = ref 0 in Intmap.iter (fun _ c -> @@ -282,21 +284,48 @@ | None -> if connection_last_conn c.client_connection_control < min_last_conn then old_sources := c :: !old_sources - else begin - young_sources := c :: !young_sources; + else incr nkept_sources - end ) file.file_sources; if !nkept_sources >= !!min_left_sources then List.iter (fun c -> remove_source file c ) !old_sources; + let len = Intmap.length file.file_sources in + if len >= !!max_sources_per_file then begin + nall_sources := !nall_sources + !!max_sources_per_file; + incr nfull_lists + end else + nall_sources := !nall_sources + len + ) !current_files; + let max_all_sources = (int_of_float !!min_reask_delay) * + !!max_clients_per_second in + if !nall_sources > max_all_sources then begin + if !nfull_lists = 0 then + incr nfull_lists; + max_sources_per_file =:= !!max_sources_per_file - + (!nall_sources - max_all_sources) / !nfull_lists; + if !!max_sources_per_file < !!min_left_sources then + max_sources_per_file =:= !!min_left_sources; + Printf.printf "[WARNING] More sources than what can be scheduled"; + print_newline (); + Printf.printf "Automatically decreasing max_sources_per_file to %d" !!max_sources_per_file; + print_newline () + end; + List.iter (fun file -> (* Do it only if we have more sources than we want *) (* Since the list should not grow once the max_sources_per_file limit is reached (see DonkeyGlobals.new_source), this can only happen in exceptional cases (user lowering max_sources_per_file ?) *) if file.file_nlocations > !!max_sources_per_file then begin + let young_sources = ref [] in + Intmap.iter (fun _ c -> + match c.client_sock with + None -> + young_sources := c :: !young_sources + | _ -> () + ) file.file_sources; let must_remove = mini (List.length !young_sources) (file.file_nlocations - !!max_sources_per_file) in let sources = List.sort (fun c1 c2 ->