46 |
|
|
47 |
module Udp = DonkeyProtoUdp |
module Udp = DonkeyProtoUdp |
48 |
|
|
49 |
|
let lprintf_nl () = |
50 |
|
lprintf "%s[EDK]: " |
51 |
|
(log_time ()); lprintf_nl2 |
52 |
|
|
53 |
(* Constants *) |
(* Constants *) |
54 |
let udp_requests_new = 5 |
let udp_requests_new = 5 |
55 |
let udp_requests_old = 3 |
let udp_requests_old = 3 |
126 |
List.iter ( |
List.iter ( |
127 |
fun file -> |
fun file -> |
128 |
if !verbose_location then |
if !verbose_location then |
129 |
lprintf "donkeyServers: TCP: Query Location of %s\n" |
lprintf_nl () "TCP: Query Location of %s" |
130 |
(file_best_name file); |
(file_best_name file); |
131 |
let module M = DonkeyProtoServer in |
let module M = DonkeyProtoServer in |
132 |
server_send sock ( M.QueryLocationReq file.file_md4 ) |
server_send sock ( M.QueryLocationReq file.file_md4 ) |
177 |
() |
() |
178 |
done; |
done; |
179 |
if !verbose_location then |
if !verbose_location then |
180 |
lprintf "donkeyServers: udp_query_source to: %2d old %2d new servers\n" |
lprintf_nl () "udp_query_source to: %2d old %2d new servers" |
181 |
(List.length !old_servers) (List.length !new_servers); |
(List.length !old_servers) (List.length !new_servers); |
182 |
|
|
183 |
try |
try |
205 |
) !old_servers; |
) !old_servers; |
206 |
|
|
207 |
with e -> |
with e -> |
208 |
lprintf "udp_query_sources: %s\n" (Printexc2.to_string e) |
lprintf_nl () "udp_query_sources: %s" (Printexc2.to_string e) |
209 |
|
|
210 |
|
|
211 |
|
|
259 |
s.server_last_message <- last_time (); |
s.server_last_message <- last_time (); |
260 |
|
|
261 |
if !verbose_msg_servers then begin |
if !verbose_msg_servers then begin |
262 |
lprintf "Message from server:\n"; |
lprintf_nl () "Message from server:"; |
263 |
DonkeyProtoServer.print t; lprintf "\n" |
DonkeyProtoServer.print t; lprint_newline () |
264 |
end; |
end; |
265 |
|
|
266 |
match t with |
match t with |
298 |
CommonEvent.add_event (Console_message_event msg) |
CommonEvent.add_event (Console_message_event msg) |
299 |
|
|
300 |
| M.ServerListReq l -> |
| M.ServerListReq l -> |
301 |
if !verbose then lprintf "donkeyServers: Received serverlist\n"; |
if !verbose then lprintf_nl () "donkeyServers: Received serverlist"; |
302 |
if !!update_server_list_server then |
if !!update_server_list_server then |
303 |
let module Q = M.ServerList in |
let module Q = M.ServerList in |
304 |
List.iter (fun s -> |
List.iter (fun s -> |
339 |
s.server_nfiles <- Int64.of_int files; |
s.server_nfiles <- Int64.of_int files; |
340 |
if (users < !!min_users_on_server && not s.server_preferred) then |
if (users < !!min_users_on_server && not s.server_preferred) then |
341 |
begin |
begin |
342 |
lprintf "%s:%d remove server min_users_on_server limit hit!\n" |
lprintf_nl () "%s:%d remove server min_users_on_server limit hit!" |
343 |
(Ip.to_string s.server_ip) s.server_port; |
(Ip.to_string s.server_ip) s.server_port; |
344 |
|
|
345 |
disconnect_server s Closed_for_timeout; |
disconnect_server s Closed_for_timeout; |
351 |
(* This can either be a reply to a QueryID or a indirect request for |
(* This can either be a reply to a QueryID or a indirect request for |
352 |
connection from another client. In this case, we should immediatly |
connection from another client. In this case, we should immediatly |
353 |
connect. *) |
connect. *) |
354 |
if !verbose then lprintf "donkeyServers: QueryIDReplyReq: received\n"; |
if !verbose then lprintf_nl () "QueryIDReplyReq: received"; |
355 |
let module Q = M.QueryIDReply in |
let module Q = M.QueryIDReply in |
356 |
if Ip.valid t.Q.ip && ip_reachable t.Q.ip then begin |
if Ip.valid t.Q.ip && ip_reachable t.Q.ip then begin |
357 |
try |
try |
359 |
None -> raise Not_found |
None -> raise Not_found |
360 |
| Some file -> |
| Some file -> |
361 |
if !verbose then |
if !verbose then |
362 |
lprintf "donkeyServers: QueryIDReplyReq: This was a QueryID reply !?\n"; |
lprintf_nl () "QueryIDReplyReq: This was a QueryID reply !?"; |
363 |
let s = DonkeySources.find_source_by_uid |
let s = DonkeySources.find_source_by_uid |
364 |
(Direct_address (t.Q.ip, t.Q.port)) in |
(Direct_address (t.Q.ip, t.Q.port)) in |
365 |
DonkeySources.set_request_result s file.file_sources |
DonkeySources.set_request_result s file.file_sources |
366 |
File_new_source |
File_new_source |
367 |
with _ -> |
with _ -> |
368 |
if !verbose then |
if !verbose then |
369 |
lprintf "donkeyServers: QueryIDReplyReq: Calling back to %s:%d\n" |
lprintf_nl () "QueryIDReplyReq: Calling back to %s:%d" |
370 |
(Ip.to_string t.Q.ip) t.Q.port; |
(Ip.to_string t.Q.ip) t.Q.port; |
371 |
let c = new_client (Direct_address (t.Q.ip, t.Q.port)) in |
let c = new_client (Direct_address (t.Q.ip, t.Q.port)) in |
372 |
DonkeyClient.reconnect_client c; |
DonkeyClient.reconnect_client c; |
374 |
|
|
375 |
| M.QueryIDFailedReq t -> |
| M.QueryIDFailedReq t -> |
376 |
if !verbose then |
if !verbose then |
377 |
lprintf "donkeyServers: QueryIDFailedReq:\n"; |
lprintf_nl () "QueryIDFailedReq:"; |
378 |
ignore (Fifo.take s.server_id_requests) |
ignore (Fifo.take s.server_id_requests) |
379 |
|
|
380 |
| M.QueryReplyReq t -> |
| M.QueryReplyReq t -> |
525 |
if !servers_list = [] then begin |
if !servers_list = [] then begin |
526 |
if !print_empty_list then begin |
if !print_empty_list then begin |
527 |
print_empty_list := false; |
print_empty_list := false; |
528 |
lprintf "Looks like you have no servers in your servers.ini\n"; |
lprintf_nl () "Looks like you have no servers in your servers.ini"; |
529 |
lprintf "You should either use the one provided with mldonkey\n"; |
lprintf_nl () "You should either use the one provided with mldonkey"; |
530 |
lprintf "or import one from the WEB\n"; |
lprintf_nl () "or import one from the WEB"; |
531 |
end; |
end; |
532 |
|
|
533 |
raise Not_found; |
raise Not_found; |
582 |
* clean serverlist |
* clean serverlist |
583 |
*) |
*) |
584 |
let remove_old_servers () = |
let remove_old_servers () = |
585 |
if !verbose then lprintf "REMOVE OLD SERVERS\n"; |
if !verbose then lprintf_nl () "REMOVE OLD SERVERS"; |
586 |
let t1 = Unix.gettimeofday () in |
let t1 = Unix.gettimeofday () in |
587 |
(* |
(* |
588 |
The new tactic: we sort the servers (the more recently connected first, |
The new tactic: we sort the servers (the more recently connected first, |
602 |
(connection_last_conn s.server_connection_control, s) :: !to_keep |
(connection_last_conn s.server_connection_control, s) :: !to_keep |
603 |
) servers_by_key; |
) servers_by_key; |
604 |
let t2 = Unix.gettimeofday () in |
let t2 = Unix.gettimeofday () in |
605 |
if !verbose then lprintf "Delay to detect black-listed servers: %2.2f\n" (t2 -. t1); |
if !verbose then lprintf_nl () "Delay to detect black-listed servers: %2.2f" (t2 -. t1); |
606 |
|
|
607 |
if List.length !to_keep > !!min_left_servers then begin |
if List.length !to_keep > !!min_left_servers then begin |
608 |
let array = Array.of_list !to_keep in |
let array = Array.of_list !to_keep in |
613 |
if !verbose then |
if !verbose then |
614 |
for i = 0 to Array.length array - 1 do |
for i = 0 to Array.length array - 1 do |
615 |
let ls, s = array.(i) in |
let ls, s = array.(i) in |
616 |
lprintf "server %d last_conn %d\n" (server_num s) ls; |
lprintf_nl () "server %d last_conn %d" (server_num s) ls; |
617 |
|
|
618 |
done; |
done; |
619 |
|
|
624 |
if ls < min_last_conn && s.server_sock = NoConnection |
if ls < min_last_conn && s.server_sock = NoConnection |
625 |
&& not s.server_preferred then begin |
&& not s.server_preferred then begin |
626 |
if !verbose then begin |
if !verbose then begin |
627 |
lprintf "Server too old: %s:%d\n" |
lprintf_nl () "Server too old: %s:%d" |
628 |
(Ip.to_string s.server_ip) s.server_port; |
(Ip.to_string s.server_ip) s.server_port; |
629 |
|
|
630 |
end; |
end; |
633 |
done; |
done; |
634 |
end; |
end; |
635 |
let t3 = Unix.gettimeofday () in |
let t3 = Unix.gettimeofday () in |
636 |
if !verbose then lprintf "Delay to detect old servers: %2.2f\n" (t3 -. t2); |
if !verbose then lprintf_nl () "Delay to detect old servers: %2.2f" (t3 -. t2); |
637 |
|
|
638 |
List.iter (fun s -> |
List.iter (fun s -> |
639 |
remove_server s.server_ip s.server_port |
remove_server s.server_ip s.server_port |
640 |
) !to_remove; |
) !to_remove; |
641 |
|
|
642 |
let t4 = Unix.gettimeofday () in |
let t4 = Unix.gettimeofday () in |
643 |
if !verbose then lprintf "Delay to finally remove servers: %2.2f\n" (t4 -. t3); |
if !verbose then lprintf_nl () "Delay to finally remove servers: %2.2f" (t4 -. t3); |
644 |
if (List.length !to_remove) > 0 || !verbose then |
if (List.length !to_remove) > 0 || !verbose then |
645 |
lprintf "Removed %d old edonkey servers.\n" (List.length !to_remove) |
lprintf_nl () "Removed %d old edonkey servers." (List.length !to_remove) |
646 |
|
|
647 |
|
|
648 |
(* Keep connecting to servers in the background. Don't stay connected to |
(* Keep connecting to servers in the background. Don't stay connected to |
683 |
if connection_can_try s.server_connection_control then |
if connection_can_try s.server_connection_control then |
684 |
begin |
begin |
685 |
if !verbose then |
if !verbose then |
686 |
lprintf "WALKER: try connect %s\n" |
lprintf_nl () "WALKER: try connect %s" |
687 |
(Ip.to_string s.server_ip); |
(Ip.to_string s.server_ip); |
688 |
connect_server s |
connect_server s |
689 |
end |
end |
691 |
begin |
begin |
692 |
delayed_list := s :: !delayed_list; |
delayed_list := s :: !delayed_list; |
693 |
if !verbose then |
if !verbose then |
694 |
lprintf "WALKER: connect %s delayed\n" |
lprintf_nl () "WALKER: connect %s delayed" |
695 |
(Ip.to_string s.server_ip); |
(Ip.to_string s.server_ip); |
696 |
end |
end |
697 |
| _ -> () |
| _ -> () |
742 |
match s.server_sock with |
match s.server_sock with |
743 |
| Connection _ -> |
| Connection _ -> |
744 |
if !verbose then begin |
if !verbose then begin |
745 |
lprintf "MASTER: OLD MASTER %s\n" (Ip.to_string s.server_ip); |
lprintf_nl () "MASTER: OLD MASTER %s" (Ip.to_string s.server_ip); |
746 |
end; |
end; |
747 |
masters := s :: !masters |
masters := s :: !masters |
748 |
| _ -> s.server_master <- false |
| _ -> s.server_master <- false |
749 |
) server_list; |
) server_list; |
750 |
let nmasters = ref (List.length !masters) in |
let nmasters = ref (List.length !masters) in |
751 |
|
|
752 |
if !verbose then begin |
if !verbose then |
753 |
lprintf "MASTER: nmaster %d\n\n" !nmasters; |
lprintf_nl () "MASTER: nmaster %d" !nmasters; |
|
end; |
|
754 |
|
|
755 |
let make_master s = |
let make_master s = |
756 |
(* normal servers don't have our SHARE, so send list if it becomes a master *) |
(* normal servers don't have our SHARE, so send list if it becomes a master *) |
757 |
do_if_connected s.server_sock (fun sock -> |
do_if_connected s.server_sock (fun sock -> |
758 |
if !verbose then begin |
if !verbose then |
759 |
lprintf " MASTER: %s\n" (Ip.to_string s.server_ip); |
lprintf_nl () " MASTER: %s" (Ip.to_string s.server_ip); |
|
end; |
|
760 |
s.server_master <- true; |
s.server_master <- true; |
761 |
incr nmasters; |
incr nmasters; |
762 |
|
|
778 |
if !nconnected_servers > max_allowed_connected_servers then |
if !nconnected_servers > max_allowed_connected_servers then |
779 |
begin |
begin |
780 |
if !verbose then |
if !verbose then |
781 |
lprintf "MASTER: DISCONNECT %s\n" (Ip.to_string s.server_ip); |
lprintf_nl () "MASTER: DISCONNECT %s" (Ip.to_string s.server_ip); |
782 |
nconnected_servers := !nconnected_servers - 3; |
nconnected_servers := !nconnected_servers - 3; |
783 |
do_if_connected s.server_sock (fun sock -> |
do_if_connected s.server_sock (fun sock -> |
784 |
(* We will disconnect from this server. |
(* We will disconnect from this server. |
797 |
- connection_last_conn s.server_connection_control |
- connection_last_conn s.server_connection_control |
798 |
in |
in |
799 |
if !verbose then |
if !verbose then |
800 |
lprintf "MASTER: Checking ip:%s ct:%d\n" (Ip.to_string s.server_ip) connection_time; |
lprintf_nl () "MASTER: Checking ip:%s ct:%d" (Ip.to_string s.server_ip) connection_time; |
801 |
if not s.server_master |
if not s.server_master |
802 |
&& (s.server_preferred |
&& (s.server_preferred |
803 |
|| connection_time > !!become_master_delay |
|| connection_time > !!become_master_delay |
808 |
if (!nmasters < max_allowed_connected_servers) then |
if (!nmasters < max_allowed_connected_servers) then |
809 |
begin |
begin |
810 |
if !verbose then |
if !verbose then |
811 |
lprintf " MASTER: RAISING %s (%Ld)\n" |
lprintf_nl () " MASTER: RAISING %s (%Ld)" |
812 |
(Ip.to_string s.server_ip) s.server_nusers; |
(Ip.to_string s.server_ip) s.server_nusers; |
813 |
make_master s |
make_master s |
814 |
end |
end |
827 |
then |
then |
828 |
begin |
begin |
829 |
if !verbose then |
if !verbose then |
830 |
lprintf |
lprintf_nl () |
831 |
" MASTER: RAISING %s (%Ld) instead of %s (%Ld)\n" |
" MASTER: RAISING %s (%Ld) instead of %s (%Ld)" |
832 |
(Ip.to_string s.server_ip) s.server_nusers |
(Ip.to_string s.server_ip) s.server_nusers |
833 |
(Ip.to_string ss.server_ip) ss.server_nusers; |
(Ip.to_string ss.server_ip) ss.server_nusers; |
834 |
ss.server_master <- false; |
ss.server_master <- false; |
842 |
) |
) |
843 |
) server_list; |
) server_list; |
844 |
if !verbose then |
if !verbose then |
845 |
lprintf "MASTER: clean %d connected %d masters\n" |
lprintf_nl () "MASTER: clean %d connected %d masters" |
846 |
!nconnected_servers !nmasters |
!nconnected_servers !nmasters |
847 |
|
|
848 |
|
|