diff options
| author | Michael Klishin <michael@clojurewerkz.org> | 2020-07-09 08:26:52 +0300 |
|---|---|---|
| committer | Michael Klishin <michael@clojurewerkz.org> | 2020-07-14 03:50:32 +0300 |
| commit | 3e24c4070b1bcfef4dc0b112b402c8bbeb22aa54 (patch) | |
| tree | 4e23d2714f7e31b61a58256790ca9177feb8d6fb /src | |
| parent | 1a91b7c38bd12001b38c4ec66202f10546de1988 (diff) | |
| download | rabbitmq-server-git-3e24c4070b1bcfef4dc0b112b402c8bbeb22aa54.tar.gz | |
Report node maintenance status in 'rabbitmq-diagnostics status'
Part of rabbitmq/rabbitmq-server#2321
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit.erl | 1 | ||||
| -rw-r--r-- | src/rabbit_maintenance.erl | 90 |
2 files changed, 55 insertions, 36 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl index 4ada465759..8298dfe79d 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -654,6 +654,7 @@ status() -> {erlang_version, erlang:system_info(system_version)}, {memory, rabbit_vm:memory()}, {alarms, alarms()}, + {is_under_maintenance, rabbit_maintenance:is_being_drained_local_read(node())}, {listeners, listeners()}, {vm_memory_calculation_strategy, vm_memory_monitor:get_memory_calculation_strategy()}], S2 = rabbit_misc:filter_exit_map( diff --git a/src/rabbit_maintenance.erl b/src/rabbit_maintenance.erl index 81eef9eb32..7ca9a3ce7c 100644 --- a/src/rabbit_maintenance.erl +++ b/src/rabbit_maintenance.erl @@ -16,29 +16,37 @@ -module(rabbit_maintenance). - -include("rabbit.hrl"). - - -export([ - drain/0, - revive/0, - mark_as_being_drained/0, - unmark_as_being_drained/0, - is_being_drained_local_read/1, - is_being_drained_consistent_read/1, - filter_out_drained_nodes_local_read/1, - filter_out_drained_nodes_consistent_read/1, - suspend_all_client_listeners/0, - resume_all_client_listeners/0, - close_all_client_connections/0, - primary_replica_transfer_candidate_nodes/0, - random_primary_replica_transfer_candidate_node/1, - transfer_leadership_of_quorum_queues/1, - transfer_leadership_of_classic_mirrored_queues/1]). +-include("rabbit.hrl"). + +-export([ + drain/0, + revive/0, + mark_as_being_drained/0, + unmark_as_being_drained/0, + is_being_drained_local_read/1, + is_being_drained_consistent_read/1, + status_local_read/1, + status_consistent_read/1, + filter_out_drained_nodes_local_read/1, + filter_out_drained_nodes_consistent_read/1, + suspend_all_client_listeners/0, + resume_all_client_listeners/0, + close_all_client_connections/0, + primary_replica_transfer_candidate_nodes/0, + random_primary_replica_transfer_candidate_node/1, + transfer_leadership_of_quorum_queues/1, + transfer_leadership_of_classic_mirrored_queues/1]). + +-define(TABLE, rabbit_node_maintenance_states). +-define(DEFAULT_STATUS, regular). +-define(DRAINING_STATUS, draining). + +-type maintenance_status() :: ?DEFAULT_STATUS | ?DRAINING_STATUS. + +-export_type([ + maintenance_status/0 +]). - -define(TABLE, rabbit_node_maintenance_states). - -define(DEFAULT_STATUS, regular). - -define(DRAINING_STATUS, draining). - %% %% API %% @@ -90,14 +98,14 @@ revive() -> -spec mark_as_being_drained() -> boolean(). mark_as_being_drained() -> rabbit_log:debug("Marking the node as undergoing maintenance"), - set_maintenance_state_status(?DRAINING_STATUS). + set_maintenance_status_status(?DRAINING_STATUS). -spec unmark_as_being_drained() -> boolean(). unmark_as_being_drained() -> rabbit_log:debug("Unmarking the node as undergoing maintenance"), - set_maintenance_state_status(?DEFAULT_STATUS). + set_maintenance_status_status(?DEFAULT_STATUS). -set_maintenance_state_status(Status) -> +set_maintenance_status_status(Status) -> Res = mnesia:transaction(fun () -> case mnesia:wread({?TABLE, node()}) of [] -> @@ -122,23 +130,33 @@ set_maintenance_state_status(Status) -> -spec is_being_drained_local_read(node()) -> boolean(). is_being_drained_local_read(Node) -> - case mnesia:dirty_read(?TABLE, Node) of - [] -> false; - [#node_maintenance_state{node = Node, status = Status}] -> - Status =:= ?DRAINING_STATUS; - _ -> false - end. + Status = status_local_read(Node), + Status =:= ?DRAINING_STATUS. -spec is_being_drained_consistent_read(node()) -> boolean(). is_being_drained_consistent_read(Node) -> + Status = status_consistent_read(Node), + Status =:= ?DRAINING_STATUS. + +-spec status_local_read(node()) -> maintenance_status(). +status_local_read(Node) -> + case mnesia:dirty_read(?TABLE, Node) of + [] -> ?DEFAULT_STATUS; + [#node_maintenance_state{node = Node, status = Status}] -> + Status; + _ -> ?DEFAULT_STATUS + end. + +-spec status_consistent_read(node()) -> maintenance_status(). +status_consistent_read(Node) -> case mnesia:transaction(fun() -> mnesia:read(?TABLE, Node) end) of - {atomic, []} -> false; + {atomic, []} -> ?DEFAULT_STATUS; {atomic, [#node_maintenance_state{node = Node, status = Status}]} -> - Status =:= ?DRAINING_STATUS; - {atomic, _} -> false; - {aborted, _Reason} -> false + Status; + {atomic, _} -> ?DEFAULT_STATUS; + {aborted, _Reason} -> ?DEFAULT_STATUS end. - + -spec filter_out_drained_nodes_local_read([node()]) -> [node()]. filter_out_drained_nodes_local_read(Nodes) -> lists:filter(fun(N) -> not is_being_drained_local_read(N) end, Nodes). |
