Мы запускаем 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?