Elixir GenServer';即使vsn在连续的热代码升级中被修复为最后一个版本,仍然再次调用了s code_change?
无法成功安装第二个升级版本。从下面的错误日志中,似乎再次调用了代码更改函数,并且错误地处理了状态 复制步骤 我遵循《编程灵丹妙药>=1.6》一书第20章OTP.Applications中的示例和步骤Elixir GenServer';即使vsn在连续的热代码升级中被修复为最后一个版本,仍然再次调用了s code_change?,elixir,Elixir,无法成功安装第二个升级版本。从下面的错误日志中,似乎再次调用了代码更改函数,并且错误地处理了状态 复制步骤 我遵循《编程灵丹妙药>=1.6》一书第20章OTP.Applications中的示例和步骤 提交时,我已将应用程序准备为0.2.0版本 提交时,server.ex中的状态已更新,需要运行代码更改。我可以成功地将代码热升级到0.3.0 在以上两个步骤之后,如果我只是更改server.ex中的next\u number函数中的返回文本,并将版本升级到0.3.1,例如,保持步骤2中的code
- 提交时,我已将应用程序准备为0.2.0版本
- 提交时,
中的状态已更新,需要运行代码更改。我可以成功地将代码热升级到0.3.0server.ex
server.ex
中的next\u number
函数中的返回文本,并将版本升级到0.3.1,例如,保持步骤2中的code\u change函数不变,则热升级将失败,并出现以下错误
在步骤2之后,我确实运行了新函数Sequence.Server.next_number()
和Sequence.Server.increment_number(2)
多次,以确保它生效,并将状态更新为新格式
问题是,为什么在第二次升级中仍然可以触发版本标记为最新版本的代码更改(“0”)
错误日志
发布处理程序安装失败:{:代码\u更改\u失败
PID,Sequence.Server,“1”,{:EXIT,{:function_子句,[{Sequence.Server,:code_change,[“1”,%%{struct:
Sequence.Server.State,当前_编号:8,增量:2},[],文件:
'lib/sequence/server.ex',行:44]},{:gen_server,
:system_code_change,4,[文件:'gen_server.erl',行:794]},{:sys,
:do_change_code,5,[文件:'sys.erl',行:573]},{:sys,:do_cmd,6,
[文件:'sys.erl',行:465]},{:sys,:handle\u system\u msg,8,[文件:
'sys.erl',行:365]},{:proc_lib,:init_p_do_apply,3,[文件:
'proc_lib.erl',行:249]}}}
问题描述
预期的结果是什么?热代码升级应成功什么版本的酿酒厂?2.0.9
您在什么操作系统、Erlang/Elixir版本上看到这个问题?Mac 10.13.6,Elixir 1.7.2
这个问题实际上也是作为Github酿酒厂的一个成员提出的。调用失败,因为它试图调用
代码更改
函数,第一个参数是“1”
,请阅读错误消息。它从提交的参数开始。当前代码仅允许您(光束等)调用code\u change/3
函数,第一个参数为“0”。不匹配/不允许任何其他情况
如果要为代码更改功能添加另一个匹配子句,则可以忽略/处理对“1”
的版本更改:
def code_change("0", old_state = current_number, _extra) do
new_state = %State{
current_number: current_number,
delta: 1
}
IO.puts inspect old_state
IO.puts inspect new_state
{ :ok, new_state }
end
def code_change("1", state, _extra) do
# your code here for version "1"
{:ok, state}
end
def code_change(_version, state, _extra) do
# your code here for any other version
{:ok, state}
end