@@ -18,11 +18,19 @@ module Date = Xapi_stdext_date.Date
18
18
19
19
let with_lock = Xapi_stdext_threads.Threadext.Mutex. execute
20
20
21
+ let ( let@ ) f x = f x
22
+
23
+ let finally_complete_tracing ?error __context f =
24
+ Xapi_stdext_pervasives.Pervasiveext. finally f (fun () ->
25
+ Context. complete_tracing ?error __context
26
+ )
27
+
21
28
type t = API .ref_task
22
29
23
30
(* creates a new task *)
24
31
let make ~__context ~http_other_config ?(description = " " ) ?session_id
25
32
?subtask_of label : t * t Uuidx.t =
33
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
26
34
let uuid = Uuidx. make () in
27
35
let uuid_str = Uuidx. to_string uuid in
28
36
let ref = Ref. make () in
@@ -35,8 +43,7 @@ let make ~__context ~http_other_config ?(description = "") ?session_id
35
43
Ref. null
36
44
in
37
45
let (_ : unit ) =
38
- Db_actions.DB_Action.Task. create ~ref ~__context
39
- ~created: (Date. of_float (Unix. time () ))
46
+ Db_actions.DB_Action.Task. create ~ref ~__context ~created: (Date. now () )
40
47
~finished: (Date. of_float 0.0 ) ~current_operations: [] ~_type:" <none/>"
41
48
~session: (Option. value ~default: Ref. null session_id)
42
49
~resident_on: ! Xapi_globs. localhost_ref ~status: `pending ~result: " "
@@ -64,6 +71,7 @@ let are_auth_user_ids_of_sessions_equal ~__context s1 s2 =
64
71
s1_auth_user_sid = s2_auth_user_sid
65
72
66
73
let assert_op_valid ?(ok_if_no_session_in_context = false ) ~__context task_id =
74
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
67
75
let assert_permission_task_op_any () =
68
76
match ! rbac_assert_permission_fn with
69
77
| None ->
@@ -106,13 +114,15 @@ let assert_op_valid ?(ok_if_no_session_in_context = false) ~__context task_id =
106
114
assert_permission_task_op_any ()
107
115
108
116
let get_name ~__context =
117
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
109
118
let task_id = Context. get_task_id __context in
110
119
if Ref. is_dummy task_id then
111
120
Ref. name_of_dummy task_id
112
121
else
113
122
Db.Task. get_name_label ~__context ~self: task_id
114
123
115
124
let destroy ~__context task_id =
125
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
116
126
if not (Ref. is_dummy task_id) then (
117
127
assert_op_valid ~ok_if_no_session_in_context: true ~__context task_id ;
118
128
Db_actions.DB_Action.Task. destroy ~__context ~self: task_id
@@ -128,34 +138,36 @@ let init () =
128
138
Context. __make_task := make
129
139
130
140
let operate_on_db_task ~__context f =
141
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
131
142
if Context. task_in_database __context then
132
143
f (Context. get_task_id __context)
133
144
134
145
let set_description ~__context value =
135
- operate_on_db_task ~ __context ( fun self ->
136
- Db_actions.DB_Action.Task. set_name_description ~__context ~self ~value
137
- )
146
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
147
+ let @ self = operate_on_db_task ~__context in
148
+ Db_actions.DB_Action.Task. set_name_description ~__context ~self ~value
138
149
139
150
let add_to_other_config ~__context key value =
140
- operate_on_db_task ~ __context ( fun self ->
141
- Db_actions.DB_Action.Task. remove_from_other_config ~__context ~self ~key ;
142
- Db_actions.DB_Action.Task. add_to_other_config ~__context ~self ~key ~value
143
- )
151
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
152
+ let @ self = operate_on_db_task ~__context in
153
+ Db_actions.DB_Action.Task. remove_from_other_config ~__context ~self ~key ;
154
+ Db_actions.DB_Action.Task. add_to_other_config ~__context ~self ~key ~value
144
155
145
156
let set_progress ~__context value =
146
- operate_on_db_task ~ __context ( fun self ->
147
- Db_actions.DB_Action.Task. set_progress ~__context ~self ~value
148
- )
157
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
158
+ let @ self = operate_on_db_task ~__context in
159
+ Db_actions.DB_Action.Task. set_progress ~__context ~self ~value
149
160
150
161
let set_external_pid ~__context pid =
151
- operate_on_db_task ~ __context ( fun self ->
152
- Db_actions.DB_Action.Task. set_externalpid ~__context ~self
153
- ~value: ( Int64. of_int pid)
154
- )
162
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
163
+ let @ self = operate_on_db_task ~__context in
164
+ Db_actions.DB_Action.Task. set_externalpid ~__context ~self
165
+ ~value: ( Int64. of_int pid )
155
166
156
167
let clear_external_pid ~__context = set_external_pid ~__context (- 1 )
157
168
158
169
let set_result_on_task ~__context task_id result =
170
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
159
171
match result with
160
172
| None ->
161
173
()
@@ -165,7 +177,9 @@ let set_result_on_task ~__context task_id result =
165
177
166
178
(* * Only set the result without completing the task. Useful for vm import *)
167
179
let set_result ~__context result =
168
- operate_on_db_task ~__context (fun t -> set_result_on_task ~__context t result)
180
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
181
+ let @ self = operate_on_db_task ~__context in
182
+ set_result_on_task ~__context self result
169
183
170
184
let status_to_string = function
171
185
| `pending ->
@@ -183,36 +197,36 @@ let status_is_completed task_status =
183
197
task_status = `success || task_status = `failure || task_status = `cancelled
184
198
185
199
let complete ~__context result =
186
- Context. complete_tracing __context ;
187
- operate_on_db_task ~__context ( fun self ->
188
- let status = Db_actions.DB_Action.Task. get_status ~__context ~self in
189
- if status = `pending then (
190
- Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
191
- ~value: [] ;
192
- Db_actions.DB_Action.Task. set_finished ~__context ~self
193
- ~value: ( Date. of_float ( Unix. time () )) ;
194
- Db_actions.DB_Action.Task. set_progress ~__context ~self ~ value:1. ;
195
- set_result_on_task ~__context self result ;
196
- Db_actions.DB_Action.Task. set_status ~__context ~ self ~value: `success
197
- ) else
198
- debug " the status of %s is: %s; cannot set it to `success "
199
- ( Ref. really_pretty_and_small self)
200
- (status_to_string status )
201
- )
200
+ let @ () = finally_complete_tracing __context in
201
+ let @ self = operate_on_db_task ~__context in
202
+ let status = Db_actions.DB_Action.Task. get_status ~__context ~self in
203
+ match status with
204
+ | `pending ->
205
+ Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
206
+ ~value: [] ;
207
+ Db_actions.DB_Action.Task. set_finished ~__context ~self
208
+ ~ value:( Date. now () ) ;
209
+ Db_actions.DB_Action.Task. set_progress ~__context ~ self ~value: 1. ;
210
+ set_result_on_task ~__context self result ;
211
+ Db_actions.DB_Action.Task. set_status ~__context ~self ~value: `success
212
+ | _ ->
213
+ debug " the status of %s is: %s; cannot set it to `success "
214
+ ( Ref. really_pretty_and_small self )
215
+ (status_to_string status )
202
216
203
217
let set_cancellable ~__context =
204
- operate_on_db_task ~ __context ( fun self ->
205
- Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
206
- ~value: [ `cancel ]
207
- )
218
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
219
+ let @ self = operate_on_db_task ~__context in
220
+ Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
221
+ ~value: [ `cancel ]
208
222
209
223
let set_not_cancellable ~__context =
210
- operate_on_db_task ~__context (fun self ->
211
- Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
212
- ~value: []
213
- )
224
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
225
+ let @ self = operate_on_db_task ~__context in
226
+ Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self ~value: []
214
227
215
228
let is_cancelling ~__context =
229
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
216
230
Context. task_in_database __context
217
231
&&
218
232
let l =
@@ -222,21 +236,22 @@ let is_cancelling ~__context =
222
236
List. exists (fun (_ , x ) -> x = `cancel ) l
223
237
224
238
let raise_cancelled ~__context =
239
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
225
240
let task_id = Context. get_task_id __context in
226
241
raise Api_errors. (Server_error (task_cancelled, [Ref. string_of task_id]))
227
242
228
243
let exn_if_cancelling ~__context =
244
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
229
245
if is_cancelling ~__context then
230
246
raise_cancelled ~__context
231
247
232
248
let cancel_this ~__context ~self =
233
- Context. complete_tracing __context ;
249
+ let @ () = finally_complete_tracing __context in
234
250
assert_op_valid ~__context self ;
235
251
let status = Db_actions.DB_Action.Task. get_status ~__context ~self in
236
252
if status = `pending then (
237
253
Db_actions.DB_Action.Task. set_progress ~__context ~self ~value: 1. ;
238
- Db_actions.DB_Action.Task. set_finished ~__context ~self
239
- ~value: (Date. of_float (Unix. time () )) ;
254
+ Db_actions.DB_Action.Task. set_finished ~__context ~self ~value: (Date. now () ) ;
240
255
Db_actions.DB_Action.Task. set_status ~__context ~self ~value: `cancelled ;
241
256
Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self ~value: []
242
257
) else
@@ -245,35 +260,40 @@ let cancel_this ~__context ~self =
245
260
(status_to_string status)
246
261
247
262
let cancel ~__context =
248
- operate_on_db_task ~__context (fun self -> cancel_this ~__context ~self )
263
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
264
+ let @ self = operate_on_db_task ~__context in
265
+ cancel_this ~__context ~self
249
266
250
267
let failed ~__context exn =
251
268
let backtrace = Printexc. get_backtrace () in
252
- Context. complete_tracing __context ~error: (exn , backtrace) ;
269
+ let @ () = finally_complete_tracing ~error: (exn , backtrace) __context in
253
270
let code, params = ExnHelper. error_of_exn exn in
254
- operate_on_db_task ~__context (fun self ->
255
- let status = Db_actions.DB_Action.Task. get_status ~__context ~self in
256
- if status = `pending then (
257
- Db_actions.DB_Action.Task. set_progress ~__context ~self ~value: 1. ;
258
- Db_actions.DB_Action.Task. set_error_info ~__context ~self
259
- ~value: (code :: params) ;
260
- Db_actions.DB_Action.Task. set_backtrace ~__context ~self
261
- ~value: (Sexplib.Sexp. to_string Backtrace. (sexp_of_t (get exn ))) ;
262
- Db_actions.DB_Action.Task. set_finished ~__context ~self
263
- ~value: (Date. of_float (Unix. time () )) ;
264
- Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
265
- ~value: [] ;
266
- if code = Api_errors. task_cancelled then
267
- Db_actions.DB_Action.Task. set_status ~__context ~self
268
- ~value: `cancelled
269
- else
270
- Db_actions.DB_Action.Task. set_status ~__context ~self ~value: `failure
271
- ) else
272
- debug " the status of %s is %s; cannot set it to %s"
273
- (Ref. really_pretty_and_small self)
274
- (status_to_string status)
275
- (if code = Api_errors. task_cancelled then " `cancelled" else " `failure" )
276
- )
271
+ let @ self = operate_on_db_task ~__context in
272
+ let status = Db_actions.DB_Action.Task. get_status ~__context ~self in
273
+ match status with
274
+ | `pending ->
275
+ Db_actions.DB_Action.Task. set_progress ~__context ~self ~value: 1. ;
276
+ Db_actions.DB_Action.Task. set_error_info ~__context ~self
277
+ ~value: (code :: params) ;
278
+ Db_actions.DB_Action.Task. set_backtrace ~__context ~self
279
+ ~value: (Sexplib.Sexp. to_string Backtrace. (sexp_of_t (get exn ))) ;
280
+ Db_actions.DB_Action.Task. set_finished ~__context ~self
281
+ ~value: (Date. now () ) ;
282
+ Db_actions.DB_Action.Task. set_allowed_operations ~__context ~self
283
+ ~value: [] ;
284
+ if code = Api_errors. task_cancelled then
285
+ Db_actions.DB_Action.Task. set_status ~__context ~self ~value: `cancelled
286
+ else
287
+ Db_actions.DB_Action.Task. set_status ~__context ~self ~value: `failure
288
+ | _ ->
289
+ debug " the status of %s is %s; cannot set it to %s"
290
+ (Ref. really_pretty_and_small self)
291
+ (status_to_string status)
292
+ ( if code = Api_errors. task_cancelled then
293
+ " `cancelled"
294
+ else
295
+ " `failure"
296
+ )
277
297
278
298
type id = Sm of string | Xenops of string * string
279
299
@@ -292,6 +312,7 @@ let task_to_id_exn task =
292
312
with_lock task_tbl_m (fun () -> Hashtbl. find task_to_id_tbl task)
293
313
294
314
let register_task __context ?(cancellable = true ) id =
315
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
295
316
let task = Context. get_task_id __context in
296
317
with_lock task_tbl_m (fun () ->
297
318
Hashtbl. replace id_to_task_tbl id task ;
@@ -307,6 +328,7 @@ let register_task __context ?(cancellable = true) id =
307
328
()
308
329
309
330
let unregister_task __context id =
331
+ let @ __context = Context. with_tracing ~__context __FUNCTION__ in
310
332
(* The rest of the XenAPI Task won't be cancellable *)
311
333
set_not_cancellable ~__context ;
312
334
with_lock task_tbl_m (fun () ->
0 commit comments