mldonkey-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Mldonkey-commits] mldonkey distrib/ChangeLog src/networks/donkey/...


From: mldonkey-commits
Subject: [Mldonkey-commits] mldonkey distrib/ChangeLog src/networks/donkey/...
Date: Tue, 31 Oct 2006 15:42:48 +0000

CVSROOT:        /sources/mldonkey
Module name:    mldonkey
Changes by:     spiralvoice <spiralvoice>       06/10/31 15:42:48

Modified files:
        distrib        : ChangeLog 
        src/networks/donkey: donkeyOvernet.ml donkeyProtoKademlia.ml 

Log message:
        patch #5508

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/mldonkey/distrib/ChangeLog?cvsroot=mldonkey&r1=1.1074&r2=1.1075
http://cvs.savannah.gnu.org/viewcvs/mldonkey/src/networks/donkey/donkeyOvernet.ml?cvsroot=mldonkey&r1=1.70&r2=1.71
http://cvs.savannah.gnu.org/viewcvs/mldonkey/src/networks/donkey/donkeyProtoKademlia.ml?cvsroot=mldonkey&r1=1.20&r2=1.21

Patches:
Index: distrib/ChangeLog
===================================================================
RCS file: /sources/mldonkey/mldonkey/distrib/ChangeLog,v
retrieving revision 1.1074
retrieving revision 1.1075
diff -u -b -r1.1074 -r1.1075
--- distrib/ChangeLog   31 Oct 2006 15:41:55 -0000      1.1074
+++ distrib/ChangeLog   31 Oct 2006 15:42:48 -0000      1.1075
@@ -15,6 +15,7 @@
 =========
 
 2006/10/31
+5508: OV/KAD eMule style search and some small fixes (bogeyman)
 5486: UDP bandwidth monitor fix (bogeyman)
 5505: EDK: Support aMule/Hydranode style OS_INFO tag
 

Index: src/networks/donkey/donkeyOvernet.ml
===================================================================
RCS file: /sources/mldonkey/mldonkey/src/networks/donkey/donkeyOvernet.ml,v
retrieving revision 1.70
retrieving revision 1.71
diff -u -b -r1.70 -r1.71
--- src/networks/donkey/donkeyOvernet.ml        13 Oct 2006 18:33:03 -0000      
1.70
+++ src/networks/donkey/donkeyOvernet.ml        31 Oct 2006 15:42:48 -0000      
1.71
@@ -270,6 +270,13 @@
     end
   )
 
+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)
+
 type search_for =
 | FileSearch of file
 | KeywordSearch of CommonTypes.search
@@ -294,20 +301,21 @@
     mutable search_kind : search_for;
 
 (* Peer queues of the search *)
-(* Stage 1: This peers may be queried *)
-    search_waiting_peers : peer Fifo.t array;
+(* Stage 1: This peers we know for this search *)
+    search_peers : peer Fifo.t array;
 (* Stage 2: We send a OvernetSearch *)
-    search_asked_peers : peer Fifo.t array;
+    search_asked_peers : KnownPeers.t;
 (* Stage 3: We received from this peer a OvernetSearchReply *)
-    search_ok_peers : peer Fifo.t array;
+    search_ok_peers : KnownPeers.t;
 (* Stage 4: We picked peers from search_ok_peers and send them a 
    OvernetSearch.*Results *)
-    search_result_asked_peers : peer Fifo.t array;
+    search_result_asked_peers : KnownPeers.t;
 
     mutable search_queries : int;
     mutable search_requests : int;
     mutable search_start : int;
-    mutable search_last_query : int;
+    mutable search_lifetime : int;
+    mutable search_last_recv : int;
     mutable search_results : (Md4.t, tag list) Hashtbl.t;
     mutable search_nresults : int; (* number of results messages *)
     mutable search_hits : int;     (* number of diff results *)
@@ -354,11 +362,10 @@
 *********************************************************************)
 
 let max_peers_per_bucket = 20
-let max_peers_per_prebucket = 40
-(* how many peers a search may ask for more search peers *)
-let max_search_queries = 50 
-(* how many peers we ask for results *)
-let max_search_requests = 20 
+let max_peers_per_prebucket = 20
+(* number of peers a search start with *)
+(* get_any_peers and get_closest_peers change the order of the peers in the 
bucket fifo *)
+let init_peers_per_search = ((max_peers_per_bucket*2)/3)
 let max_boot_peers = 200
 
 let is_enabled = ref false
