[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Mldonkey-commits] Changes to mldonkey/src/networks/donkey/donkeyOvernet
From: |
mldonkey-commits |
Subject: |
[Mldonkey-commits] Changes to mldonkey/src/networks/donkey/donkeyOvernet.ml |
Date: |
Thu, 27 Oct 2005 17:32:54 -0400 |
Index: mldonkey/src/networks/donkey/donkeyOvernet.ml
diff -u mldonkey/src/networks/donkey/donkeyOvernet.ml:1.54
mldonkey/src/networks/donkey/donkeyOvernet.ml:1.55
--- mldonkey/src/networks/donkey/donkeyOvernet.ml:1.54 Tue Oct 25 10:30:58 2005
+++ mldonkey/src/networks/donkey/donkeyOvernet.ml Thu Oct 27 21:32:53 2005
@@ -50,9 +50,8 @@
mutable peer_port : int;
mutable peer_tcpport : int;
mutable peer_kind : int;
- mutable peer_expire : int;
+ mutable peer_last_recv : int;
mutable peer_last_send : int;
- peer_created : int;
}
type search_kind =
@@ -137,14 +136,10 @@
| OvernetUnknown21 of peer
let print_peer buf p =
- let hours = (last_time () - p.peer_created) / 3600 in
- let mins = (last_time () - p.peer_created) / 60 in
- Printf.bprintf buf " { md4 = %s ip = %s port = %d %s kind = %d l_send = %d
expire = %d created = %d h = %d mins = %d %s}\n"
+ Printf.bprintf buf " { md4 = %s ip = %s port = %d %s kind = %d l_send = %d
l_recv = %d}\n"
(Md4.to_string p.peer_md4) (Ip.to_string p.peer_ip) p.peer_port
(if p.peer_tcpport <> 0 then Printf.sprintf "tcp = %d" p.peer_tcpport
- else "") p.peer_kind p.peer_last_send p.peer_expire p.peer_created
- hours mins (if p.peer_expire > last_time () && p.peer_last_send <> 0 then
"OK " else "")
-
+ else "") p.peer_kind p.peer_last_send p.peer_last_recv
let message_to_string t =
let buf = Buffer.create 100 in
@@ -279,12 +274,12 @@
search_md4 : Md4.t;
mutable search_kind : search_for;
+ search_known_peers : (Ip.t * int, peer) Hashtbl.t;
search_waiting_peers : peer Fifo.t array;
search_asked_peers : peer Fifo.t array;
search_ok_peers : peer Fifo.t array;
mutable search_queries : int;
- (* TODO: search_requests is not used ? *)
mutable search_requests : int;
mutable search_start : int;
mutable search_results : (Md4.t, tag list) Hashtbl.t;
@@ -331,7 +326,10 @@
*********************************************************************)
let max_peers_per_bucket = 20
-let max_peers_per_prebucket = 40
+let max_peers_per_prebucket = 100
+let min_peers_per_block = 16 (* was 2 *)
+let min_peers_before_connect = 5
+let max_searches_for_publish = 5
let max_search_queries = 64
let max_search_requests = 20
let max_boot_peers = 200
@@ -422,18 +420,6 @@
*********************************************************************)
-let dummy_peer =
- {
- peer_md4 = Md4.null;
- peer_ip = Ip.null;
- peer_port = 0;
- peer_tcpport = 0;
- peer_kind = 0;
- peer_expire = 0;
- peer_last_send = 0;
- peer_created = last_time ();
- }
-
let connected_peers = ref 0
let pre_connected_peers = ref 0
@@ -543,15 +529,8 @@
let buckets = Array.init 129 (fun _ -> Fifo.create ())
let prebuckets = Array.init 129 (fun _ -> Fifo.create ())
+let known_peers = Hashtbl.create 127
let to_ping = ref []
-module KnownPeers = Weak.Make(struct
- type t = peer
- let hash c = Hashtbl.hash (c.peer_ip, c.peer_port)
- let equal x y = x.peer_port = y.peer_port
- && x.peer_ip = y.peer_ip
- end)
-
-let known_peers = KnownPeers.create 1023
(*
We keep the data in buckets depending on the number of bits they have
@@ -714,31 +693,6 @@
let debug_client ip = false
(* Ip.matches ip !!overnet_debug_clients *)
-let checking_kind p =
-(* according to eMule 0.46c *)
- if (last_time () - p.peer_last_send) < 10 ||
- p.peer_kind = 4 then () else begin
- p.peer_kind <- p.peer_kind + 1;
- p.peer_expire <- last_time () + 120;
- end;
- ()
-
-let new_peer_message p =
-(* lprintf () "*** Updating time for %s:%d\n" (Ip.to_string p.peer_ip)
p.peer_port; *)
- let calc_peer_kind p =
- (* according to eMule 0.46c *)
- let hours = (last_time () - p.peer_created) / 3600 in
- let lt = last_time () in
- match hours with
- 0 -> (2, lt + 3600) (* new kind 2, 1h timeout to ping *)
- | 1 -> (1, lt + 5400) (* kind 1, 1 1/2h timeout *)
- | _ -> (0, lt + 7200) (* kind 0, 2h timeout *)
- in
- let (new_kind,new_expire) = calc_peer_kind p in
- p.peer_kind <- new_kind;
- p.peer_expire <- new_expire;
- ()
-
let udp_send_direct ip port msg =
match !udp_sock with
None -> ()
@@ -757,25 +711,21 @@
let bootstrap ip port =
if !!overnet_update_nodes && is_overnet_ip ip &&
- port <> 0 && not (KnownPeers.mem known_peers { dummy_peer with peer_port
= port ; peer_ip = ip } ) then
+ port <> 0 && not (Hashtbl.mem known_peers (ip,port)) then
LimitedList.add unknown_peers (ip,port)
let new_peer p =
let ip = p.peer_ip in
- let port = p.peer_port in
-
- if ip <> Ip.localhost && is_overnet_ip ip && port <> 0 then
-
-
+ if ip <> Ip.localhost && is_overnet_ip ip &&
+ p.peer_port <> 0 then
+ let key = (p.peer_ip, p.peer_port) in
try
- let pp = KnownPeers.find known_peers p in
- (* TODO: check for changes in ip:port? Or Hash? *)
+ let pp = Hashtbl.find known_peers key in
+ if pp.peer_last_recv < p.peer_last_recv then
+ pp.peer_last_recv <- p.peer_last_recv;
pp
with _ ->
-(* Add the peer to the table of known peers *)
- KnownPeers.add known_peers p;
-
let bucket = bucket_number p.peer_md4 in
(* First, enter the peer in the boot_peers to be able to use at next
restart. *)
@@ -791,10 +741,20 @@
let l = last_time () - 1800 in
let pp = Fifo.take prebuckets.(bucket) in
Fifo.put prebuckets.(bucket)
-(* If the head of the bucket is not dead we should keep it *)
- (if pp.peer_kind < 4 || pp.peer_expire > last_time () then pp
else p);
+(* If we heard of the head of the bucket in the last 30 minutes, we should
+ keep it. *)
+ (if pp.peer_last_recv > l then pp else p);
+ if pp.peer_last_recv <= l then
+ begin
+(* Add the peer to the table of known peers *)
+ Hashtbl.add known_peers key p;
+(* And remove pp *)
+ let ppkey = (pp.peer_ip, pp.peer_port) in
+ Hashtbl.remove known_peers ppkey
+ end
end
else begin
+ Hashtbl.add known_peers key p;
Fifo.put prebuckets.(bucket) p;
incr pre_connected_peers
end
@@ -802,6 +762,7 @@
else if !n_used_buckets < 128 && bucket <> 128 then begin
Fifo.put prebuckets.(!n_used_buckets) p;
incr pre_connected_peers;
+ Hashtbl.add known_peers key p;
while !n_used_buckets < 128 &&
Fifo.length prebuckets.(!n_used_buckets)
@@ -809,10 +770,10 @@
let b = prebuckets.(!n_used_buckets) in
incr n_used_buckets;
for i = 1 to Fifo.length b do
- let pp = Fifo.take b in
+ let p = Fifo.take b in
let bucket = bucket_number p.peer_md4 in
Fifo.put (if bucket >= !n_used_buckets then
- prebuckets.(!n_used_buckets) else b) pp
+ prebuckets.(!n_used_buckets) else b) p
done
done
end;
@@ -831,11 +792,7 @@
if n > 0 then
let p = Fifo.take fifo in
Fifo.put fifo p;
- (* kind < 4 so we do not send too much requests and avoid dead
contacts not
- yet removed because of timeouts *)
- (* TODO: Keep order? Then we need a in_use flag? *)
- if p.peer_kind < 4 && p.peer_expire > last_time () &&
- p.peer_last_send <> 0 then begin
+ if p.peer_last_recv <> 0 then begin
if !verbose_overnet then begin
lprintf_nl () "Adding good search peer %s:%d"
(Ip.to_string p.peer_ip) p.peer_port;
@@ -847,7 +804,7 @@
in
iter (min !nb (Fifo.length fifo))
in
- add_list bucket;
+ add_list bucket;
if !nb > 0 then begin
@@ -877,9 +834,8 @@
peer_port = !!overnet_port;
peer_kind = 0;
peer_tcpport = !!overnet_tcpport;
+ peer_last_recv = 0;
peer_last_send = 0;
- peer_expire = 0;
- peer_created = 0;
}
let get_any_peers nb =
@@ -890,7 +846,6 @@
let fifo = buckets.(bucket) in
let rec iter n =
if n > 0 then
- (* TODO: keep order *)
let p = Fifo.take fifo in
Fifo.put fifo p;
decr nb;
@@ -909,26 +864,20 @@
!list
let add_search_peer s p =
- if p.peer_ip <> Ip.localhost && is_overnet_ip p.peer_ip &&
- p.peer_port <> 0 then begin
- let nbits = common_bits p.peer_md4 s.search_md4 in
- begin
- try
- Fifo.iter (fun pp ->
- if pp.peer_ip = p.peer_ip &&
- pp.peer_port = p.peer_port then
- raise Exit
- ) s.search_waiting_peers.(nbits);
- Fifo.put s.search_waiting_peers.(nbits) p;
- with Exit -> ()
+ if p.peer_ip <> client_ip None then
+ let key = (p.peer_ip, p.peer_port) in
+ if not (Hashtbl.mem s.search_known_peers key) then begin
+ Hashtbl.add s.search_known_peers key p;
+ let nbits = common_bits p.peer_md4 s.search_md4 in
+ Fifo.put s.search_waiting_peers.(nbits) p;
end
- end
let create_search kind md4 =
if !verbose_overnet then lprintf_nl () "create_search";
let s = {
search_md4 = md4;
search_kind = kind;
+ search_known_peers = Hashtbl.create 127;
search_queries = 0;
search_requests = 0;
search_waiting_peers = Array.init 129 (fun _ -> Fifo.create ());
@@ -960,6 +909,11 @@
Unix.ADDR_INET (inet, port) -> port
| _ -> assert false
+
+let new_peer_message p =
+(* lprintf () "*** Updating time for %s:%d\n" (Ip.to_string p.peer_ip)
p.peer_port; *)
+ p.peer_last_recv <- last_time ()
+
let udp_client_handler t p =
let other_ip = ip_of_udp_packet p in
let other_port = port_of_udp_packet p in
@@ -967,28 +921,33 @@
lprintf_nl () "UDP FROM %s:%d type %s"
(Ip.to_string other_ip) other_port
(message_to_string t);
- (* Emule uses other_ip:other_port, so do we *)
- (* Update known_peers by other_port:other_ip *)
- let sender = { dummy_peer with peer_port = other_port ; peer_ip = other_ip }
in
- begin
- try
- let sender = KnownPeers.find known_peers sender in
- (* TODO: check for changes in ip:port? Or Hash? *)
- new_peer_message sender;
- with _ -> ();
- end;
match t with
| OvernetConnect p ->
- if is_overnet_ip sender.peer_ip && sender.peer_port <> 0 then
- udp_send sender (OvernetConnectReply (get_any_peers 20))
- else
- begin
- if !verbose_overnet then
- lprintf_nl () "Connect: invalid IP %s:%d received from %s:%d"
+ let rec send p =
+ new_peer_message p;
+ let p = new_peer p in
+ udp_send p (OvernetConnectReply (get_any_peers 20))
+ in
+ if is_overnet_ip p.peer_ip && p.peer_port <> 0 then
+ send p
+ else
+ if is_overnet_ip other_ip && other_port <> 0 then
+ begin
+ if !verbose_overnet then
+ lprintf_nl () "Connect: convert address %s:%d to %s:%d"
+ (Ip.to_string p.peer_ip) p.peer_port (Ip.to_string other_ip)
other_port;
+ p.peer_ip <- other_ip;
+ p.peer_port <- other_port;
+ send p
+ end
+ else
+ begin
+ if !verbose_overnet then
+ lprintf_nl () "Connect: invalid IP %s:%d received from %s:%d"
(Ip.to_string p.peer_ip) p.peer_port (Ip.to_string other_ip)
other_port;
- failwith "Message not understood"
- end
+ failwith "Message not understood"
+ end
| OvernetConnectReply ps ->
UdpSocket.declare_pong other_ip;
@@ -996,6 +955,10 @@
match list with
[] -> ()
| [p] ->
+ new_peer_message p;
+ if other_port <> p.peer_port || other_ip <> p.peer_ip then
+ if !verbose_overnet then
+ lprintf_nl () "Bad IP or port";
let p = new_peer p in
()
| p :: tail ->
@@ -1005,9 +968,25 @@
iter ps;
| OvernetPublicize p ->
- if is_overnet_ip sender.peer_ip && sender.peer_port <> 0 then
- udp_send sender (OvernetPublicized (Some (my_peer ())))
- else begin
+ let rec send p =
+ new_peer_message p;
+ let p = new_peer p in
+ udp_send p (OvernetPublicized (Some (my_peer ())))
+ in
+ if is_overnet_ip p.peer_ip && p.peer_port <> 0 then
+ send p
+ else
+ if is_overnet_ip other_ip && other_port <> 0 then
+ begin
+ if !verbose_overnet then
+ lprintf_nl () "Publicize: convert address %s:%d to %s:%d"
+ (Ip.to_string p.peer_ip) p.peer_port (Ip.to_string other_ip)
other_port;
+ p.peer_ip <- other_ip;
+ p.peer_port <- other_port;
+ send p
+ end
+ else
+ begin
if !verbose_overnet then
lprintf_nl () "Publicize: invalid IP %s:%d received from %s:%d"
(Ip.to_string p.peer_ip) p.peer_port (Ip.to_string other_ip)
other_port;
@@ -1018,11 +997,14 @@
()
| OvernetPublicized (Some p) ->
+ new_peer_message p;
+ let p = new_peer p in
()
| OvernetSearch (nresults, md4, from_who) ->
+
let peers = get_closest_peers md4 nresults in
- udp_send sender (OvernetSearchReply (md4,peers))
+ udp_send_direct other_ip other_port (OvernetSearchReply (md4,peers))
| OvernetSearchReply (md4, peers) ->
@@ -1030,8 +1012,13 @@
List.iter (fun s ->
if s.search_md4 = md4 then begin
List.iter (add_search_peer s) peers;
- let nbits = common_bits sender.peer_md4 s.search_md4 in
- Fifo.put s.search_ok_peers.(nbits) sender;
+ try
+ let p = Hashtbl.find s.search_known_peers
+ (other_ip, other_port) in
+ new_peer_message p;
+ let nbits = common_bits p.peer_md4 s.search_md4 in
+ Fifo.put s.search_ok_peers.(nbits) p;
+ with _ -> ()
end
) !overnet_searches;
@@ -1047,6 +1034,14 @@
if s.search_md4 = md4 then begin
s.search_nresults <- s.search_nresults + 1;
+ begin
+ try
+ let p = Hashtbl.find s.search_known_peers
+ (other_ip, other_port) in
+ new_peer_message p;
+ with _ -> ()
+ end;
+
match s.search_kind with
FileSearch file -> ()
@@ -1076,6 +1071,14 @@
if s.search_md4 = md4 then begin
s.search_nresults <- s.search_nresults + 1;
+ begin
+ try
+ let p = Hashtbl.find s.search_known_peers
+ (other_ip, other_port) in
+ new_peer_message p;
+ with _ -> ()
+ end;
+
match s.search_kind with
FileSearch file ->
List.iter (fun p ->
@@ -1115,14 +1118,14 @@
let _, list = List2.cut min list in
let list, _ = List2.cut (max - min) list in
if list <> [] then
- udp_send sender
+ udp_send_direct other_ip other_port
(OvernetSearchSourcesResults (md4, list))
| Search_for_keyword _ ->
let list = PublishedKeywords.get md4 in
let _, list = List2.cut min list in
let list, _ = List2.cut (max - min) list in
if list <> [] then
- udp_send sender
+ udp_send_direct other_ip other_port
(OvernetSearchFilesResults (md4, list))
| _ -> ()
end
@@ -1140,8 +1143,8 @@
if !verbose_overnet && debug_client other_ip then
lprintf_nl () "GET MY IP (port=%d)\n" other_port;
(* FIXME : should be able to flush the UDP buffer*)
- udp_send sender (OvernetGetMyIPResult other_ip);
- udp_send sender OvernetGetMyIPDone
+ udp_send_direct other_ip other_port (OvernetGetMyIPResult other_ip);
+ udp_send_direct other_ip other_port OvernetGetMyIPDone
| OvernetGetMyIPResult(ip) ->
if !verbose_overnet && debug_client other_ip then
@@ -1157,8 +1160,8 @@
lprintf_nl () "Peer NOT FOUND %s (%s:%d) kind: %d (msg 33)"
(Md4.to_string peer.peer_md4) (Ip.to_string peer.peer_ip)
peer.peer_port peer.peer_kind;
- let dp = { dummy_peer with peer_port = peer.peer_port ; peer_ip =
peer.peer_ip } in
- if KnownPeers.mem known_peers dp
+ let key = (peer.peer_ip, peer.peer_port) in
+ if Hashtbl.mem known_peers key
then begin
(* remove it from the prebuckets and known_peers only *)
try
@@ -1169,6 +1172,7 @@
if p.peer_ip = peer.peer_ip &&
p.peer_port = peer.peer_port then begin
decr pre_connected_peers;
+ Hashtbl.remove known_peers key;
end else Fifo.put b p
done;
done;
@@ -1196,12 +1200,11 @@
if nbits >= 0 then
let len = Fifo.length s.search_waiting_peers.(nbits) in
if len > 0 then
- let p = Fifo.take s.search_waiting_peers.(nbits) in
+ let p = Fifo.take s.search_waiting_peers.(nbits) in
- checking_kind p;
udp_send p (OvernetSearch (nresults, s.search_md4, Some
p.peer_md4));
s.search_queries <- s.search_queries + 1;
- Fifo.put s.search_asked_peers.(nbits) p;
+ Fifo.put s.search_asked_peers.(nbits) p;
(if todo > 1 then iter nbits (todo - 1))
else
@@ -1226,50 +1229,49 @@
let update_buckets () =
-(* 1. Clean the buckets from too old peers ( by kind and expire ) *)
+(* 1. Clean the buckets from too old peers ( last contact > 1 hour ) *)
+
+ let overtime = last_time () - 3600 in
for i = 0 to !n_used_buckets do
let b = buckets.(i) in
for j = 1 to Fifo.length b do
let p = Fifo.take b in
- (* bad peers have kind = 4 and did not respond within peer_expire *)
- if not (p.peer_kind = 4 && p.peer_expire <= last_time ()) then
- Fifo.put b p
- else
+ if p.peer_last_recv > overtime then Fifo.put b p else
begin
- decr connected_peers;
- if !verbose_overnet then lprintf_nl () "update_bucket1: removing
%s:%d" (Ip.to_string p.peer_ip) p.peer_port;
- end;
+ (* remove the peer also from known_peers *)
+ let key = (p.peer_ip, p.peer_port) in
+ Hashtbl.remove known_peers key;
+ decr connected_peers
+ end
done
done;
(* 2. Complete buckets with new peers from the prebuckets with
-( p.peer_kind < 3 ) *)
+( last_contact < 1 hour ) *)
- for i = 0 to !n_used_buckets do
+ for i = 0 to !n_used_buckets - 1 do
let b = buckets.(i) in
if Fifo.length b < max_peers_per_bucket then begin
+ try
let pb = prebuckets.(i) in
for j = 1 to Fifo.length pb do
- (* to keep fifo in order travel all peers *)
let p = Fifo.take pb in
- (* good peers goto buckets *)
- if p.peer_kind < 3 && Fifo.length b < max_peers_per_bucket then
begin
+ if p.peer_last_recv > overtime &&
+ p.peer_last_recv >= p.peer_last_send then begin
Fifo.put b p;
incr connected_peers;
decr pre_connected_peers;
- (* bad peers are removed *)
- end else if p.peer_kind = 4 && p.peer_expire <= last_time () then
begin
- decr pre_connected_peers;
- if !verbose_overnet then lprintf_nl () "update_bucket2: removing
%s:%d" (Ip.to_string p.peer_ip) p.peer_port;
- end else
- (* the rest returns in prebuckets *)
- Fifo.put pb p
+ if Fifo.length b = max_peers_per_bucket then raise Exit
+ end else Fifo.put pb p
+
done
+ with Exit -> ()
+
end
done;
@@ -1279,7 +1281,7 @@
let n = ref 0 in
try
let addtol p =
- if p.peer_kind < 3 then begin
+ if p.peer_last_recv <> 0 then begin
LimitedList.add !!boot_peers (p.peer_ip, p.peer_port);
incr n;
if !n = max_boot_peers then raise Exit
@@ -1297,38 +1299,6 @@
()
-let compute_to_ping () =
-(* compute which peers to ping in the next minute *)
- to_ping := [];
- let n_to_ping = ref 0 in
-
- let ping_peers b =
- Fifo.iter (fun p ->
- if (p.peer_expire <= last_time () && p.peer_kind < 4) ||
- p.peer_last_send = 0 then begin
- to_ping := p :: !to_ping;
- incr n_to_ping;
- if !n_to_ping = 60 then raise Exit
- end
- ) b
- in
- begin
- try
- for i = !n_used_buckets downto 8 do
- ping_peers buckets.(i);
- ping_peers prebuckets.(i);
- done;
- for i = min !n_used_buckets 7 downto 0 do
- ping_peers buckets.(i);
- done;
- for i = min !n_used_buckets 7 downto 0 do
- ping_peers prebuckets.(i);
- done;
- with Exit -> ()
- end;
- ()
-
-
let enable () =
if !!enable_overnet && not !is_enabled then begin
let enabler = is_enabled in
@@ -1349,32 +1319,20 @@
let my_peer = my_peer () in
(* ping old peers regularly *)
- let process_to_ping () =
- begin
- match !to_ping with
- [] -> compute_to_ping ();
- | p :: tail ->
- (* do not hammer a peer, we could have send already a search
reqeust
- since to_ping is rebuild at least every 60 seconds *)
- if (last_time () - p.peer_last_send) > 60 then begin
- checking_kind p;
- udp_send p (OvernetPublicize my_peer);
- end;
+ begin
+ match !to_ping with
+ [] -> ()
+ | p :: tail ->
to_ping := tail;
- end;
- in
- process_to_ping ();
-(* Send OvernetConnects and ping more peers *)
-(* TODO: How does eMule it? are 50 ok? *)
+ p.peer_last_send <- last_time ();
+ udp_send p (OvernetPublicize my_peer);
+ end;
+
+(* ping unknown peers *)
begin
try
- if !connected_peers < 50 then
- for i = 1 to 3 do
- process_to_ping ();
- done;
- (* Do not send too much OvernetConnect, there is no use *)
- if (!connected_peers + !pre_connected_peers) < 30 then
- for i = 1 to 2 do
+ if !connected_peers < 100 then
+ for i = 1 to 5 do
let (ip, port) = LimitedList.get unknown_peers in
udp_send_ping ip port (OvernetConnect my_peer);
done
@@ -1401,10 +1359,10 @@
in
(* If we use fewer than 5 buckets, we shouldn't wait for 5 buckets in the
search to start asking for results... *)
-(* TODO: what the heck we use !n_used_buckets? we ask every search_ok_peers *)
+ let min_bucket = mini !n_used_buckets 5 in
for i = 1 to nrequests do
try
- for j = 128 downto 0 do
+ for j = 128 downto min_bucket do
if Fifo.length s.search_ok_peers.(j) > 0 then
let p = Fifo.take s.search_ok_peers.(j) in
udp_send p (
@@ -1428,13 +1386,43 @@
update_buckets ();
- compute_to_ping ();
+(* compute which peers to ping in the next minute *)
+ to_ping := [];
+ let n_to_ping = ref 0 in
+
+ let ping_peers b =
+ let overtime = last_time () - 1800 in
+ Fifo.iter (fun p ->
+ if p.peer_last_recv < overtime &&
+ p.peer_last_send < overtime then begin
+ to_ping := p :: !to_ping;
+ incr n_to_ping;
+ if !n_to_ping = 60 then raise Exit
+ end
+ ) b
+ in
+
+ begin
+ try
+ for i = !n_used_buckets downto 8 do
+ ping_peers buckets.(i);
+ ping_peers prebuckets.(i);
+ done;
+ for i = min !n_used_buckets 7 downto 0 do
+ ping_peers buckets.(i);
+ done;
+ for i = min !n_used_buckets 7 downto 0 do
+ ping_peers prebuckets.(i);
+ done;
+ with Exit -> ()
+ end;
(* reset the Hashtbls and Fifos for searches that are older than 5 minutes *)
let l = last_time () - 300 in
List.iter ( fun s ->
if s.search_requests < max_search_requests &&
s.search_start > l then begin
+ Hashtbl.clear s.search_known_peers;
Array.iter (fun a -> Fifo.clear a) s.search_waiting_peers;
Array.iter (fun a -> Fifo.clear a) s.search_asked_peers;
Array.iter (fun a -> Fifo.clear a) s.search_ok_peers;
@@ -1468,6 +1456,11 @@
check_current_downloads ();
end
);
+ add_timer 30. (fun _ ->
+ if !!enable_overnet then begin
+ check_current_downloads ();
+ end
+ );
add_infinite_timer 1800. (fun _ ->
if !!enable_overnet then begin
PublishedKeywords.refresh ();
@@ -1566,8 +1559,9 @@
let buf = o.conn_buf in
Printf.bprintf buf "Peers of known_peers:\n";
- KnownPeers.iter (fun p ->
- Printf.bprintf buf "%s:%d:" (Ip.to_string p.peer_ip) p.peer_port;
+ Hashtbl.iter (fun key p ->
+ let (ip,port) = key in
+ Printf.bprintf buf "%s:%d:" (Ip.to_string ip) port;
print_peer buf p;
) known_peers;
""
@@ -1759,7 +1753,7 @@
with _ ->
lprintf_nl () "Unable to send UDP message"; "Unable to send UDP
message"
), ":\t\t\t\tsend UDP message (<ip> <port> <msg in hex>)";
-
+
"buckets", Arg_none (fun o ->
let buf = o.conn_buf in
update_buckets ();
@@ -1767,21 +1761,17 @@
Printf.bprintf buf "Number of used buckets %d with %d peers
(prebucket: %d peers)\n"
!n_used_buckets !connected_peers !pre_connected_peers;
for i = 0 to !n_used_buckets do
- Printf.bprintf buf " bucket[%d] : %d peers (prebucket %d)\n"
- i (Fifo.length buckets.(i)) (Fifo.length prebuckets.(i));
+ if Fifo.length buckets.(i) > 0 ||
+ Fifo.length prebuckets.(i) > 0 then
+ Printf.bprintf buf " bucket[%d] : %d peers (prebucket %d)\n"
+ i (Fifo.length buckets.(i)) (Fifo.length prebuckets.(i));
done;
if o.conn_output = HTML then
begin
let listtmp = String2.split (Buffer.contents buf) '\n' in
let buckets = ref [] in
- let i = ref 0 in
List.iter (fun s ->
- if !i <> !n_used_buckets + 1 then begin
- buckets := !buckets @ [("", "dl-1", (Printf.sprintf "\\<a
href=\\\"submit\\?q=%sdump_bucket\\+%d\\\" target=output\\>[Dump]\\</a\\>%s"
command_prefix !i s) );];
- end else begin
- buckets := !buckets @ [("", "dl-1", (Printf.sprintf "\\<a
href=\\\"submit\\?q=%sbuckets\\\" target=output\\>[Refresh]\\</a\\>"
command_prefix) );]
- end;
- incr i;
+ buckets := !buckets @ [("", "dl-1", s);]
) listtmp;
Buffer.reset buf;
html_mods_table_one_col buf "ovbucketsTable" "results" ([
@@ -1839,6 +1829,7 @@
match s.search_kind with
KeywordSearch sss when ss == sss ->
begin
+ Hashtbl.clear s.search_known_peers;
Array.iter (fun a -> Fifo.clear a) s.search_waiting_peers;
Array.iter (fun a -> Fifo.clear a) s.search_asked_peers;
Array.iter (fun a -> Fifo.clear a) s.search_ok_peers;
@@ -1873,6 +1864,7 @@
match s.search_kind with
FileSearch f when f == file ->
begin
+ Hashtbl.clear s.search_known_peers;
Array.iter (fun a -> Fifo.clear a) s.search_waiting_peers;
Array.iter (fun a -> Fifo.clear a) s.search_asked_peers;
Array.iter (fun a -> Fifo.clear a) s.search_ok_peers;
@@ -1941,17 +1933,9 @@
Printf.bprintf buf " Search hits: %d\n" !search_hits;
Printf.bprintf buf " Source hits: %d\n" !source_hits;
- Printf.bprintf buf " known_peers stats: %d %d %d %d %d %d\n"
- ((fun (n,_,_,_,_,_) -> n)(KnownPeers.stats known_peers))
- ((fun (_,n,_,_,_,_) -> n)(KnownPeers.stats known_peers))
- ((fun (_,_,n,_,_,_) -> n)(KnownPeers.stats known_peers))
- ((fun (_,_,_,n,_,_) -> n)(KnownPeers.stats known_peers))
- ((fun (_,_,_,_,n,_) -> n)(KnownPeers.stats known_peers))
- ((fun (_,_,_,_,_,n) -> n)(KnownPeers.stats known_peers))
- ;
-
-
+ Printf.bprintf buf " Hashtbl.lenght known_peers: %d\n" (Hashtbl.length
known_peers);
Printf.bprintf buf " to_ping: %d\n" (List.length !to_ping);
+ let n_search_known_peers = ref 0 in
let n_search_waiting_peers = ref 0 in
let n_search_asked_peers = ref 0 in
let n_search_ok_peers = ref 0 in
@@ -1959,6 +1943,8 @@
let n_overnet_searches = ref 0 in
List.iter ( fun s ->
for i = 128 downto 0 do
+ n_search_known_peers :=
+ !n_search_known_peers + (Hashtbl.length s.search_known_peers);
n_search_waiting_peers :=
!n_search_waiting_peers + (Fifo.length
s.search_waiting_peers.(i));
n_search_asked_peers :=
@@ -1970,6 +1956,7 @@
done;
incr n_overnet_searches
) !overnet_searches;
+ Printf.bprintf buf " n_search_known_peers: %d\n" !n_search_known_peers;
Printf.bprintf buf " n_search_waiting_peers: %d\n"
!n_search_waiting_peers;
Printf.bprintf buf " n_search_asked_peers: %d\n" !n_search_asked_peers;
Printf.bprintf buf " n_search_ok_peers: %d\n" !n_search_ok_peers;