summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Klishin <michael@clojurewerkz.org>2020-07-09 08:26:52 +0300
committerMichael Klishin <michael@clojurewerkz.org>2020-07-14 03:50:32 +0300
commit3e24c4070b1bcfef4dc0b112b402c8bbeb22aa54 (patch)
tree4e23d2714f7e31b61a58256790ca9177feb8d6fb /src
parent1a91b7c38bd12001b38c4ec66202f10546de1988 (diff)
downloadrabbitmq-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.erl1
-rw-r--r--src/rabbit_maintenance.erl90
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).