Re: Supervisor and configuration update — how to do it?

Michael Truog mjtruog@REDACTED
Wed May 20 17:17:57 CEST 2020


On 5/20/20 6:39 AM, Tristan Sloughter wrote:
> You can update the childspecs with either an appup or manually using the steps an appup does of suspending the process and replacing its state with `sys` calls.
>
> Can't use that for the top level supervisor but if that crashes you go through the application start process anyway where you can pick up the new config state to pass along?
I think that if configuration is going through the start_link/init, from 
the supervisor childspec, that means the maximum restart intensity 
(MaxR) should be 0 for the top-level supervisor.  That would avoid 
relying on the supervisor's automatic restart because the childspec 
start_link arguments can not easily be changed (in an atomic way).  That 
would also mean that a single Erlang process ran by the top-level 
supervisor would be tracking the configuration state changes, making 
those changes happen in an ordered sequential way (to avoid the data 
inconsistency problems that can occur with global data used 
concurrently).  The configuration data can always be split among 
separate Erlang processes that own separate parts of the configuration, 
if that is necessary with parts of the configuration that do not have 
dependencies.

Best Regards,
Michael


>
> On Tue, May 19, 2020, at 23:36, Max Lapshin wrote:
>> Hi.
>>
>> Our flussonic has big amount of code related to smooth configuration
>> update. Almost all configuration parameters can be changed on fly: it
>> is very important, because we handle big amounts of video traffic.  It
>> is very bad to leave 20 000 people without video if you want to
>> reconfigure single channel.
>>
>>
>> We have to fight with supervisor concepts: we do not accept
>> configuration in start_link/init, because it may change later.
>>
>> Usually code is looking so:
>>
>>
>> init([Options]) ->
>>    {ok, update_options(Options, #state{})}.
>>
>> handle_info({update_options, Options}, #state{} = State) ->
>>    {noreply, update_options(Options, State)};
>>
>>
>>
>> Such approach doesn't work well with supervisor: if process is
>> restarted, it will be restarted with old Options.
>>
>> My question is: is such approach antipattern for OTP?
>> Maybe someone else has already met with it and has some ideas about
>> it, like modifying supervisor.erl to change MFA?
>>



More information about the erlang-questions mailing list