parent
e08ee11ca3
commit
05d15c7865
|
|
@ -29,6 +29,8 @@
|
|||
-export([become_leader/2, update_metrics/2]).
|
||||
-export([rpc_delete_metrics/1]).
|
||||
-export([format/1]).
|
||||
-export([io_metrics_handler/2, io_metrics_handler/3]).
|
||||
-export([open_files/1]).
|
||||
|
||||
-include_lib("rabbit_common/include/rabbit.hrl").
|
||||
-include_lib("stdlib/include/qlc.hrl").
|
||||
|
|
@ -81,7 +83,8 @@
|
|||
garbage_collection,
|
||||
leader,
|
||||
online,
|
||||
members
|
||||
members,
|
||||
open_files
|
||||
]).
|
||||
|
||||
%%----------------------------------------------------------------------------
|
||||
|
|
@ -114,7 +117,8 @@ declare(#amqqueue{name = QName,
|
|||
case rabbit_amqqueue:internal_declare(NewQ0, false) of
|
||||
{created, NewQ} ->
|
||||
RaMachine = ra_machine(NewQ),
|
||||
case ra:start_cluster(RaName, RaMachine,
|
||||
case ra:start_cluster(RaName, RaMachine, #{metrics_handler =>
|
||||
{?MODULE, io_metrics_handler}},
|
||||
[{RaName, Node} || Node <- Nodes]) of
|
||||
{ok, _, _} ->
|
||||
FState = init_state(Id, QName),
|
||||
|
|
@ -207,6 +211,16 @@ reductions(Name) ->
|
|||
0
|
||||
end.
|
||||
|
||||
io_metrics_handler(open, Fun) ->
|
||||
file_handle_cache_stats:safe_update(io_file_handle_open_attempt, Fun);
|
||||
io_metrics_handler(close, Fun) ->
|
||||
Fun();
|
||||
io_metrics_handler(Type, Fun) ->
|
||||
file_handle_cache_stats:update(Type, Fun).
|
||||
|
||||
io_metrics_handler(Type, Bytes, Fun) ->
|
||||
file_handle_cache_stats:update(Type, Bytes, Fun).
|
||||
|
||||
recover(Queues) ->
|
||||
[begin
|
||||
case ra:restart_node({Name, node()}) of
|
||||
|
|
@ -218,17 +232,19 @@ recover(Queues) ->
|
|||
Err == name_not_registered ->
|
||||
% queue was never started on this node
|
||||
% so needs to be started from scratch.
|
||||
Machine = ra_machine(Q),
|
||||
Machine = ra_machine(Q0),
|
||||
RaNodes = [{Name, Node} || Node <- Nodes],
|
||||
% TODO: should we crash the vhost here or just log the error
|
||||
% and continue?
|
||||
ok = ra:start_node(Name, {Name, node()},
|
||||
Machine, RaNodes)
|
||||
Machine, #{metrics_handler =>
|
||||
{?MODULE, io_metrics_handler}},
|
||||
RaNodes)
|
||||
end,
|
||||
{_, Q} = rabbit_amqqueue:internal_declare(Q, true),
|
||||
{_, Q} = rabbit_amqqueue:internal_declare(Q0, true),
|
||||
Q
|
||||
end || #amqqueue{pid = {Name, _},
|
||||
quorum_nodes = Nodes} = Q <- Queues].
|
||||
quorum_nodes = Nodes} = Q0 <- Queues].
|
||||
|
||||
stop(VHost) ->
|
||||
_ = [ra:stop_node(Pid) || #amqqueue{pid = Pid} <- find_quorum_queues(VHost)],
|
||||
|
|
@ -478,8 +494,21 @@ i(members, #amqqueue{quorum_nodes = Nodes}) ->
|
|||
Nodes;
|
||||
i(online, Q) -> online(Q);
|
||||
i(leader, Q) -> leader(Q);
|
||||
i(open_files, #amqqueue{pid = {Name, _},
|
||||
quorum_nodes = Nodes}) ->
|
||||
{Data, _} = rpc:multicall(Nodes, rabbit_quorum_queue, open_files, [Name]),
|
||||
lists:flatten(Data);
|
||||
i(_K, _Q) -> ''.
|
||||
|
||||
open_files(Name) ->
|
||||
case whereis(Name) of
|
||||
undefined -> {node(), 0};
|
||||
Pid -> case ets:lookup(ra_open_file_metrics, Pid) of
|
||||
[] -> {node(), 0};
|
||||
[{_, Count}] -> {node(), Count}
|
||||
end
|
||||
end.
|
||||
|
||||
leader(#amqqueue{pid = {Name, Leader}}) ->
|
||||
case is_process_alive(Name, Leader) of
|
||||
true -> Leader;
|
||||
|
|
|
|||
Loading…
Reference in New Issue