@@ -573,13 +580,6 @@
 let prebuckets = Array.init 129 (fun _ -> Fifo.create ())
 
 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
 
 (*
@@ -623,17 +623,11 @@
 let bucket_number md4 =
   common_bits md4 !!overnet_md4
 
-  (*
-(* TODO: this structure MUST disappear. It is not Kademlia ! *)
-let global_peers : (Md4.t, peer) Hashtbl.t array Options.option_record =
-  raise Not_found
-    *)
-
-(*let firewalled_overnet_peers = Hashtbl.create 13*)
-
 let search_hits = ref 0
 let source_hits = ref 0
 
+(* when we created the searches for all files last time*)
+let last_check_current_downloads = ref 0
 
 let udp_sock = ref None
 
@@ -822,7 +816,12 @@
         if bucket < !n_used_buckets && bucket <> 128 &&
            p.peer_md4 <> Md4.null then begin
 
-            if Fifo.length prebuckets.(bucket) = max_peers_per_prebucket then
+(* If this is a good peer add it directly to the bucket. Helps at startup *)
+            if p.peer_kind < 3 && Fifo.length buckets.(bucket) < 
max_peers_per_bucket then begin
+                Fifo.put buckets.(bucket) p;
+                incr connected_peers;
+            end 
+            else if Fifo.length prebuckets.(bucket) >= max_peers_per_prebucket 
then
            begin
               let pp = Fifo.take prebuckets.(bucket) in
               Fifo.put prebuckets.(bucket)
@@ -870,8 +869,7 @@
         (* kind < 3 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 < 3 && p.peer_expire > last_time () && 
-           p.peer_last_send <> 0 then begin
+        if p.peer_kind < 3 && p.peer_expire > last_time () then begin
             if !verbose_overnet then begin
             lprintf_nl "Adding good search peer %s:%d"
               (Ip.to_string p.peer_ip) p.peer_port;
@@ -956,35 +954,32 @@
              pp.peer_port = p.peer_port then
             raise Exit
         in
-        Fifo.iter is_in s.search_waiting_peers.(nbits);
-        Fifo.iter is_in s.search_asked_peers.(nbits);
-        Fifo.iter is_in s.search_ok_peers.(nbits);
-        Fifo.iter is_in s.search_result_asked_peers.(nbits);
-        Fifo.put s.search_waiting_peers.(nbits) p;
+        Fifo.iter is_in s.search_peers.(nbits);
+        Fifo.put s.search_peers.(nbits) p;
       with Exit -> ()
     end
   end
 
 let create_search kind md4 =
   if !verbose_overnet then lprintf_nl "create_search";
-  let starttime = last_time () + (2 * List.length !overnet_searches) in
+  let starttime = last_time () + (3 * List.length !overnet_searches) in
   let s = ref {
       search_md4 = md4;
       search_kind = kind;
       search_queries = 0;
       search_requests = 0;
-      search_waiting_peers = Array.init 129 (fun _ -> Fifo.create ());
-      search_asked_peers = Array.init 129 (fun _ -> Fifo.create ());
-      search_ok_peers = Array.init 129 (fun _ -> Fifo.create ());
-      search_result_asked_peers = Array.init 129 (fun _ -> Fifo.create ());
+      search_peers = Array.init 129 (fun _ -> Fifo.create ());
+      search_asked_peers = KnownPeers.create 129;
+      search_ok_peers = KnownPeers.create 129;
+      search_result_asked_peers = KnownPeers.create 129;
+(* taken from eMule0.47c-Sources/srchybrid/kademlia/kademlia/Defines.h  *)
+      search_lifetime = (match kind with
+                       _ -> 45 );(* SEARCH_LIFETIME *)
       search_start = (match kind with
                        KeywordSearch s -> last_time ()
                      | FillBuckets -> last_time ()
                      | FileSearch s -> starttime);
-      search_last_query = (match kind with
-                       KeywordSearch s -> last_time ()
-                     | FillBuckets -> last_time ()
-                     | FileSearch s -> starttime);
+      search_last_recv = last_time ();
       search_hits = 0;
       search_nresults = 0;
       search_results = Hashtbl.create 64;
@@ -992,12 +987,15 @@
   begin try
     List.iter (fun ss ->
       if ss.search_md4 = !s.search_md4 && (search_for_equals ss.search_kind 
!s.search_kind) then begin
-       ss.search_start <- !s.search_start;
+(*       ss.search_start <- !s.search_start; *)
        s := ss;
        raise Exit;
       end
     ) !overnet_searches;
-    List.iter (add_search_peer !s) (get_closest_peers md4 max_search_queries);
+    begin match kind with
+      FillBuckets -> List.iter (add_search_peer !s) (get_any_peers 
init_peers_per_search)
+    | _ -> List.iter (add_search_peer !s) (get_closest_peers md4 
init_peers_per_search)
+    end;
     if !verbose_overnet then lprintf_nl "create_search done";
     overnet_searches := !s :: !overnet_searches;
   with Exit -> () end;
@@ -1008,6 +1006,54 @@
   let search = create_search (KeywordSearch s) md4 in
   search
 
+(* query the best todo peers of a search s or ask it for results *)
+let rec overnet_search_iter s nbits todo =
+        let nresults = match s.search_kind with
+            FillBuckets -> 10
+          | _ -> 2
+        in
+        if nbits >= 0 then
+          let len = Fifo.length s.search_peers.(nbits) in
+          if len > 0 then
+            let process_peer p =
+              if not (KnownPeers.mem s.search_asked_peers p) then begin
+(* Not asked: send a OvernetSearch *)
+                checking_kind p;
+                udp_send p (OvernetSearch (nresults, s.search_md4, Some 
p.peer_md4));
+                s.search_queries <- s.search_queries + 1;
+                KnownPeers.add s.search_asked_peers p;
+                raise Exit;
+              end
+              else if (KnownPeers.mem s.search_ok_peers p) && 
+                 not (KnownPeers.mem s.search_result_asked_peers p) then begin
+(* Is ok but we did not request a result yet *)
+                let kind = match s.search_kind with
+                    FillBuckets -> Search_for_file
+                  | FileSearch _ -> Search_for_file
+                  | _ -> Search_for_keyword None
+                in
+                checking_kind p;
+                udp_send p ( OvernetGetSearchResults (s.search_md4, kind, 0, 
100));
+                s.search_requests <- s.search_requests + 1;
+                KnownPeers.add s.search_result_asked_peers p; 
+                raise Exit;
+              end
+              (* raised an Exit if we send something to the peer *)
+              in
+            try
+              Fifo.iter process_peer s.search_peers.(nbits);
+              overnet_search_iter s (nbits-1) todo;
+            with Exit ->
+              (if todo > 1 then overnet_search_iter s nbits (todo - 1))
+          else
+            overnet_search_iter s (nbits-1) todo
+        else
+        begin
+          if !verbose_overnet then
+            lprintf_nl "overnet_search_iter: call add_search_peer";
+          List.iter (add_search_peer s) (get_closest_peers s.search_md4 
init_peers_per_search);
+        end
+
 let ip_of_udp_packet p =
   match p.UdpSocket.udp_addr with
     Unix.ADDR_INET (inet, port) ->
@@ -1034,7 +1080,7 @@
 
   | OvernetConnect p ->
       if is_overnet_ip sender.peer_ip && sender.peer_port <> 0 then
-        let sender = new_peer { p with peer_ip = other_ip } in
+        let sender = new_peer { p with peer_ip = other_ip; peer_kind = 2 } in
         (* let sender = new_peer { p with peer_port = other_port ; peer_ip = 
other_ip } in *)
         new_peer_message sender;
         udp_send sender (OvernetConnectReply (get_any_peers 20))
@@ -1051,7 +1097,8 @@
         match list with
           [] -> ()
         | [p] ->
-            let sender = new_peer { p with peer_ip = other_ip } in
+            (* last one is always the peer itself *)
+            let sender = new_peer { p with peer_ip = other_ip; peer_kind = 2 } 
in
             new_peer_message sender
         | p :: tail ->
             let _ = new_peer p in
@@ -1060,7 +1107,7 @@
       iter ps;
 
   | OvernetPublicize p ->
-      let sender = new_peer { p with peer_ip = other_ip } in
+      let sender = new_peer { p with peer_ip = other_ip; peer_kind = 2 } in
       new_peer_message sender;
       if is_overnet_ip sender.peer_ip && sender.peer_port <> 0 then
         udp_send sender (OvernetPublicized (Some (my_peer ())))
@@ -1086,8 +1133,10 @@
       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;
+              KnownPeers.add s.search_ok_peers sender;
+              s.search_last_recv <- last_time ();
+              (* Now ask the next best peer *)
+              overnet_search_iter s 128 1;
             end
       ) !overnet_searches;
 
@@ -1216,16 +1265,24 @@
         let dp = { dummy_peer with peer_port = peer.peer_port ; peer_ip = 
peer.peer_ip } in
         if KnownPeers.mem known_peers dp
         then begin
-(* remove it from the prebuckets and known_peers only *)
+(* remove it from the buckets, put it into prebuckets and set kind to 3 *)
           try
             for i = 0 to !n_used_buckets do
-              let b = prebuckets.(i) in
+              let b = buckets.(i) in
+              let pb = prebuckets.(i) in
               for j = 1 to Fifo.length b do
                 let p = Fifo.take b in
                 if p.peer_ip = peer.peer_ip && 
                     p.peer_port = peer.peer_port then begin
-                  decr pre_connected_peers;
-                  KnownPeers.remove known_peers dp;
+                  decr connected_peers;
+                  if !pre_connected_peers < max_peers_per_prebucket then begin
+                    incr pre_connected_peers;
+                    Fifo.put pb p;
+                    p.peer_kind <- 3;
+                  end 
+                  else begin if !verbose_overnet then lprintf_nl 
"peernotfound: removing %s:%d" (Ip.to_string p.peer_ip) p.peer_port;
+                  KnownPeers.remove known_peers p;
+                  end
                 end else Fifo.put b p
               done;
             done;
@@ -1242,78 +1299,20 @@
 
   | _ -> failwith "Message not understood"
 
-let query_next_peers () =
+(* Start unstarted searches, retry stalled searches *)
+let overnet_search_tick () =
   let overnet_query_peer_period = int_of_float !!overnet_query_peer_period in
-  let timeout = last_time () - overnet_query_peer_period in
   List.iter (fun s ->
-      let nresults = match s.search_kind with
-          FillBuckets -> 10
-        | _ -> 2
-      in
-
-      let rec iter nbits todo =
-        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
-
-            if p.peer_last_send < timeout then begin
-              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;
-
-              (if todo > 1 then iter nbits (todo - 1))
-            end else
-              iter nbits todo
-          else
-            iter (nbits-1) todo
-        else
-        if s.search_queries < max_search_queries then
-          List.iter (fun p ->
-              add_search_peer s p
-          ) (get_closest_peers s.search_md4 max_search_queries)
-      in
-      if s.search_last_query < timeout then begin
-        s.search_last_query <- s.search_last_query + overnet_query_peer_period;
-(* Query next search peers *)
-        if s.search_queries < max_search_queries then
+(* Start a search, if search_start is reached *)
+         if (s.search_lifetime + s.search_start - 20) > last_time () &&
+            s.search_start < last_time () then begin
           (if s.search_queries = 0 then
-            iter 128 3
-          else
-            iter 128 2);
-(* Request next results *)
-        if s.search_requests < max_search_requests then begin
-           let nrequests =
-              match s.search_kind with
-                FillBuckets -> 0
-              | FileSearch _ -> 1
-              | KeywordSearch _ -> 5
-           in
-           for i = 1 to nrequests do
-             try
-               for j = 128 downto 5 do
-                 if Fifo.length s.search_ok_peers.(j) > 0 then
-                   let p = Fifo.take s.search_ok_peers.(j) in
-                   if p.peer_last_send < timeout then begin
-                     checking_kind p;
-                     udp_send p (
-                       OvernetGetSearchResults (s.search_md4,
-                         (match s.search_kind with
-                             FillBuckets -> Search_for_file
-                           | FileSearch _ -> Search_for_file
-                           | _ -> Search_for_keyword None
-                         ), 0, 100));
-                     s.search_requests <- s.search_requests + 1;
-                     Fifo.put s.search_result_asked_peers.(j) p; 
-                     raise Exit
-                   end else
-                     Fifo.put s.search_ok_peers.(j) p
-               done
-             with Exit -> ()
-           done
+            overnet_search_iter s 128 3
+         else if (s.search_last_recv + 3) < last_time () then
+(* The search has stalled. We do what eMule call a JumpStart *)
+(* FIXME: with implemented firewalling this should be 1 peer not 2*)
+            overnet_search_iter s 128 2);
         end
-      end;
   ) !overnet_searches
 
 let recover_file file =
@@ -1455,9 +1454,7 @@
 
       add_session_timer enabler 1. (fun _ ->
           if !!enable_overnet then begin
-(* Searches have a search_last_query controlled by !!overnet_query_peer_period 
*)
-(* Here also the result request a done *)
-            query_next_peers ();
+            overnet_search_tick ();
 
             let my_peer = my_peer () in
 
@@ -1469,7 +1466,7 @@
                 | 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
+                  if (last_time () - p.peer_last_send) > 61 then begin
                     checking_kind p;
                     udp_send p (OvernetPublicize my_peer);
                   end;
@@ -1477,12 +1474,20 @@
               end;
             in
             process_to_ping ();
+(* When we start with 50 searches and no peers, we have to update the buckets
+   fast, otherwise we cannot add search peers (rest: sanity check) *)
+           begin
+             if !connected_peers < 20 && !pre_connected_peers <> 0 &&
+               LimitedList.length unknown_peers <> 0 then
+               update_buckets ();
+               compute_to_ping ();
+           end;
 (* Send OvernetConnects and ping more peers *)
 (* TODO: How does eMule it? are 50 ok? *)
             begin
               try
-                 if !connected_peers < 50 then
-                   for i = 1 to 4 do
+                 if !connected_peers < 10 then
+                   for i = 1 to 2 do
                      process_to_ping ();
                    done;
                  (* Do not send too much OvernetConnect, there is no use *)
@@ -1508,12 +1513,14 @@
 
           compute_to_ping ();
 
-          let l = last_time () - 180 in
-(* remove searches that are older than 3 minutes *)
+(* remove searches that are older than their lifetime *)
           overnet_searches := List.filter (fun s ->
-              s.search_requests < max_search_requests &&
-              s.search_start > l
+              (* s.search_lifetime + s.search_start > last_time () *)
+(*DEBUG:show longer *)              360 + s.search_start > last_time ()
           ) !overnet_searches;
+
+          (* FIXE: Dump latencies to logfile *)
+          if !verbose_overnet then ignore (UdpSocket.get_latencies (ref true));
       );
 
 (* every 15min for light operations *)
@@ -1521,12 +1528,18 @@
           if !!enable_overnet then begin
               let _ = create_search FillBuckets !!overnet_md4 in
               check_current_downloads ();
+              last_check_current_downloads := last_time ();
             end
       );
 
       begin
