Skip to content

Commit 7e93db8

Browse files
MB-50712: Correct softNodesNeeded failover warning trigger.
With the new greedy vbmap approach, the maxReplicas can be more than numGroups - 1. Calling the newly introduced ns_cluster_membership: get_max_replicas/2 to get the correct maxReplicas. Change-Id: I82258eabe37947a33a3066870da131681b525596 Reviewed-on: https://review.couchbase.org/c/ns_server/+/175372 Well-Formed: Restriction Checker Well-Formed: Build Bot <[email protected]> Tested-by: Hareen Kancharla <[email protected]> Reviewed-by: Steve Watanabe <[email protected]>
1 parent ec47ecf commit 7e93db8

File tree

1 file changed

+16
-14
lines changed

1 file changed

+16
-14
lines changed

src/ns_bucket.erl

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ magma_fragmentation_percentage(BucketConfig) ->
490490
-define(FS_SOFT_REBALANCE_NEEDED, 1).
491491
-define(FS_OK, 0).
492492

493-
bucket_failover_safety(BucketConfig, ActiveNodes, LiveNodes, NumGroups) ->
493+
bucket_failover_safety(BucketConfig, ActiveNodes, LiveNodes, MaxReplicas) ->
494494
ReplicaNum = num_replicas(BucketConfig),
495495
case ReplicaNum of
496496
%% if replica count for bucket is 0 we cannot failover at all
@@ -532,31 +532,32 @@ bucket_failover_safety(BucketConfig, ActiveNodes, LiveNodes, NumGroups) ->
532532
end
533533
end,
534534
ExtraSafety = bucket_extra_safety(
535-
BaseSafety, ReplicaNum, ActiveNodes, NumGroups),
535+
BaseSafety, ReplicaNum, ActiveNodes, MaxReplicas),
536536
{BaseSafety, ExtraSafety}
537537
end.
538538

539-
bucket_extra_safety(BaseSafety, _ReplicaNum, _ActiveNodes, _NumGroups)
539+
bucket_extra_safety(BaseSafety, _ReplicaNum, _ActiveNodes, _MaxReplicas)
540540
when BaseSafety =:= ?FS_HARD_NODES_NEEDED ->
541541
ok;
542-
bucket_extra_safety(_BaseSafety, ReplicaNum, ActiveNodes, NumGroups) ->
543-
case length(ActiveNodes) =< ReplicaNum orelse NumGroups =< ReplicaNum of
542+
bucket_extra_safety(_BaseSafety, ReplicaNum, ActiveNodes, MaxReplicas) ->
543+
case length(ActiveNodes) =< ReplicaNum orelse MaxReplicas < ReplicaNum of
544544
true ->
545545
softNodesNeeded;
546546
false ->
547547
ok
548548
end.
549549

550550
failover_safety_rec(?FS_HARD_NODES_NEEDED, _ExtraSafety, _,
551-
_ActiveNodes, _LiveNodes, _NumGroups) ->
551+
_ActiveNodes, _LiveNodes, _MaxReplicas) ->
552552
{?FS_HARD_NODES_NEEDED, ok};
553553
failover_safety_rec(BaseSafety, ExtraSafety, [],
554-
_ActiveNodes, _LiveNodes, _NumGroups) ->
554+
_ActiveNodes, _LiveNodes, _MaxReplicas) ->
555555
{BaseSafety, ExtraSafety};
556556
failover_safety_rec(BaseSafety, ExtraSafety, [BucketConfig | RestConfigs],
557-
ActiveNodes, LiveNodes, NumGroups) ->
557+
ActiveNodes, LiveNodes, MaxReplicas) ->
558558
{ThisBaseSafety, ThisExtraSafety} =
559-
bucket_failover_safety(BucketConfig, ActiveNodes, LiveNodes, NumGroups),
559+
bucket_failover_safety(BucketConfig, ActiveNodes, LiveNodes,
560+
MaxReplicas),
560561
NewBaseSafety = case BaseSafety < ThisBaseSafety of
561562
true -> ThisBaseSafety;
562563
_ -> BaseSafety
@@ -568,7 +569,7 @@ failover_safety_rec(BaseSafety, ExtraSafety, [BucketConfig | RestConfigs],
568569
ok
569570
end,
570571
failover_safety_rec(NewBaseSafety, NewExtraSafety,
571-
RestConfigs, ActiveNodes, LiveNodes, NumGroups).
572+
RestConfigs, ActiveNodes, LiveNodes, MaxReplicas).
572573

573574
-spec failover_warnings(map()) -> [failoverNeeded | rebalanceNeeded |
574575
hardNodesNeeded | softNodesNeeded |
@@ -581,12 +582,13 @@ failover_warnings(Snapshot) ->
581582
KvGroups = ns_cluster_membership:get_nodes_server_groups(
582583
ActiveNodes, ServerGroups),
583584

584-
NumGroups =
585+
MaxReplicas =
585586
case ns_cluster_membership:rack_aware(KvGroups) of
586587
true ->
587-
length(KvGroups);
588+
ns_cluster_membership:get_max_replicas(
589+
length(ActiveNodes), KvGroups);
588590
false ->
589-
length(ActiveNodes)
591+
length(ActiveNodes) - 1
590592
end,
591593

592594
{BaseSafety0, ExtraSafety}
@@ -595,7 +597,7 @@ failover_warnings(Snapshot) ->
595597
membase =:= bucket_type(C)],
596598
ActiveNodes,
597599
LiveNodes,
598-
NumGroups),
600+
MaxReplicas),
599601
BaseSafety = case BaseSafety0 of
600602
?FS_HARD_NODES_NEEDED -> hardNodesNeeded;
601603
?FS_FAILOVER_NEEDED -> failoverNeeded;

0 commit comments

Comments
 (0)