mldonkey-commits
[Top][All Lists]
Advanced

[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;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]