Что может заставить `whereis (user)` возвращать undefined? - PullRequest
0 голосов
/ 28 ноября 2018

Мы запускаем RabbitMQ 3.6.5 в производственной системе, под

Erlang R16B03-1 (erts-5.10.4) [source] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false]

rabbitmqctl rotate_logs происходит сбой с:

Erlang VM I/O system is damaged, restart needed

Глядя на код для этой версии, этоошибка существует только в rabbit_log.erl:

...

%% Execute Fun using the IO system of the local node (i.e. the node on
%% which the code is executing). Since this is invoked for every log
%% message, we try to avoid unnecessarily churning group_leader/1.
with_local_io(Fun) ->
    GL = group_leader(),
    Node = node(),
    case node(GL) of
        Node -> Fun();
        _    -> set_group_leader_to_user_safely(whereis(user)),
                try
                    Fun()
                after
                    group_leader(GL, self())
                end
    end.

set_group_leader_to_user_safely(undefined) ->
    handle_damaged_io_system();
set_group_leader_to_user_safely(User) when is_pid(User) ->
    group_leader(User, self()).

handle_damaged_io_system() ->
    Msg = "Erlang VM I/O system is damaged, restart needed~n",
    io:format(standard_error, Msg, []),
    exit(erlang_vm_restart_needed).

Итак, похоже, что whereis(user) возвращает undefined.

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

Я надеюсь понять вероятность того, что это что-то, что помешало бы запуску кролика снова, иперезапуск RabbitMQ исправит это.

Журнал startup_err содержит:

Erlang VM I/O system is damaged, restart needed

Журнал rabbit@fdlquevm-sasl.log-20180710 содержит:

=SUPERVISOR REPORT==== 28-Nov-2018::18:45:04 ===
     Supervisor: {<0.26938.6080>,rabbit_channel_sup}
     Context:    shutdown_error
     Reason:     noproc
     Offender:   [{pid,<0.26217.6080>},
                  {name,channel},
                  {mfargs,
                      {rabbit_channel,start_link,
                          [1,<0.27525.6080>,<0.25586.6080>,<0.27525.6080>,
                           <<"40.113.233.192:3979 -> 10.0.0.4:5672">>,
                           rabbit_framing_amqp_0_9_1,
                           {user,<<"FDLMessaging">>,[],
                               [{rabbit_auth_backend_internal,none}]},
                           <<"/">>,
                           [{<<"publisher_confirms">>,bool,true},
                            {<<"exchange_exchange_bindings">>,bool,true},
                            {<<"basic.nack">>,bool,true},
                            {<<"consumer_cancel_notify">>,bool,true},
                            {<<"connection.blocked">>,bool,true},
                            {<<"authentication_failure_close">>,bool,true}],
                           <0.26295.6080>,<0.22812.6080>]}},
                  {restart_type,intrinsic},
                  {shutdown,70000},
                  {child_type,worker}]

Что может вызвать whereis(user) чтобы вернуть undefined?

1 Ответ

0 голосов
/ 01 декабря 2018

Процесс user является центральным процессом, который обрабатывает большую часть операций ввода-вывода, связанных со стандартным выводом.По умолчанию он будет существовать всегда, если только аргумент -nouser не задан для базовой виртуальной машины Erlang.

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

...