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: Wed, 09 Nov 2005 11:41:59 -0500

Index: mldonkey/src/networks/donkey/donkeyOvernet.ml
diff -u mldonkey/src/networks/donkey/donkeyOvernet.ml:1.58 
mldonkey/src/networks/donkey/donkeyOvernet.ml:1.59
--- mldonkey/src/networks/donkey/donkeyOvernet.ml:1.58  Sat Nov  5 16:25:20 2005
+++ mldonkey/src/networks/donkey/donkeyOvernet.ml       Wed Nov  9 16:41:57 2005
@@ -284,9 +284,9 @@
     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_last_query : 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 *)
@@ -332,8 +332,10 @@
 
 let max_peers_per_bucket = 20
 let max_peers_per_prebucket = 40
-let max_search_queries = 64
-let max_search_requests = 20
+(* how many peers a search may ask for more search peers *)
+let max_search_queries = 64 
+(* how many peers we ask for results *)
+let max_search_requests = 20 
 let max_boot_peers = 200
 
 let is_enabled = ref false
@@ -530,7 +532,7 @@
   message, because we are not sure for other peers.
   *)
 
-let n_used_buckets = ref 0
+let n_used_buckets = ref 42
 
 (* We distinguish between buckets and prebuckets: peers in buckets are peers
 that sent us a message in the last hour, whereas peers in the prebuckets
@@ -933,6 +935,8 @@
       search_asked_peers = Array.init 129 (fun _ -> Fifo.create ());
       search_ok_peers = Array.init 129 (fun _ -> Fifo.create ());
       search_start = last_time ();
+      search_last_query = last_time () + 
+        ((List.length !overnet_searches) mod (int_of_float 
!!overnet_query_peer_period));
       search_hits = 0;
       search_nresults = 0;
       search_results = Hashtbl.create 13;
@@ -1182,6 +1186,8 @@
   | _ -> failwith "Message not understood"
 
 let query_next_peers () =
+  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
@@ -1194,12 +1200,15 @@
           if len > 0 then
             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;
+            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))
+              (if todo > 1 then iter nbits (todo - 1))
+            end else
+              iter nbits todo
           else
             iter (nbits-1) todo
         else
@@ -1208,8 +1217,41 @@
               add_search_peer s p
           ) (get_closest_peers s.search_md4 max_search_queries)
       in
-      iter 128 2
-
+      if s.search_last_query < timeout then begin
+        s.search_last_query <- s.search_last_query + overnet_query_peer_period;
+(* Query next search peers *)
+        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;
+                     raise Exit
+                   end else
+                     Fifo.put s.search_ok_peers.(j) p
+               done
+             with Exit -> ()
+           done
+        end
+      end;
   ) !overnet_searches
 
 let recover_file file =
@@ -1341,7 +1383,11 @@
           ) !!boot_peers;
 
       add_session_timer enabler 1. (fun _ ->
-          if !!enable_overnet then
+          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 ();
+
             let my_peer = my_peer () in
 
 (* ping old peers regularly *)
@@ -1365,17 +1411,18 @@
             begin
               try
                  if !connected_peers < 50 then
-                   for i = 1 to 3 do
+                   for i = 1 to 4 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 + !pre_connected_peers) < 40 then
+                    for i = 1 to 3 do
                       let (ip, port) = LimitedList.get unknown_peers in
                       udp_send_ping ip port (OvernetConnect my_peer);
                     done
               with _ -> ()
             end;
+          end
       );
 
 
@@ -1384,42 +1431,6 @@
           LimitedList.set_max_objects !!boot_peers  2000;
       );
 
-      add_session_timer enabler 10. (fun _ ->
-
-          List.iter (fun s ->
-
-              if s.search_requests < max_search_requests then begin
-                  let nrequests =
-                    match s.search_kind with
-                      FillBuckets -> 0
-                    | FileSearch _ -> 1
-                    | KeywordSearch _ -> 5
-                  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 *)
-                  for i = 1 to nrequests do
-                    try
-                      for j = 128 downto 0 do
-                        if Fifo.length s.search_ok_peers.(j) > 0 then
-                          let p = Fifo.take s.search_ok_peers.(j) in
-                          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));
-                          raise Exit
-                      done
-                    with Exit -> ()
-                  done
-                end
-
-          ) !overnet_searches
-
-      );
-
       add_session_timer enabler 60. (fun _ ->
 
           update_buckets ();
@@ -1434,12 +1445,6 @@
           ) !overnet_searches;
       );
 
-      add_session_option_timer enabler overnet_query_peer_period  (fun _ ->
-          if !!enable_overnet then begin
-              query_next_peers ()
-            end
-      );
-
 (* every 15min for light operations *)
       add_session_timer enabler 900. (fun _ ->
           if !!enable_overnet then begin
@@ -1626,27 +1631,30 @@
                     (Md4.to_string s.search_md4)
                   ); ];
                 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); ];
+                Printf.bprintf buf "\\</tr\\>";
               end
             else
-            Printf.bprintf buf "Search %s for %s\n"
-
-(* ", %d asked, %d done, %d hits, %d results) %s%s\n" *)
+            Printf.bprintf buf "Search %s for %s\nrequests:%d queries:%d 
search_last_query:%d\n"
               (match s.search_kind with
                 KeywordSearch _ -> "keyword"
                 | FileSearch _ -> "file"
                 | FillBuckets -> "fillbuckets" )
-              (Md4.to_string s.search_md4);
+              (Md4.to_string s.search_md4) s.search_requests s.search_queries 
s.search_last_query;
               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
                 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"
-                          i npeers nasked); ];
+                          Printf.sprintf "nbits[%d] = %d peer(s) not asked, %d 
peer(s) asked, %d peer(s) ok"
+                          i npeers nasked nok); ];
                       Printf.bprintf buf "\\</tr\\>";
 
                    end
@@ -1748,33 +1756,29 @@
     "buckets", Arg_none (fun o ->
         let buf = o.conn_buf in
         update_buckets ();
-        if o.conn_output != HTML then
-          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));
-        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;
-            ) listtmp;
-            Buffer.reset buf;
+            let b = ref [] in
+            for i = 0 to !n_used_buckets do
+              if (Fifo.length buckets.(i)) <> 0 || (Fifo.length 
prebuckets.(i)) <> 0 then
+                b := !b @ [("", "dl-1", (Printf.sprintf "\\<a 
href=\\\"submit\\?q=%sdump_bucket\\+%d\\\" 
target=output\\>[Dump]\\</a\\>bucket[%d] : %d peers (prebucket %d)" 
+                command_prefix i i (Fifo.length buckets.(i)) (Fifo.length 
prebuckets.(i)) ) );];
+            done;
+            b := !b @ [("", "dl-1", (Printf.sprintf "\\<a 
href=\\\"submit\\?q=%sbuckets\\\" target=output\\>[Refresh]\\</a\\>" 
command_prefix) );];
             html_mods_table_one_col buf "ovbucketsTable" "results" ([
               ("", "srh",
-                Printf.sprintf "Number of used buckets %d with %d peers 
(prebucket: %d peers)"
-                  !n_used_buckets !connected_peers !pre_connected_peers);
-              ] @ !buckets);
-          end;
+                Printf.sprintf "%d peers (prebucket: %d peers)"
+                  !connected_peers !pre_connected_peers);
+              ] @ !b);
+        end else begin
+          Printf.bprintf buf "%d peers (prebucket: %d peers)\n"
+            !connected_peers !pre_connected_peers;
+          for i = 0 to !n_used_buckets do
+            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;
+        end;
           ""
     ), ":\t\t\t\tprint buckets table status";
 




reply via email to

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