os_mon & alarm_handler in R10B-10

Gunilla Arendt <>
Mon Mar 27 09:08:42 CEST 2006


It's a bug in os_mon, it shouldn't use get_alarms().
Thanks for the heads up.

Regards, Gunilla


Serge Aleynikov wrote:
> For now I used the following patch to take care of this issue, but I 
> would be curious to hear the opinion of the OTP staff.
> 
> Regards,
> 
> Serge
> 
> --- alarm_handler.erl.orig      Fri Mar 24 20:08:18 2006
> +++ alarm_handler.erl   Fri Mar 24 20:19:15 2006
> @@ -58,7 +58,12 @@
>  %% Returns: [{AlarmId, AlarmDesc}]
>  %%-----------------------------------------------------------------
>  get_alarms() ->
> -    gen_event:call(alarm_handler, alarm_handler, get_alarms).
> +    case gen_event:which_handlers(alarm_handler) of
> +    [M | _] ->
> +        gen_event:call(alarm_handler, M, get_alarms);
> +    [] ->
> +        []
> +    end.
> 
>  add_alarm_handler(Module) when atom(Module) ->
>      gen_event:add_handler(alarm_handler, Module, []).
> 
> 
> Serge Aleynikov wrote:
>> Hi,
>>
>> I've been experimenting with the reworked os_mon in R10B-10, and 
>> encountered the following issue.
>>
>> The documentation encourages to replace the default alarm handler with 
>> something more sophisticated.  For that reason I created a custom 
>> handler - lama_alarm_h (LAMA app in jungerl), which uses 
>> gen_event:swap_sup_handler/3.
>>
>> I initiate that handler prior to starting OS_MON, and then start OS_MON.
>>
>> In the latest release R10B-10, OS_MON calls alarm_handler:get_alarms/0 
>> upon startup.
>>
>> This causes the 'alarm_handler' event manager issue a call in the 
>> alarm_handler.erl module.  However, since that handler was replaced by 
>> a custom alarm handler, the gen_event's call fails with
>> {error, bad_module}.
>>
>> gen_event always dispatches a call/3 to a specific handler module 
>> passed as a parameter, e.g.:
>>
>> -----[alarm_handler.erl (line: 60)]-----
>> get_alarms() ->
>>     gen_event:call(alarm_handler, alarm_handler, get_alarms).
>> ----------------------------------------
>>
>> Yet, if the alarm_handler handler was swapped by another module, the 
>> gen_event:call will report an error, therefore crashing OS_MON.
>>
>> One way to resolve this problem would be to introduce another exported 
>> function in gen_event:
>>
>> gen_event:call(EventMgrRef, Request) -> Result
>>
>> Can the OTP team suggest some other workaround?
>>
>> Serge
>>
> 




More information about the erlang-questions mailing list