# HG changeset patch # User Marcus Granado # Date 1274449016 -3600 # Node ID 3678824a34447601d81a115c6e83b8e7b2b06c99 # Parent d14022d7376eae45eb056c5c9caa61eadb883358 CA-34933: do not gc sessions in running tasks Signed-off-by: Marcus Granado diff -r d14022d7376e -r 3678824a3444 ocaml/idl/datamodel.ml --- a/ocaml/idl/datamodel.ml +++ b/ocaml/idl/datamodel.ml @@ -2858,6 +2858,7 @@ field ~in_product_since:rel_george ~qualifier:DynamicRO ~default_value:(Some(VString(""))) ~ty:String "auth_user_sid" "the subject identifier of the user that was externally authenticated. If a session instance has is_local_superuser set, then the value of this field is undefined."; field ~in_product_since:rel_midnight_ride ~qualifier:DynamicRO ~default_value:(Some(VString(""))) ~ty:String "auth_user_name" "the subject name of the user that was externally authenticated. If a session instance has is_local_superuser set, then the value of this field is undefined."; field ~in_product_since:rel_midnight_ride ~qualifier:StaticRO ~default_value:(Some(VSet [])) ~ty:(Set(String)) "rbac_permissions" "list with all RBAC permissions for this session"; + field ~in_product_since:rel_midnight_ride ~qualifier:DynamicRO ~ty:(Set(Ref _task)) "tasks" "list of tasks created using the current session"; ] () @@ -5951,6 +5952,7 @@ (* subtasks hierarchy *) (_task, "subtask_of"), (_task, "subtasks"); + (_task, "session"), (_session, "tasks"); (_pif, "bond_slave_of"), (_bond, "slaves"); (_bond, "master"), (_pif, "bond_master_of"); diff -r d14022d7376e -r 3678824a3444 ocaml/xapi/db_gc.ml --- a/ocaml/xapi/db_gc.ml +++ b/ocaml/xapi/db_gc.ml @@ -203,10 +203,14 @@ let all_hosts = Db.Host.get_all ~__context in List.iter check_host all_hosts +let task_status_is_completed task_status = + (task_status=`success) || (task_status=`failure) || (task_status=`cancelled) + let timeout_sessions ~__context = let all_sessions = Db.Session.get_internal_records_where ~__context ~expr:Db_filter_types.True in let not_intrapool_sessions = List.filter (fun (_, y) -> not y.Db_actions.session_pool) all_sessions in - let disposable_sessions = not_intrapool_sessions in + let unused_sessions = List.filter (fun (_, y) -> List.for_all (fun t -> task_status_is_completed (Db.Task.get_status ~__context ~self:t)) y.Db_actions.session_tasks) not_intrapool_sessions in + let disposable_sessions = unused_sessions in (* Only keep a list of (ref, last_active, uuid) *) let disposable_sessions = List.map (fun (x, y) -> x, Date.to_float y.Db_actions.session_last_active, y.Db_actions.session_uuid) disposable_sessions in (* Definitely invalidate sessions last used long ago *) @@ -236,9 +240,6 @@ let oldest_completed_time = Unix.time() -. Xapi_globs.completed_task_timeout (* time out completed tasks after 65 minutes *) in let oldest_pending_time = Unix.time() -. Xapi_globs.pending_task_timeout (* time out pending tasks after 24 hours *) in - let task_status_is_completed task_status = - (task_status=`success) || (task_status=`failure) || (task_status=`cancelled) in - let should_delete_task (_, t) = if task_status_is_completed t.Db_actions.task_status then Date.to_float t.Db_actions.task_finished < oldest_completed_time