release_handler
Gunilla Arendt
gunilla@REDACTED
Mon Jun 26 16:19:55 CEST 2006
Hi Serge,
Yes, the config_change/1 and change_application_data/2 calls should be
done in the opposite order.
Note however that release_handler:eval_appup_script/4 is actually not
used by release_handler (the process), but is primarily intended to be
called by the release_handler (the module) functions upgrade_app/2
and downgrade_app/2,3. These two functions were added rather recently
to simplify testing of .appup files. (the release_handler process
calls do_install_release/3 to install a new release.)
I will correct the bug and try to clarify the documentation.
Thanks,
Gunilla
Serge Aleynikov wrote:
> OTP team:
>
> I've been studying the code of the sasl's release_handler, and came up
> with this question that perhaps someone qualified would be able to answer.
>
> As far as I understand, the following functions do the following tasks:
>
> application_controller:prep_config_change()
> - Fetch OLD applications' environment from
> application controller's internal ETS table.
>
> application_controller:config_change(EnvBefore)
> - Notify running applications (via config_change/3 callback) about
> configuration changes derived from comparing EnvBefore with the
> content of the application controller's ETS table storing
> applications' environment.
>
> application_controller:change_application_data(AppSpecs, Config)
> - Rereads applications' environment from config files stored on disk
> and stores it to the application controller's ETS table.
>
> Now with this background let's look at how the release handler does the
> application upgrade:
>
> ==[begin]== sasl/src/release_handler.erl =====
> ...
> eval_appup_script(App, ToVsn, ToDir, Script) ->
> EnvBefore = application_controller:prep_config_change(),
> AppSpecL = read_appspec(App, ToDir),
> Res = release_handler_1:eval_script(Script,
> [], % [AppSpec]
> [{App, ToVsn, ToDir}],
> []), % [Opt]
> case Res of
> {ok, _Unpurged} ->
> application_controller:config_change(EnvBefore),
> application_controller:change_application_data(AppSpecL,[]);
> _Res ->
> ignore
> end,
> Res.
> ...
> ==[end]=======================================
>
> Unless I am wrong, from this code it does *not* look like application's
> config_change/3 callback will ever be invoked by
> application_controller:config_change(EnvBefore) because EnvBefore has
> the same applications' environment information as the current content of
> the applications' controller's ETS table. It seems to me that at least
> the config_change/1 and change_application_data/2 calls should be done
> in the opposite order, or better, do something like this:
>
> ...
> {ok, _Unpurged} ->
> Files =
> case init:get_argument(config) of
> {ok, [ ConfFileNames ]} ->
> [begin
> S = filename:basename(F,".config"),
> filename:join(filename:dirname(F), S ++ ".config")
> end || F <- ConfFileNames],
> {ok, _} ->
> []
> end,
> application_controller:change_application_data(AppSpecL, Files);
> application_controller:config_change(EnvBefore);
> _Res ->
> ignore
> ...
>
> I'd appreciate some clarification on the subject.
>
> Regards,
>
> Serge
>
>
More information about the erlang-questions
mailing list