X-Git-Url: http://git.annexia.org/?p=whenjobs.git;a=blobdiff_plain;f=daemon%2Fdaemon.ml;fp=daemon%2Fdaemon.ml;h=64d4012746771941379030df9a880be2d5951d1f;hp=bc4f51a2f1177e5be2692a233d7f2b850f9a55bc;hb=de72662854c3db9365296dd45cade2253910be7f;hpb=602f482985977184bfa2794cfb91b15337035a0a diff --git a/daemon/daemon.ml b/daemon/daemon.ml index bc4f51a..64d4012 100644 --- a/daemon/daemon.ml +++ b/daemon/daemon.ml @@ -292,13 +292,38 @@ and proc_whisper_variables vars = (* Reload the jobs file(s). *) and reload_files () = - (* Get dir/*.cmo (bytecode) or dir/*.cmxs (native code) *) - let suffix = if not Dynlink.is_native then ".cmo" else ".cmxs" in - let dir = !jobsdir in - let files = Array.to_list (Sys.readdir dir) in - let files = List.filter (fun file -> string_endswith file suffix) files in - let files = List.map (fun file -> dir // file) files in - let files = List.sort compare files in + (* Get the highest numbered dir/jobs__*.cmo (bytecode) or + * dir/jobs__*.cmxs (native code) file and load it. Delete + * lower-numbered (== older) files. + *) + let filename = + let suffix, slen = + if not Dynlink.is_native then ".cmo", 4 else ".cmxs", 5 in + let dir = !jobsdir in + let files = Array.to_list (Sys.readdir dir) in + let times = filter_map ( + fun file -> + if not (string_startswith file "jobs__") || + not (string_endswith file suffix) then + None + else ( + let len = String.length file in + let t = String.sub file 6 (len-slen-6) in + try Some (int_of_string t) with Failure "int_of_string" -> None + ) + ) files in + let times = List.rev (List.sort compare times) in + match times with + | [] -> None + | x::xs -> + (* Unlink the older files. *) + List.iter ( + fun t -> + try unlink (dir // sprintf "jobs__%d%s" t suffix) + with Unix_error _ -> () + ) xs; + (* Return the newest (highest numbered) file. *) + Some (dir // sprintf "jobs__%d%s" x suffix) in (* As we are reloading the file, we want to create a new state * that has no jobs, but has all the variables from the previous @@ -308,19 +333,24 @@ and reload_files () = Whenfile.init s; let s = - try - List.iter Dynlink.loadfile files; - let s = Whenfile.get_state () in - Syslog.notice "loaded %d job(s) from %d file(s)" - (Whenstate.nr_jobs s) (List.length files); + match filename with + | None -> + (* no jobs file, return the same state *) + Syslog.notice "no jobs file found"; s - with - | Dynlink.Error err -> - let err = Dynlink.error_message err in - Syslog.error "error loading jobs: %s" err; - failwith err - | exn -> - failwith (Printexc.to_string exn) in + | Some filename -> + try + Dynlink.loadfile filename; + let s = Whenfile.get_state () in + Syslog.notice "loaded %d job(s)" (Whenstate.nr_jobs s); + s + with + | Dynlink.Error err -> + let err = Dynlink.error_message err in + Syslog.error "error loading jobs: %s" err; + failwith err + | exn -> + failwith (Printexc.to_string exn) in let s = Whenstate.copy_prev_state !state s in state := s;