4. Erlang / OTP更改时升级 | 4. Upgrade when Erlang/OTP has Changed
4当Erlang/OTP发生变化时进行升级
4.1介绍
从Erlang/OTP 17开始,大多数应用程序都会提供有效的应用程序升级文件(appup
)。在早期版本中,Erlang/OTP中的大部分应用程序不支持升级。许多应用程序使用该restart_application
指令。这些应用程序对于支持实际的软件升级并不重要,例如工具和库应用程序。该restart_application
指令确保应用程序中的所有模块都被重新加载,从而运行新代码。
4.2核心应用程序升级
核心应用程序ERTS,Kernel,STDLIB和SASL从不允许真正的软升级,但需要重新启动Erlang仿真器。这release_handler
由升级说明指出restart_new_emulator
。该指令始终是执行的第一条指令,它会使用上述核心应用程序的新版本和所有其他应用程序的旧版本重新启动仿真器。当节点备份时,执行所有其他升级指令,确保每个应用程序终于运行其新版本。
进行两步升级似乎很奇怪,而不是使用所有应用程序的新版本重新启动模拟器。这个设计决定的原因是允许code_change
功能有副作用,例如,改变磁盘上的数据。它还保证了非核心应用程序的升级机制不会因核心应用程序是否同时更改而有所不同。
但是,如果更优先选择更残酷的变体,则可以仅使用单个升级指令手写版本升级文件restart_emulator
。与此相反restart_new_emulator
,此指令会使仿真程序在所有
应用程序的新版本中重新启动。
注意:
如果restart_emulator
手写relup
文件中包含其他指令,则会在旧模拟器中执行。这是一个很大的风险,因为不能保证新的射束代码可以加载到旧的模拟器中。之后添加指令restart_emulator
无效,因为release_handler
它们不会执行。
有关发行版升级文件的信息,请参阅relup(4)
SASL中的手册页。有关升级说明的更多信息,请参阅appup(4)
SASL中的手册页。
4.3个仍不允许代码升级的应用程序
一些应用程序(如HiPE)不支持升级。这由仅包含应用程序升级文件指示{Vsn,[],[]}
。使用此类输入创建发行版升级文件的任何尝试均失败。强制涉及此类应用程序的升级的唯一方法是手写该文件relup
,最好如上所述仅使用restart_emulator
指令。