-        let _ = create_search FillBuckets !!overnet_md4 in
         check_current_downloads ();
+(* Delay the first normal searches, so we can fill the buckets first *)
+        List.iter (fun s ->
+          s.search_start <- s.search_start + 30;
+        ) !overnet_searches;
+        ignore (create_search FillBuckets !!overnet_md4);
+        last_check_current_downloads := last_time ();
       end;
       
       add_infinite_timer 1800. (fun _ ->
@@ -1606,21 +1619,21 @@
     "dump_searches", Arg_none (fun o ->
          let buf = o.conn_buf in
          List.iter ( fun s ->
-           Printf.bprintf buf "Search %s for %s\nrequests:%d queries:%d 
search_last_query:%d\n"
+           Printf.bprintf buf "Search %s for %s\nrequests:%d queries:%d 
seconds alive:%d lifetime:%d\n"
               (match s.search_kind with
                 KeywordSearch _ -> "keyword"
                 | FileSearch _ -> "file"
                 | FillBuckets -> "fillbuckets" )
-              (Md4.to_string s.search_md4) s.search_requests s.search_queries 
s.search_last_query;
+              (Md4.to_string s.search_md4) s.search_requests s.search_queries 
(last_time ()-s.search_start) s.search_lifetime;
           let pp p = print_peer buf p in
-          Printf.bprintf buf "search_waiting_peers\n";
-           Array.iter (fun a -> Fifo.iter (fun p -> pp p) a) 
s.search_waiting_peers;
+           Printf.bprintf buf "search_peers\n";
+           Array.iter (fun a -> Fifo.iter (fun p -> pp p) a) s.search_peers;
           Printf.bprintf buf "search_asked_peers\n";
-           Array.iter (fun a -> Fifo.iter (fun p -> pp p) a) 
s.search_asked_peers;
+           KnownPeers.iter pp s.search_asked_peers;
           Printf.bprintf buf "search_ok_peers\n";
-           Array.iter (fun a -> Fifo.iter (fun p -> pp p) a) s.search_ok_peers;
+           KnownPeers.iter pp s.search_ok_peers;
           Printf.bprintf buf "search_result_asked_peers\n";
-           Array.iter (fun a -> Fifo.iter (fun p -> pp p) a) 
s.search_result_asked_peers;
+           KnownPeers.iter pp s.search_result_asked_peers;
           Printf.bprintf buf "\n";
         ) !overnet_searches;
          ""
@@ -1702,6 +1715,8 @@
             Printf.bprintf buf "\\<tr\\>";
             html_mods_td buf [
               ("", "srh", Printf.sprintf "%s statistics" 
command_prefix_to_net);
+              ("", "srh", Printf.sprintf "Last file search started %d seconds 
ago\n" 
+                          (last_time () - !last_check_current_downloads));
               ("", "srh", Printf.sprintf "Search hits: %d\n" !search_hits);
               ("", "srh", Printf.sprintf "Source hits: %d\n" !source_hits); ];
             Printf.bprintf buf "\\</tr\\>\\</table\\>\\</div\\>\n";
@@ -1710,6 +1725,8 @@
           begin
             Printf.bprintf buf "%s statistics:\n"
            (command_prefix_to_net);
+            Printf.bprintf buf "  Last file search started %d seconds ago\n"
+            (last_time () - !last_check_current_downloads);
             Printf.bprintf buf "  Search hits: %d\n" !search_hits;
             Printf.bprintf buf "  Source hits: %d\n" !source_hits;
           end;
@@ -1729,35 +1746,43 @@
                 Printf.bprintf buf "\\</tr\\>";
                 Printf.bprintf buf "\\<tr class=\\\"dl-1\\\"\\>";
                 html_mods_td buf [
-                  ("", "sr", Printf.sprintf "requests:%d queries:%d 
search_last_query:%d\n" s.search_requests s.search_queries 
s.search_last_query); ];
+                  ("", "sr", Printf.sprintf "requests:%d queries:%d seconds 
alive:%d lifetime:%d\n" 
+                     s.search_requests s.search_queries (last_time 
()-s.search_start) s.search_lifetime); ];
                 Printf.bprintf buf "\\</tr\\>";
               end
             else
-            Printf.bprintf buf "Search %s for %s\nrequests:%d queries:%d 
search_last_query:%d\n"
+            Printf.bprintf buf "Search %s for %s\nrequests:%d queries:%d 
seconds alive:%d lifetime:%d\n"
               (match s.search_kind with
                 KeywordSearch _ -> "keyword"
                 | FileSearch _ -> "file"
                 | FillBuckets -> "fillbuckets" )
-              (Md4.to_string s.search_md4) s.search_requests s.search_queries 
s.search_last_query;
+              (Md4.to_string s.search_md4) s.search_requests s.search_queries 
(last_time ()-s.search_start) s.search_lifetime;
               for i = 128 downto 0 do
-                let npeers = Fifo.length s.search_waiting_peers.(i) in
-                let nasked = Fifo.length s.search_asked_peers.(i) in
-                let nok = Fifo.length s.search_ok_peers.(i) in
-                let nres = Fifo.length s.search_result_asked_peers.(i) in
+                let npeers = Fifo.length s.search_peers.(i) in
+                let count = ref 0 in
+                let cp p = if (common_bits p.peer_md4 s.search_md4) = i then 
count := !count + 1 in
+                KnownPeers.iter cp s.search_asked_peers;
+                let nasked = !count in
+                count := 0;
+                KnownPeers.iter cp s.search_ok_peers;
+                let nok = !count in
+                count := 0;
+                KnownPeers.iter cp s.search_result_asked_peers;
+                let nres = !count in
                 if npeers > 0 || nasked > 0 then
                   if o.conn_output = HTML then
                     begin
                       Printf.bprintf buf "\\<tr class=\\\"dl-1\\\"\\>";
                       html_mods_td buf [
                         ("", "sr",
-                          Printf.sprintf "nbits[%d] = %d peer(s) not asked, %d 
peer(s) asked, %d peer(s) ok, %d peer(s) result asked"
+                          Printf.sprintf "nbits[%d] = %d peer(s) total, %d 
peer(s) asked, %d peer(s) ok, %d peer(s) result asked"
                           i npeers nasked nok nres); ];
                       Printf.bprintf buf "\\</tr\\>";
 
                    end
                  else
                   Printf.bprintf buf
-                  "   nbits[%d] = %d peers not asked, %d peers asked, %d 
peer(s) ok, %d peer(s) result asked\n"
+                  "   nbits[%d] = %d peer(s) total, %d peer(s) asked, %d 
peer(s) ok, %d peer(s) result asked\n"
                     i npeers nasked nok nres
               done;
               if o.conn_output = HTML then
@@ -1985,8 +2010,8 @@
       Printf.bprintf buf "  unknown_peers: %d\n" (LimitedList.length 
unknown_peers);
       update_buckets ();
       Printf.bprintf buf "  boot_peers: %d\n" (LimitedList.length 
!!boot_peers);
-      Printf.bprintf buf "  %d buckets with %d peers and %d prebucket peers\n"
-            !n_used_buckets !connected_peers !pre_connected_peers;
+      Printf.bprintf buf "  %d peers and %d prebucket peers\n"
+            !connected_peers !pre_connected_peers;
 
       Printf.bprintf buf "  Search hits: %d\n" !search_hits;
       Printf.bprintf buf "  Source hits: %d\n" !source_hits;
@@ -2001,31 +2026,19 @@
 
       
       Printf.bprintf buf "  to_ping: %d\n" (List.length !to_ping);
-      let n_search_waiting_peers = ref 0 in
-      let n_search_asked_peers = ref 0 in
-      let n_search_ok_peers = ref 0 in
-      let n_search_result_asked_peers = ref 0 in
+      let n_search_peers = ref 0 in
       let n_search_results = ref 0 in
       let n_overnet_searches = ref 0 in
       List.iter ( fun s ->
               for i = 128 downto 0 do
-               n_search_waiting_peers :=
-                 !n_search_waiting_peers + (Fifo.length 
s.search_waiting_peers.(i));
-               n_search_asked_peers :=
-                 !n_search_asked_peers + (Fifo.length 
s.search_asked_peers.(i));
-               n_search_ok_peers :=
-                 !n_search_ok_peers + (Fifo.length s.search_ok_peers.(i));
-               n_search_result_asked_peers :=
-                 !n_search_result_asked_peers + (Fifo.length 
s.search_result_asked_peers.(i));
+               n_search_peers :=
+                 !n_search_peers + (Fifo.length s.search_peers.(i));
                n_search_results :=
                  !n_search_results + (Hashtbl.length s.search_results);
               done;
              incr n_overnet_searches
       ) !overnet_searches;
-      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;
-      Printf.bprintf buf "  n_search_result_asked_peers: %d\n" 
!n_search_result_asked_peers;
+      Printf.bprintf buf "  n_search_peers: %d\n" !n_search_peers;
       Printf.bprintf buf "  n_search_results: %d\n" !n_search_results;
       Printf.bprintf buf "  n_overnet_searches: %d\n" !n_overnet_searches;
   );

Index: src/networks/donkey/donkeyProtoKademlia.ml
===================================================================
RCS file: 
/sources/mldonkey/mldonkey/src/networks/donkey/donkeyProtoKademlia.ml,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- src/networks/donkey/donkeyProtoKademlia.ml  19 May 2006 23:43:54 -0000      
1.20
+++ src/networks/donkey/donkeyProtoKademlia.ml  31 Oct 2006 15:42:48 -0000      
1.21
@@ -45,6 +45,7 @@
 
     let names_of_tag =
       [
+        "\243", Field_UNKNOWN "encryption"; (* 0xF3 *)
         "\248", Field_UNKNOWN "buddyhash"; (* 0xF8 *)
         "\249", Field_UNKNOWN "clientlowid"; (* 0xF9 *)
         "\250", Field_UNKNOWN "serverport"; (* 0xFA *)




reply via email to

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