diff options
author | Nick Vatamaniuc <vatamane@gmail.com> | 2021-10-28 16:54:53 -0400 |
---|---|---|
committer | Nick Vatamaniuc <nickva@users.noreply.github.com> | 2021-10-28 19:06:57 -0400 |
commit | aa6744892a12eadc1421f36e788bd2d9156cf65e (patch) | |
tree | 44e5cdfadc154376f93653f82e65e0575b77189a | |
parent | 9af12991a440aaca0aa57f1aed136cf6ce93859d (diff) | |
download | couchdb-aa6744892a12eadc1421f36e788bd2d9156cf65e.tar.gz |
Eliminate custodian false positive errors for dbs with N < default N
Previously, dbs with N < cluster default N would pollute logs with critical
errors regarding not having enough shards. Instead, use each database's
expected N value to emit custodian reports.
Note: the expected N value is a bit tricky to understand since with shard
splitting feature, shard ranges are not guaranteed to exactly match for all
copies. The N value is then defined as the max number of rings which can be
completed with the given set of shards -- complete the ring once, remove
participating shards, try again, etc. Lucky for us, that function is already
written (`mem3_util:calculate_max_n(Shards)` so we are just re-using it.
-rw-r--r-- | src/custodian/src/custodian_util.erl | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/custodian/src/custodian_util.erl b/src/custodian/src/custodian_util.erl index ac46cb143..6d5a56093 100644 --- a/src/custodian/src/custodian_util.erl +++ b/src/custodian/src/custodian_util.erl @@ -21,7 +21,7 @@ % Old design doc which should be cleaned up -define(CUSTODIAN_ID, <<"_design/custodian">>). --record(state, {live, safe, n, callback, db, acc}). +-record(state, {live, safe, callback, db, acc}). %% public functions. @@ -55,10 +55,9 @@ ensure_dbs_exists() -> fold_dbs(Acc, Fun) -> Safe = maybe_redirect([node() | nodes()]), Live = Safe -- maintenance_nodes(Safe), - N = cluster_n(), {ok, Db} = ensure_dbs_exists(), try - State0 = #state{live=Live, safe=Safe, n=N, callback=Fun, db=Db, acc=Acc}, + State0 = #state{live=Live, safe=Safe, callback=Fun, db=Db, acc=Acc}, {ok, State1} = couch_db:fold_docs(Db, fun fold_dbs1/2, State0, []), State1#state.acc after @@ -82,9 +81,9 @@ fold_dbs1(#full_doc_info{id = Id} = FDI, State) -> fold_dbs(Id, Shards, State) -> IsSafe = fun(#shard{node = N}) -> lists:member(N, State#state.safe) end, IsLive = fun(#shard{node = N}) -> lists:member(N, State#state.live) end, - TargetN = State#state.n, LiveShards = lists:filter(IsLive, Shards), SafeShards = lists:filter(IsSafe, Shards), + TargetN = mem3_util:calculate_max_n(Shards), Acc0 = State#state.acc, Acc1 = case mem3_util:calculate_max_n(LiveShards) of LiveN when LiveN < TargetN -> |