Кодовый обмен GenServer снова вызывается, даже если vsn исправлен до последней версии при последующем обновлении горячего кода? - PullRequest
0 голосов
/ 17 сентября 2018

Второй выпуск обновления не может быть успешно установлен. Из журнала ошибок, приведенного ниже, кажется, что функция code_change вызывается снова и неправильно обрабатывает состояние.

Шаги для воспроизведения

Я следую примерам и шагам в книге «Программирование эликсира> = 1.6», глава 20 OTP.Applications.

  • При коммите one , я подготовил заявку как версию 0.2.0
  • При коммите two состояние в server.ex было обновлено и необходимо запустить code_change. Я могу успешно обновить код до 0.3.0.

После двух предыдущих шагов, если я просто изменил текст возврата в функции next_number в server.ex и обновил версию, например, до 0.3.1, оставив функцию code_change на шаге 2 без изменений, горячее обновление завершится неудачно с ниже ошибка.

После шага 2 я несколько раз запускал новую функцию Sequence.Server.next_number() и Sequence.Server.increment_number(2), чтобы убедиться, что она вступает в силу и состояние обновляется до нового формата.

Вопрос в том, почему code_change("0") с версией, помеченной как последняя версия, все еще может быть запущено во втором обновлении?

Журналы ошибок

Не удалось установить обработчик выпуска: {: code_change_failed,

PID <10063.770.0>, Sequence.Server, "1", {: EXIT, {: function_clause, [{Sequence.Server,: code_change, ["1",% { struct :

Sequence.Server.State, current_number: 8, delta: 2}, []], [file: 'lib / sequence / server.ex', строка: 44]}, {: gen_server, : system_code_change, 4, [file: 'gen_server.erl', строка: 794]}, {: sys, : do_change_code, 5, [file: 'sys.erl', строка: 573]}, {: sys,: do_cmd, 6, [file: 'sys.erl', строка: 465]}, {: sys,: handle_system_msg, 8, [file: 'sys.erl', строка: 365]}, {: proc_lib,: init_p_do_apply, 3, [file: 'proc_lib.erl', строка: 249]}]}}}

Описание проблемы

Каковы ожидаемые результаты? горячее обновление кода должно быть успешным
Какая версия ликеро-водочного завода? 2.0.9
В каких версиях ОС, Erlang / Elixir вы видите эту проблему? Mac 10.13.6, Elixir 1.7.2

Этот вопрос фактически задается как выпуск спиртзавода в Github.

1 Ответ

0 голосов
/ 19 сентября 2018

Вызов не выполняется, так как он пытается вызвать вашу функцию code_change с "1" в качестве первого параметра - прочитайте сообщение об ошибке.Начинается с представленных параметров.Ваш текущий код только позволяет вам (ЛУЧ и т. Д.) Вызывать функцию code_change/3 с «0» в качестве первого параметра.Любой другой случай не соответствует / не разрешен.

Если вы добавите еще одно соответствующее условие для своей функции code_change, вы можете проигнорировать / обработать изменение версии на "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
...