# HG changeset patch # User Rob Hoes Split Xapi_periodic_scheduler into two parts ...to resolve cyclic dependencies. Placed the register function into a separate module, as this function depends on various other modules. Also added ocamldoc comments. Signed-off-by: Rob Hoes diff -r f0f5f84ef6d9 ocaml/xapi/OMakefile --- a/ocaml/xapi/OMakefile Mon Dec 07 15:17:02 2009 +0000 +++ b/ocaml/xapi/OMakefile Tue Dec 08 10:04:59 2009 +0000 @@ -176,6 +176,7 @@ cli_printer \ ipq \ xapi_periodic_scheduler \ + xapi_periodic_scheduler_init \ dbsync \ dbsync_slave \ dbsync_master \ diff -r f0f5f84ef6d9 ocaml/xapi/xapi.ml --- a/ocaml/xapi/xapi.ml Mon Dec 07 15:17:02 2009 +0000 +++ b/ocaml/xapi/xapi.ml Tue Dec 08 10:04:59 2009 +0000 @@ -829,7 +829,7 @@ "touching ready file", [], (fun () -> Helpers.touch_file !Xapi_globs.ready_file); (* -- CRITICAL: this check must be performed before touching shared storage *) "Performing no-other-masters check", [ Startup.OnlyMaster ], check_no_other_masters; - "Registering periodic functions", [], Xapi_periodic_scheduler.register; + "Registering periodic functions", [], Xapi_periodic_scheduler_init.register; "executing startup scripts", [ Startup.NoExnRaising], startup_script; "considering executing on-master-start script", [], diff -r f0f5f84ef6d9 ocaml/xapi/xapi_periodic_scheduler.ml --- a/ocaml/xapi/xapi_periodic_scheduler.ml Mon Dec 07 15:17:02 2009 +0000 +++ b/ocaml/xapi/xapi_periodic_scheduler.ml Tue Dec 08 10:04:59 2009 +0000 @@ -11,7 +11,6 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. *) -(* Periodic scheduler - for background tasks *) module D = Debug.Debugger(struct let name="backgroundscheduler" end) open D @@ -63,85 +62,4 @@ with _ -> () done -let register () = - debug "Registering periodic calls"; - let master = Pool_role.is_master () in - - (* blob/message/rrd file syncing - sync once a day *) - let sync_timer = - if Xapi_fist.reduce_blob_sync_interval then 60.0 *. 5.0 else 60.0 *. 60.0 *. 24.0 in - let sync_func () = - Xapi_sync.do_sync () in - let sync_delay = - (* 10 mins if fist point there - to ensure rrd sync happens first *) - if Xapi_fist.reduce_blob_sync_interval then 60.0 *. 10.0 else 7200.0 in - - (* Logrotate - poll the amount of data written out by the logger, *) - (* and call logrotate when it exceeds the threshold *) - let logrotate_timer = 60.0 *. 5.0 in - let logrotate_func () = - let dorotate = Mutex.execute Log.mutex - (fun () -> - if !Log.filesize > !Xapi_globs.logrot_max then - (Log.filesize := 0; true) - else - false) - in - if dorotate - then - try - info "xapi about to invoke logrotate"; - let stdout, stderr = Forkhelpers.execute_command_get_output Xapi_globs.logrot_cmd Xapi_globs.logrot_arg in - info "Logrotate executed: stdout='%s' stderr='%s'" stdout stderr - with Forkhelpers.Spawn_internal_error(log,output,err) -> - error "Logrotate executed with error code: stdout='%s' stderr='%s'" output log; - () - in - - (* Network bridge GC *) - let networkgc_timer = 60.0 *. 60.0 *. 1.5 in (* hour and a half *) - let networkgc_func () = Xapi_network.network_gc_func () in - - (* Heartbeat to show the queue is still running - will be more useful when there's less logging! *) - let hb_timer = 3600.0 in (* one hour *) - let hb_func () = debug "Periodic scheduler heartbeat" in - - (* Periodic backup of RRDs *) - let rrdbackup_timer = - if Xapi_fist.reduce_rrd_backup_interval then 60.0 *. 5.0 else 3600.0 *. 24.0 in - let rrdbackup_func () = - Server_helpers.exec_with_new_task "rrdbackup_func" - (fun __context -> - let hosts = Db.Host.get_all ~__context in - Helpers.call_api_functions ~__context - (fun rpc session_id -> - ignore(List.fold_left (fun delay host -> Client.Client.Host.backup_rrds rpc session_id host delay; (delay +. 60.0)) 0.0 hosts))) - in - let rrdbackup_delay = - if Xapi_fist.reduce_rrd_backup_interval then 60.0 *. 6.0 else 3600.0 in - - (* CP-703: Periodic revalidation of externally-authenticated sessions *) - let session_revalidation_timer = 60.0 *. 5.0 in (* every 5 minutes *) - let session_revalidation_func () = - Server_helpers.exec_with_new_task "session_revalidation_func" - (fun __context -> Xapi_session.revalidate_all_sessions ~__context) in - let session_revalidation_delay = 60.0 *. 5.0 in (* initial delay = 5 minutes *) - - (* CP-820: other-config field in subjects should be periodically refreshed *) - let update_all_subjects_timer = 60.0 *. 15.0 in (* every 15 minutes *) - let update_all_subjects_func () = - Server_helpers.exec_with_new_task "update_all_subjects_func" - (fun __context -> Xapi_subject.update_all_subjects ~__context) in - let update_all_subjects_delay = 60.0 *. 15.0 in (* initial delay = 15 minutes *) - - if master then add_to_queue "Synchronising RRDs/messages" (Periodic sync_timer) sync_delay sync_func; - if master then add_to_queue "Backing up RRDs" (Periodic rrdbackup_timer) rrdbackup_delay rrdbackup_func; - if master then add_to_queue "Revalidating externally-authenticated sessions" - (Periodic session_revalidation_timer) session_revalidation_delay session_revalidation_func; - if master then add_to_queue "Trying to update subjects' info using external directory service (if any)" - (Periodic update_all_subjects_timer) update_all_subjects_delay update_all_subjects_func; - add_to_queue "Logrotate" (Periodic logrotate_timer) 120.0 logrotate_func; - add_to_queue "Network bridge GC" (Periodic networkgc_timer) networkgc_timer networkgc_func; - add_to_queue "Periodic scheduler heartbeat" (Periodic hb_timer) 240.0 hb_func; - diff -r f0f5f84ef6d9 ocaml/xapi/xapi_periodic_scheduler.mli --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ocaml/xapi/xapi_periodic_scheduler.mli Tue Dec 08 10:04:59 2009 +0000 @@ -0,0 +1,27 @@ +(* + * Copyright (C) 2006-2009 Citrix Systems Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + *) +(** Periodic scheduler for background tasks. *) + +(** Timer type. *) +type func_ty = +| OneShot (** Fire just once *) +| Periodic of float (** Fire periodically with a given period in seconds *) + +(** Start a new timer. *) +val add_to_queue : + ?signal:bool -> string -> func_ty -> float -> (unit -> unit) -> unit + +(** The scheduler's main loop, started by {!Xapi} on start-up. *) +val loop : unit -> unit + diff -r f0f5f84ef6d9 ocaml/xapi/xapi_periodic_scheduler_init.mli --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ocaml/xapi/xapi_periodic_scheduler_init.mli Tue Dec 08 10:04:59 2009 +0000 @@ -0,0 +1,17 @@ +(* + * Copyright (C) 2006-2009 Citrix Systems Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; version 2.1 only. with the special + * exception on linking described in file LICENSE. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + *) +(** Schedule common background tasks. *) + +(** Register periodic calls, done by {!Xapi} on start-up. *) +val register : unit -> unit