Skip to content

Commit 6b15c57

Browse files
committed
Renaming and optional auto-remove
1 parent a7859d4 commit 6b15c57

File tree

3 files changed

+47
-32
lines changed

3 files changed

+47
-32
lines changed

deps/rabbit/priv/schema/rabbit.schema

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2495,12 +2495,14 @@ end}.
24952495
{mapping, "quorum_queue.continuous_membership_reconciliation.enabled", "rabbit.quorum_membership_reconciliation_enabled", [
24962496
{datatype, {enum, [true, false]}}]}.
24972497

2498+
{mapping, "quorum_queue.continuous_membership_reconciliation.auto_remove", "rabbit.quorum_membership_reconciliation_auto_remove", [
2499+
{datatype, {enum, [true, false]}}]}.
24982500

2499-
{mapping, "quorum_queue.continuous_membership_reconciliation.default_timeout", "rabbit.quorum_membership_reconciliation_default_timeout", [
2501+
{mapping, "quorum_queue.continuous_membership_reconciliation.interval", "rabbit.quorum_membership_reconciliation_interval", [
25002502
{datatype, integer}, {validators, ["non_negative_integer"]}
25012503
]}.
25022504

2503-
{mapping, "quorum_queue.continuous_membership_reconciliation.short_timeout", "rabbit.quorum_membership_reconciliation_short_timeout", [
2505+
{mapping, "quorum_queue.continuous_membership_reconciliation.trigger_interval", "rabbit.quorum_membership_reconciliation_trigger_interval", [
25042506
{datatype, integer}, {validators, ["non_negative_integer"]}
25052507
]}.
25062508

deps/rabbit/src/rabbit_quorum_queue_periodic_membership_reconciliation.erl

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,17 @@
2121

2222
-define(SERVER, ?MODULE).
2323
-define(DEFAULT_INTERVAL, 60_000*60).
24-
-define(SHORT_INTERVAL, 10_000).
24+
-define(DEFAULT_TRIGGER_INTERVAL, 10_000).
2525
-define(QUEUE_COUNT_START_RANDOM_SELECTION, 1_000).
2626

2727
-define(EVAL_MSG, membership_reconciliation).
2828

2929
-record(state, {timer_ref :: reference() | undefined,
30-
default_interval :: non_neg_integer(),
31-
short_interval :: non_neg_integer(),
30+
interval :: non_neg_integer(),
31+
trigger_interval :: non_neg_integer(),
3232
target_group_size :: non_neg_integer() | undefined,
33-
enabled :: boolean()}).
33+
enabled :: boolean(),
34+
auto_remove :: boolean()}).
3435

3536
%%----------------------------------------------------------------------------
3637
%% Start
@@ -62,19 +63,22 @@ policy_set() ->
6263
init([]) ->
6364
Enabled = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_enabled,
6465
false),
65-
DefaultInterval = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_default_timeout,
66+
AutoRemove = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_auto_remove,
67+
false),
68+
Interval = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_interval,
6669
?DEFAULT_INTERVAL),
67-
ShortInterval = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_short_timeout,
68-
?SHORT_INTERVAL),
70+
TriggerInterval = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_trigger_interval,
71+
?DEFAULT_TRIGGER_INTERVAL),
6972
TargetGroupSize = rabbit_misc:get_env(rabbit, quorum_membership_reconciliation_target_group_size,
7073
undefined),
71-
State = #state{default_interval = DefaultInterval,
72-
short_interval = ShortInterval,
74+
State = #state{interval = Interval,
75+
trigger_interval = TriggerInterval,
7376
target_group_size = TargetGroupSize,
74-
enabled = Enabled},
77+
enabled = Enabled,
78+
auto_remove = AutoRemove},
7579
case Enabled of
7680
true ->
77-
Ref = erlang:send_after(DefaultInterval, self(), ?EVAL_MSG),
81+
Ref = erlang:send_after(Interval, self(), ?EVAL_MSG),
7882
{ok, State#state{timer_ref = Ref}};
7983
false ->
8084
{ok, State, hibernate}
@@ -86,7 +90,7 @@ handle_call(_Request, _From, State) ->
8690
handle_cast({membership_reconciliation_trigger, _Reason}, #state{enabled = false} = State) ->
8791
{noreply, State, hibernate};
8892
handle_cast({membership_reconciliation_trigger, Reason}, #state{timer_ref = OldRef,
89-
short_interval = Time} = State) ->
93+
trigger_interval = Time} = State) ->
9094
rabbit_log:debug("Quorum Queue membership reconciliation triggered: ~p",
9195
[Reason]),
9296
_ = erlang:cancel_timer(OldRef),
@@ -95,15 +99,14 @@ handle_cast({membership_reconciliation_trigger, Reason}, #state{timer_ref = OldR
9599
handle_cast(_Msg, State) ->
96100
{noreply, State}.
97101

98-
handle_info(?EVAL_MSG, #state{default_interval = DefaultInterval,
99-
short_interval = ShortInterval,
100-
target_group_size = TargetSize} = State) ->
101-
Res = reconclitiate_quorum_queue_membership(TargetSize),
102+
handle_info(?EVAL_MSG, #state{interval = Interval,
103+
trigger_interval = TriggerInterval} = State) ->
104+
Res = reconclitiate_quorum_queue_membership(State),
102105
NewTimeout = case Res of
103106
noop ->
104-
DefaultInterval;
107+
Interval;
105108
_ ->
106-
ShortInterval
109+
TriggerInterval
107110
end,
108111
Ref = erlang:send_after(NewTimeout, self(), ?EVAL_MSG),
109112
{noreply, State#state{timer_ref = Ref}};
@@ -122,15 +125,17 @@ code_change(_OldVsn, State, _Extra) ->
122125
%% Internal functions
123126
%%----------------------------------------------------------------------------
124127

125-
reconclitiate_quorum_queue_membership(TargetSize) ->
128+
reconclitiate_quorum_queue_membership(State) ->
126129
LocalLeaders = rabbit_amqqueue:list_local_leaders(),
127130
ExpectedNodes = rabbit_nodes:list_members(),
128131
Running = rabbit_nodes:list_running(),
129-
reconclitiate_quorum_members(ExpectedNodes, Running, LocalLeaders, TargetSize, noop).
132+
reconclitiate_quorum_members(ExpectedNodes, Running, LocalLeaders, State, noop).
130133

131-
reconclitiate_quorum_members(_ExpectedNodes, _Running, [], _TargetSize, Result) ->
134+
reconclitiate_quorum_members(_ExpectedNodes, _Running, [], _State, Result) ->
132135
Result;
133-
reconclitiate_quorum_members(ExpectedNodes, Running, [Q | LocalLeaders], TargetSize, OldResult) ->
136+
reconclitiate_quorum_members(ExpectedNodes, Running, [Q | LocalLeaders],
137+
#state{target_group_size = TargetSize} = State,
138+
OldResult) ->
134139
Result =
135140
maybe
136141
{ok, Members, {_, LeaderNode}} = ra:members(amqqueue:get_pid(Q), 500),
@@ -139,12 +144,12 @@ reconclitiate_quorum_members(ExpectedNodes, Running, [Q | LocalLeaders], TargetS
139144
%% And that this not is not in maintenance mode
140145
true ?= not rabbit_maintenance:is_being_drained_local_read(node()),
141146
MemberNodes = [Node || {_, Node} <- Members],
142-
Remove = MemberNodes -- ExpectedNodes,
143-
case Remove of
144-
[] ->
147+
DanglingNodes = MemberNodes -- ExpectedNodes,
148+
case maybe_remove(DanglingNodes, State) of
149+
false ->
145150
maybe_add_member(Q, Running, MemberNodes, get_target_size(Q, TargetSize));
146-
_ ->
147-
remove_members(Q, Remove)
151+
true ->
152+
remove_members(Q, DanglingNodes)
148153
end
149154
else
150155
{timeout, Reason} ->
@@ -153,9 +158,16 @@ reconclitiate_quorum_members(ExpectedNodes, Running, [Q | LocalLeaders], TargetS
153158
_ ->
154159
noop
155160
end,
156-
reconclitiate_quorum_members(ExpectedNodes, Running, LocalLeaders, TargetSize,
161+
reconclitiate_quorum_members(ExpectedNodes, Running, LocalLeaders, State,
157162
update_result(OldResult, Result)).
158163

164+
maybe_remove(_, #state{auto_remove = false}) ->
165+
false;
166+
maybe_remove([], #state{auto_remove = true}) ->
167+
false;
168+
maybe_remove(_Nodes, #state{auto_remove = true}) ->
169+
true.
170+
159171
maybe_add_member(Q, Running, MemberNodes, TargetSize) ->
160172
%% Filter out any new nodes under maintenance
161173
New = rabbit_maintenance:filter_out_drained_nodes_local_read(Running -- MemberNodes),

deps/rabbit/test/quorum_queue_member_reconciliation_SUITE.erl

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,9 @@ init_per_suite(Config0) ->
3737
Config1 = rabbit_ct_helpers:merge_app_env(
3838
Config0, {rabbit, [{quorum_tick_interval, 1000},
3939
{quorum_membership_reconciliation_enabled, true},
40-
{quorum_membership_reconciliation_default_timeout, 5000},
41-
{quorum_membership_reconciliation_short_timeout, 2000},
40+
{quorum_membership_reconciliation_auto_remove, true},
41+
{quorum_membership_reconciliation_interval, 5000},
42+
{quorum_membership_reconciliation_trigger_interval, 2000},
4243
{quorum_membership_reconciliation_target_group_size, 3}]}),
4344
rabbit_ct_helpers:run_setup_steps(Config1, []).
4445

0 commit comments

Comments
 (0)