Skip to content

Commit 94d9d6d

Browse files
authored
Add participate_in_2i_coverage riak option (#917)
Allows marking of nodes 'down' in calculations for 2i coverage queries. In create_plan, it queries each node for the value of the participate_in_2i_coverage and treats those with the value set explicitly to `false` as 'down' for the calculation of avaiable vnodes. See related riak_kv commit that adds a default value to the KV schema. This is an operator feature. The operator must bring down the node, change the config, and start the node, for it to have effect.
1 parent 5aed3a9 commit 94d9d6d

File tree

5 files changed

+30
-7
lines changed

5 files changed

+30
-7
lines changed

src/riak_core.erl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,13 @@ standard_join(Node, Ring, Rejoin, Auto) ->
159159
node(),
160160
gossip_vsn,
161161
GossipVsn),
162-
{_, Ring5} = riak_core_capability:update_ring(Ring4),
162+
ParticipateInCoverage = app_helper:get_env(riak_core,participate_in_coverage),
163+
Ring4a =
164+
riak_core_ring:update_member_meta(node(),
165+
Ring4,
166+
node(),
167+
participate_in_coverage, ParticipateInCoverage),
168+
{_, Ring5} = riak_core_capability:update_ring(Ring4a),
163169
Ring6 = maybe_auto_join(Auto, node(), Ring5),
164170
riak_core_ring_manager:set_my_ring(Ring6),
165171
riak_core_gossip:send_ring(Node, node())

src/riak_core_apl.erl

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
get_apl_ann_with_pnum/1,
3030
get_primary_apl/3, get_primary_apl/4,
3131
get_primary_apl_chbin/4,
32-
first_up/2, offline_owners/1, offline_owners/2
32+
first_up/2, offline_owners/1, offline_owners/2, offline_owners/3
3333
]).
3434

3535
-export_type([preflist/0, preflist_ann/0, preflist_with_pnum_ann/0]).
@@ -175,9 +175,12 @@ offline_owners(Service) ->
175175
offline_owners(Service, CHBin).
176176

177177
offline_owners(Service, CHBin) ->
178+
offline_owners(Service, CHBin, []).
179+
180+
offline_owners(Service, CHBin, OtherDownNodes) ->
178181
UpSet = ordsets:from_list(riak_core_node_watcher:nodes(Service)),
179182
DownVNodes = chashbin:to_list_filter(fun({_Index, Node}) ->
180-
not is_up(Node, UpSet)
183+
(not is_up(Node, UpSet) or lists:member(Node,OtherDownNodes))
181184
end, CHBin),
182185
DownVNodes.
183186

src/riak_core_coverage_fsm.erl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,6 @@ init([Mod,
180180
init({test, Args, StateProps}) ->
181181
%% Call normal init
182182
{ok, initialize, StateData, 0} = init(Args),
183-
184183
%% Then tweak the state record with entries provided by StateProps
185184
Fields = record_info(fields, state),
186185
FieldPos = lists:zip(Fields, lists:seq(2, length(Fields)+1)),

src/riak_core_coverage_plan.erl

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,18 @@
4747
create_plan(VNodeSelector, NVal, PVC, ReqId, Service) ->
4848
{ok, CHBin} = riak_core_ring_manager:get_chash_bin(),
4949
PartitionCount = chashbin:num_partitions(CHBin),
50+
{ok, Ring} = riak_core_ring_manager:get_my_ring(),
5051
%% Create a coverage plan with the requested primary
5152
%% preference list VNode coverage.
5253
%% Get a list of the VNodes owned by any unavailble nodes
54+
Members = riak_core_ring:all_members(Ring),
55+
NonCoverageNodes = [Node || Node <- Members,
56+
riak_core_ring:get_member_meta(Ring, Node, participate_in_coverage) == false],
57+
5358
DownVNodes = [Index ||
5459
{Index, _Node}
55-
<- riak_core_apl:offline_owners(Service, CHBin)],
60+
<- riak_core_apl:offline_owners(Service, CHBin, NonCoverageNodes)],
61+
5662
%% Calculate an offset based on the request id to offer
5763
%% the possibility of different sets of VNodes being
5864
%% used even when all nodes are available.

src/riak_core_ring_manager.erl

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,9 @@ stop() ->
331331
init([Mode]) ->
332332
setup_ets(Mode),
333333
Ring = reload_ring(Mode),
334-
State = set_ring(Ring, #state{mode = Mode}),
335-
riak_core_ring_events:ring_update(Ring),
334+
Ring2 = node_level_config(Ring),
335+
State = set_ring(Ring2, #state{mode = Mode}),
336+
riak_core_ring_events:ring_update(Ring2),
336337
{ok, State}.
337338

338339
reload_ring(test) ->
@@ -507,6 +508,14 @@ run_fixups([{App, Fixup}|T], BucketName, BucketProps) ->
507508
end,
508509
run_fixups(T, BucketName, BP).
509510

511+
%% Add node level configs to ring
512+
-spec node_level_config(riak_core_ring:riak_core_ring()) -> riak_core_ring:riak_core_ring().
513+
node_level_config(Ring) ->
514+
%% Check node participation in coverage queries and update ring
515+
Node = node(),
516+
ParticipateInCoverage = app_helper:get_env(riak_core,participate_in_coverage),
517+
riak_core_ring:update_member_meta(Node, Ring, Node, participate_in_coverage, ParticipateInCoverage).
518+
510519
set_ring(Ring, State) ->
511520
set_ring_global(Ring),
512521
Now = os:timestamp(),

0 commit comments

Comments
 (0)