sks-devel
[Top][All Lists]
Advanced

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

[PATCH 6] Fix DNS staleness (was: [Sks-devel] [PATCH] Bundle IPv6, DNS f


From: Kim Minh Kaplan
Subject: [PATCH 6] Fix DNS staleness (was: [Sks-devel] [PATCH] Bundle IPv6, DNS fixes, sks dump fix)
Date: Sat, 28 Mar 2009 11:21:29 +0000
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.0.60 (gnu/linux)

Fix DNS staleness.
Resolve partner's addresses every time it is choosen for recon.

Kim Minh.

diff -r 4458db9d61bf membership.ml
--- a/membership.ml     Sat Mar 28 10:49:51 2009 +0000
+++ b/membership.ml     Sat Mar 28 11:10:32 2009 +0000
@@ -42,16 +42,12 @@
 
 let local_recon_addr = Utils.unit_memoize local_recon_addr
 
-let remove_self 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 %s"
       (fun addr service ->
          if addr = "" || service = "" then failwith "Blank line";
-         lookup_hostname addr service)
+         addr, service)
   with 
     Scanf.Scan_failure _ | End_of_file | Failure _ -> raise (Malformed_entry l)
 
@@ -60,19 +56,14 @@
     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
+      addr :: loop list
     with
       | End_of_file -> list
-      | Lookup_failure addr -> 
-         perror "Lookup failure on address %s" addr;
-         loop list
       | Malformed_entry line -> 
          perror "Malformed entry %s" line;
          loop list
   in
-  let raw_membership = loop [] in
-  Array.of_list (remove_self raw_membership)
+  loop []
 
 let get_mtime fname = 
   try
@@ -85,14 +76,7 @@
 let load_membership fname = 
   let file = open_in fname in
   protect ~f:(fun () -> 
-               let mshp = load_membership_file file in
-               match get_mtime fname with
-                 | None -> 
-                     plerror 2 "%s" 
-                       ("Unable to get mtime for membership. " ^
-                        "Failed to reload.")
-                 | Some mtime -> membership := (mshp,mtime)
-            )
+    load_membership_file file)
     ~finally:(fun () -> close_in file)
 
 let ai_to_string = function
@@ -105,12 +89,22 @@
 
 let membership_string () = 
   let (mshp,_) = !membership in
-  let to_string (addr,str) =
-    sprintf "(%s)%s" str (ai_list_to_string addr)
+  let to_string (addr, (host, service)) =
+    sprintf "(%s %s)%s" host service (ai_list_to_string addr)
   in
   let strings = List.map ~f:to_string (Array.to_list mshp) in
   "Membership: " ^ String.concat ~sep:", " strings
     
+(* Refresh member n's address *)
+let refresh_member members n =
+  match members.(n) with
+    (addr, (host, service as line)) ->
+      let fresh_addr = lookup_hostname host service in
+      if addr <> fresh_addr then begin
+       members.(n) <- (fresh_addr, line);
+       plerror 3 "address for %s:%s changed from %s to %s"
+         host service (ai_list_to_string addr) (ai_list_to_string fresh_addr)
+      end
 
 let reload_if_changed () = 
   let fname = Lazy.force Settings.membership_file in
@@ -121,8 +115,21 @@
                        "Can't decide whether to reload")
     | Some mtime ->
        if old_mtime <> mtime then 
-         ( load_membership fname;
-           plerror 5 "%s" (membership_string ())
+         ( let memberlines = load_membership fname in
+         let old = Array.to_list mshp in
+         let f line =
+           try
+             List.find ~f:(fun (_, old_line) -> line = old_line) old
+           with
+             Not_found -> ([], line)
+         in
+         let merged = Array.of_list (List.map ~f memberlines) in
+         membership := (merged, mtime);
+         plerror 5 "%s" (membership_string ());
+         (* Try to lookup unknown names *)
+         Array.iteri
+             ~f:(fun i mb -> if fst mb = [] then refresh_member merged i)
+             merged
          )
 
 let get_names () = 
@@ -134,28 +141,34 @@
     )
     else [| |]
   in
-  Array.map ~f:snd mshp
+  Array.map ~f:(function (_, (host, service)) -> host ^ " " ^ service) mshp
 
 
 let reset_membership_time () =
   let (m,mtime) = !membership in
   membership := (m,0.)
 
-let get () = 
-  let mshp = 
-    if Sys.file_exists (Lazy.force Settings.membership_file) then (
-      reload_if_changed ();
-      let (m,mtime) = !membership in 
-      m
-    )
-    else [| |]
-  in
-  Array.map ~f:fst mshp
-
 let same_inet_addr addr1 addr2 = 
   match (addr1,addr2) with
       (Unix.ADDR_INET (ip1,_), Unix.ADDR_INET (ip2,_)) -> ip1 = ip2
     | _ -> false
+
+let rec choose () =
+  if Sys.file_exists (Lazy.force Settings.membership_file) then begin
+    reload_if_changed ();
+    let (mshp, _) = !membership in
+    let choice = Random.int (Array.length mshp) in
+    refresh_member mshp choice;
+    match fst mshp.(choice) with
+      [] -> choose ()
+    | addrlist ->
+       let saddr = (List.hd addrlist).Unix.ai_addr in
+       let same_addr thisaddr = same_inet_addr saddr thisaddr.Unix.ai_addr in
+       if List.exists ~f:same_addr (local_recon_addr ()) then
+         choose () else
+         addrlist
+  end else
+    raise Not_found
 
 let test addr = 
   reload_if_changed ();
diff -r 4458db9d61bf reconserver.ml
--- a/reconserver.ml    Sat Mar 28 10:49:51 2009 +0000
+++ b/reconserver.ml    Sat Mar 28 11:10:32 2009 +0000
@@ -74,13 +74,9 @@
        handle addr cin cout
     )
 
-  let choose array = 
-    if Array.length array = 0 then raise Not_found
-    else array.(Random.int (Array.length array))
-
   let choose_partner () = 
     try
-      let addrlist = choose (Membership.get ()) in
+      let addrlist = Membership.choose () in
       (* Only return usable addresses *)
       let is_compatible addr =
        try

reply via email to

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