sks-devel
[Top][All Lists]
Advanced

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

[PATCH 5] Use all available addresses of partners (was: [Sks-devel] [PAT


From: Kim Minh Kaplan
Subject: [PATCH 5] Use all available addresses of partners (was: [Sks-devel] [PATCH] Bundle IPv6, DNS fixes, sks dump fix)
Date: Wed, 25 Mar 2009 16:48:15 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux)

Use all available addresses of partners.  Thus enabling connection
through IPv6.

Up to now all patches were mostly independant of one another.  This one
is slightly dependant on PATCH 4.  The last patch I have in store, DNS
staleness fix, is very dependant on this one.  So I will withold
preparing it until I know against what version I should work.

Kim Minh.

changeset:   55:a2414baf915a
branch:      prepare-for-release
tag:         tip
parent:      53:b1c6270313e0
user:        address@hidden
date:        Wed Mar 25 16:38:55 2009 +0000
files:       membership.ml reconCS.ml reconserver.ml
description:
Use all available addresses of partners.


diff -r b1c6270313e0 -r a2414baf915a membership.ml
--- a/membership.ml     Wed Mar 25 13:43:26 2009 +0000
+++ b/membership.ml     Wed Mar 25 16:38:55 2009 +0000
@@ -34,23 +34,24 @@
 
 let whitespace = Str.regexp "[ \t]+"
 
-let lookup_hostname string = 
-  try (Unix.gethostbyname string).Unix.h_addr_list.(0)
-  with 
-    | Invalid_argument _ | Not_found -> raise (Lookup_failure string)
+let lookup_hostname string service =
+  Unix.getaddrinfo string service [Unix.AI_SOCKTYPE Unix.SOCK_STREAM]
 
 let local_recon_addr () = 
-  Unix.ADDR_INET (lookup_hostname !Settings.hostname, recon_port)
+  lookup_hostname !Settings.hostname (string_of_int recon_port)
 
 let local_recon_addr = Utils.unit_memoize local_recon_addr
 
 let remove_self addresses = 
-  List.filter ~f:(fun (addr,str) -> addr <> local_recon_addr ()) addresses
+  let is_self = List.mem ~set:(local_recon_addr ()) in
+  List.filter ~f:(fun (addr, _) -> not (List.exists ~f:is_self addr)) addresses
 
 let convert_address l =
   try 
-    sscanf l "%s %d" 
-    (fun addr port -> Unix.ADDR_INET (lookup_hostname addr,port))
+    sscanf l "%s %s"
+      (fun addr service -> if addr = "" || service = "" then
+       raise End_of_file else
+       lookup_hostname addr service)
   with 
     Scanf.Scan_failure _ | End_of_file | Failure _ -> raise (Malformed_entry l)
 
@@ -59,6 +60,7 @@
     try
       let line = decomment (input_line file) in
       let addr = convert_address line in
+      if addr = [] then raise (Lookup_failure line);
       (addr,line) :: loop list
     with
       | End_of_file -> list
@@ -93,15 +95,21 @@
             )
     ~finally:(fun () -> close_in file)
 
-let sockaddr_to_string sockaddr = match sockaddr with
-    Unix.ADDR_UNIX s -> sprintf "<ADDR_UNIX %s>" s
-  | Unix.ADDR_INET (addr,p) -> sprintf "<ADDR_INET %s:%d>" 
-      (Unix.string_of_inet_addr addr) p
+let ai_to_string = function
+  | { Unix.ai_addr = Unix.ADDR_UNIX s } -> sprintf "<ADDR_UNIX %s>" s
+  | { Unix.ai_addr = Unix.ADDR_INET (addr,p) } -> sprintf "<ADDR_INET 
[%s]:%d>" 
+       (Unix.string_of_inet_addr addr) p
+
+let ai_list_to_string = function
+    [] -> "<UNKNOWN>"
+  | ai :: [] -> ai_to_string ai
+  | ai_list ->
+      "(" ^ (String.concat ~sep:", " (List.map ~f:ai_to_string ai_list)) ^ ")"
 
 let membership_string () = 
   let (mshp,_) = !membership in
   let to_string (addr,str) =
-    sprintf "%s(%s)" (sockaddr_to_string addr) str
+    sprintf "(%s)%s" str (ai_list_to_string addr)
   in
   let strings = List.map ~f:to_string (Array.to_list mshp) in
   "Membership: " ^ String.concat ~sep:", " strings
@@ -158,9 +166,9 @@
   
   let found = ref false in
   let i = ref 0 in
+  let f { Unix.ai_addr = thisaddr } = same_inet_addr addr thisaddr in
   while !i < Array.length m && not !found do 
-    if same_inet_addr addr (fst m.(!i)) then
-      found := true;
+    found := List.exists ~f (fst m.(!i));
     incr i
   done;
   !found
diff -r b1c6270313e0 -r a2414baf915a reconCS.ml
--- a/reconCS.ml        Wed Mar 25 13:43:26 2009 +0000
+++ b/reconCS.ml        Wed Mar 25 16:38:55 2009 +0000
@@ -132,21 +132,21 @@
 let connect tree ~filters ~partner ~self = 
   (* TODO: change the following to depend on the address type *)
   let s = Unix.socket 
-           ~domain:(Unix.domain_of_sockaddr partner)
-           ~kind:Unix.SOCK_STREAM 
-           ~protocol:0 
+           ~domain:partner.Unix.ai_family 
+           ~kind:partner.Unix.ai_socktype
+           ~protocol:partner.Unix.ai_protocol
   in
   let run () =
-    Unix.bind s ~addr:(match_client_recon_addr partner);
-    Unix.connect s ~addr:partner;
+    Unix.bind s ~addr:(match_client_recon_addr partner.Unix.ai_addr);
+    Unix.connect s ~addr:partner.Unix.ai_addr;
     let cin = Channel.sys_in_from_fd s
     and cout = Channel.sys_out_from_fd s in
     plerror 4 "Initiating reconciliation";
-    let remote_config = handle_config cin cout filters partner in
+    let remote_config = handle_config cin cout filters partner.Unix.ai_addr in
     ignore (Unix.alarm !Settings.reconciliation_timeout);
 
     let http_port = config_get_http_port remote_config in
-    let remote_http_address = change_port partner http_port in
+    let remote_http_address = change_port partner.Unix.ai_addr http_port in
 
     let data = Server.handle tree cin cout in
     (data,remote_http_address)
diff -r b1c6270313e0 -r a2414baf915a reconserver.ml
--- a/reconserver.ml    Wed Mar 25 13:43:26 2009 +0000
+++ b/reconserver.ml    Wed Mar 25 16:38:55 2009 +0000
@@ -80,7 +80,16 @@
 
   let choose_partner () = 
     try
-      choose (Membership.get ())
+      let addrlist = choose (Membership.get ()) in
+      (* Only return usable addresses *)
+      let is_compatible addr =
+       try
+         ignore (match_client_recon_addr addr.Unix.ai_addr);
+         true
+       with Not_found -> false
+      in
+      let addrlist = List.filter ~f:is_compatible addrlist in
+      List.nth addrlist (Random.int (List.length addrlist))
     with
        Not_found | Invalid_argument _ -> 
          failwith "No gossip partners available"
@@ -211,7 +220,7 @@
     else
       begin
        let partner = choose_partner () in
-       plerror 4 "Recon partner: %s" (sockaddr_to_string partner);
+       plerror 4 "Recon partner: %s" (sockaddr_to_string partner.Unix.ai_addr);
        let filters = get_filters () in
        let (results,http_addr) = 
          ReconCS.connect (get_ptree ()) ~filters ~partner 


reply via email to

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