@@ -2848,8 +2848,6 @@ exception Finished
2848
2848
let event_wait_gen rpc session_id classname record_matches =
2849
2849
(* Immediately register *)
2850
2850
let classes = [classname] in
2851
- Client.Event.register ~rpc ~session_id ~classes ;
2852
- debug " Registered for events" ;
2853
2851
(* Check to see if the condition is already satisfied - get all objects of whatever class specified... *)
2854
2852
let poll () =
2855
2853
let current_tbls =
@@ -2930,96 +2928,111 @@ let event_wait_gen rpc session_id classname record_matches =
2930
2928
in
2931
2929
List.exists record_matches all_recs
2932
2930
in
2933
- finally
2934
- (fun () ->
2935
- if not (poll ()) then
2936
- try
2937
- while true do
2938
- try
2939
- let events =
2940
- Event_types.events_of_rpc (Client.Event.next ~rpc ~session_id)
2941
- in
2942
- let doevent event =
2943
- let tbl =
2944
- match Event_helper.record_of_event event with
2945
- | Event_helper.VM (r, Some x) ->
2946
- let record = vm_record rpc session_id r in
2947
- record.setrefrec (r, x) ;
2948
- record.fields
2949
- | Event_helper.VDI (r, Some x) ->
2950
- let record = vdi_record rpc session_id r in
2951
- record.setrefrec (r, x) ;
2952
- record.fields
2953
- | Event_helper.SR (r, Some x) ->
2954
- let record = sr_record rpc session_id r in
2955
- record.setrefrec (r, x) ;
2956
- record.fields
2957
- | Event_helper.Host (r, Some x) ->
2958
- let record = host_record rpc session_id r in
2959
- record.setrefrec (r, x) ;
2960
- record.fields
2961
- | Event_helper.Network (r, Some x) ->
2962
- let record = net_record rpc session_id r in
2963
- record.setrefrec (r, x) ;
2964
- record.fields
2965
- | Event_helper.VIF (r, Some x) ->
2966
- let record = vif_record rpc session_id r in
2967
- record.setrefrec (r, x) ;
2968
- record.fields
2969
- | Event_helper.PIF (r, Some x) ->
2970
- let record = pif_record rpc session_id r in
2971
- record.setrefrec (r, x) ;
2972
- record.fields
2973
- | Event_helper.VBD (r, Some x) ->
2974
- let record = vbd_record rpc session_id r in
2975
- record.setrefrec (r, x) ;
2976
- record.fields
2977
- | Event_helper.PBD (r, Some x) ->
2978
- let record = pbd_record rpc session_id r in
2979
- record.setrefrec (r, x) ;
2980
- record.fields
2981
- | Event_helper.Pool (r, Some x) ->
2982
- let record = pool_record rpc session_id r in
2983
- record.setrefrec (r, x) ;
2984
- record.fields
2985
- | Event_helper.Task (r, Some x) ->
2986
- let record = task_record rpc session_id r in
2987
- record.setrefrec (r, x) ;
2988
- record.fields
2989
- | Event_helper.VMSS (r, Some x) ->
2990
- let record = vmss_record rpc session_id r in
2991
- record.setrefrec (r, x) ;
2992
- record.fields
2993
- | Event_helper.Secret (r, Some x) ->
2994
- let record = secret_record rpc session_id r in
2995
- record.setrefrec (r, x) ;
2996
- record.fields
2997
- | _ ->
2998
- failwith
2999
- (" Cli listening for class '"
3000
- ^ classname
3001
- ^ " ' not currently implemented"
3002
- )
3003
- in
3004
- let record =
3005
- List.map (fun r -> (r.name, fun () -> safe_get_field r)) tbl
3006
- in
3007
- if record_matches record then raise Finished
2931
+ let use_event_next = !Constants.use_event_next in
2932
+ let run () =
2933
+ if not (poll ()) then
2934
+ try
2935
+ let token = ref " " in
2936
+ while true do
2937
+ let events =
2938
+ if use_event_next then
2939
+ Event_types.events_of_rpc (Client.Event.next ~rpc ~session_id)
2940
+ else
2941
+ let event_from =
2942
+ Event_types.event_from_of_rpc
2943
+ (Client.Event.from ~rpc ~session_id ~timeout:30. ~token:!token
2944
+ ~classes
2945
+ )
3008
2946
in
3009
- List.iter doevent
3010
- (List.filter (fun e -> e.Event_types.snapshot <> None) events)
3011
- with
3012
- | Api_errors.Server_error (code, _)
3013
- when code = Api_errors.events_lost
3014
- ->
3015
- debug " Got EVENTS_LOST ; reregistering" ;
3016
- Client.Event.unregister ~rpc ~session_id ~classes ;
3017
- Client.Event.register ~rpc ~session_id ~classes ;
3018
- if poll () then raise Finished
3019
- done
3020
- with Finished -> ()
3021
- )
3022
- (fun () -> Client.Event.unregister ~rpc ~session_id ~classes)
2947
+ token := event_from.token ;
2948
+ event_from.events
2949
+ in
2950
+ let doevent event =
2951
+ let tbl =
2952
+ match Event_helper.record_of_event event with
2953
+ | Event_helper.VM (r, Some x) ->
2954
+ let record = vm_record rpc session_id r in
2955
+ record.setrefrec (r, x) ;
2956
+ record.fields
2957
+ | Event_helper.VDI (r, Some x) ->
2958
+ let record = vdi_record rpc session_id r in
2959
+ record.setrefrec (r, x) ;
2960
+ record.fields
2961
+ | Event_helper.SR (r, Some x) ->
2962
+ let record = sr_record rpc session_id r in
2963
+ record.setrefrec (r, x) ;
2964
+ record.fields
2965
+ | Event_helper.Host (r, Some x) ->
2966
+ let record = host_record rpc session_id r in
2967
+ record.setrefrec (r, x) ;
2968
+ record.fields
2969
+ | Event_helper.Network (r, Some x) ->
2970
+ let record = net_record rpc session_id r in
2971
+ record.setrefrec (r, x) ;
2972
+ record.fields
2973
+ | Event_helper.VIF (r, Some x) ->
2974
+ let record = vif_record rpc session_id r in
2975
+ record.setrefrec (r, x) ;
2976
+ record.fields
2977
+ | Event_helper.PIF (r, Some x) ->
2978
+ let record = pif_record rpc session_id r in
2979
+ record.setrefrec (r, x) ;
2980
+ record.fields
2981
+ | Event_helper.VBD (r, Some x) ->
2982
+ let record = vbd_record rpc session_id r in
2983
+ record.setrefrec (r, x) ;
2984
+ record.fields
2985
+ | Event_helper.PBD (r, Some x) ->
2986
+ let record = pbd_record rpc session_id r in
2987
+ record.setrefrec (r, x) ;
2988
+ record.fields
2989
+ | Event_helper.Pool (r, Some x) ->
2990
+ let record = pool_record rpc session_id r in
2991
+ record.setrefrec (r, x) ;
2992
+ record.fields
2993
+ | Event_helper.Task (r, Some x) ->
2994
+ let record = task_record rpc session_id r in
2995
+ record.setrefrec (r, x) ;
2996
+ record.fields
2997
+ | Event_helper.VMSS (r, Some x) ->
2998
+ let record = vmss_record rpc session_id r in
2999
+ record.setrefrec (r, x) ;
3000
+ record.fields
3001
+ | Event_helper.Secret (r, Some x) ->
3002
+ let record = secret_record rpc session_id r in
3003
+ record.setrefrec (r, x) ;
3004
+ record.fields
3005
+ | _ ->
3006
+ failwith
3007
+ (" Cli listening for class '"
3008
+ ^ classname
3009
+ ^ " ' not currently implemented"
3010
+ )
3011
+ in
3012
+ let record =
3013
+ List.map (fun r -> (r.name, fun () -> safe_get_field r)) tbl
3014
+ in
3015
+ if record_matches record then raise_notrace Finished
3016
+ in
3017
+ List.iter doevent
3018
+ (List.filter (fun e -> e.Event_types.snapshot <> None) events)
3019
+ done
3020
+ with
3021
+ | Api_errors.Server_error (code, _)
3022
+ when code = Api_errors.events_lost && use_event_next ->
3023
+ debug " Got EVENTS_LOST ; reregistering" ;
3024
+ Client.Event.unregister ~rpc ~session_id ~classes ;
3025
+ Client.Event.register ~rpc ~session_id ~classes ;
3026
+ if poll () then raise Finished
3027
+ | Finished ->
3028
+ ()
3029
+ in
3030
+ if use_event_next then (
3031
+ Client.Event.register ~rpc ~session_id ~classes ;
3032
+ debug " Registered for events" ;
3033
+ finally run (fun () -> Client.Event.unregister ~rpc ~session_id ~classes)
3034
+ ) else
3035
+ run ()
3023
3036
3024
3037
(* We're done. Unregister and finish *)
3025
3038
0 commit comments