openlang

Документация Erlang и Elixir по-разному описывает поздний ответ на call

Две документации по-разному рассказывают про вызов с истёкшим таймаутом. Справка gen_server говорит, что начиная с OTP 24 вызовы идут через псевдоним процесса, так что ответ, пришедший после таймаута, получен не будет. Страница GenServer.call/3 в документации Elixir до сих пор советует после перехвата выхода выбрасывать поздние двухэлементные кортежи. Обе стоят на одной VM и одном модуле gen. Абзац Elixir я читаю как оставшийся от прошлого. Так или иначе сервер работу сделал, и ни одна из страниц не говорит об этом первым делом.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Я люблю, когда документации расходятся. Такую правку проще всего отстоять. Но половину абзаца Elixir стоит оставить. Совет выбрасывать мусорные кортежи для GenServer.call на текущем OTP устарел. А полезна как раз фраза перед ним, что вызывающий завершается, пока сервер, возможно, всё ещё работает. Псевдонимы этого никак не меняют.

    Так что правило для документации из двух частей. Совет про мусорные сообщения для самого вызова убрать. Часть про то, что сервер всё равно доделает работу, оставить и, наверное, расширить, потому что doctest с {:ok, 1} никому этого не покажет.

  2. Ссылка на ответ

    Пристальнее стоит смотреть на перехват. Код, который ловит выход по таймауту, обычно делает это ради повтора. Первый запрос ещё лежит в очереди сервера или уже выполняется, так что повтор запускает ту же операцию второй раз. Псевдоним прячет первый ответ, а первый эффект всё равно уже случился.

    Если операция только читает, ничего страшного. Если пишет, повтору нужен идентификатор запроса, который сервер может проверить, или вызывающему лучше не повторять, а просто дать выходу случиться.

  3. Ссылка на ответ

    На текущем OTP прав текст Erlang. Сервер спит дольше, чем позволяет вызов, потом отвечает. Вызывающий оборачивает GenServer.call в catch :exit, _ и затем вызывает flush(). Пусто. Поздний ответ так и не появляется.

    Дорого обходится порядок, который важен для patchkit. Если отправить второй вызов сразу после перехвата первого, сервер доведёт первый запрос до конца, потом возьмёт второй, и оба побочных эффекта случатся.

Другие стороны того же вопроса

  1. println внутри функции для swap!

    В документации к swap! сказано, что функция может вызываться несколько раз и не должна иметь побочных эффектов. А в реальном…

    Ответы 1clojure
  2. Isolate.run утащил с собой весь Loader

    Вынес большой разбор JSON с главного изолята через Isolate.run и вместо ускорения получил ошибку про объект, который нельзя о…

    Ответы 2dart
  3. Пул воркеров после отмены контекста висит на отправке результата

    Наткнулся на простую вещь, но провозился с ней дольше, чем хотелось бы. Пул из восьми воркеров читает задачи из jobs и пишет…

    Ответы 8go