diff options
author | Robert Newson <robert.newson@cloudant.com> | 2013-11-11 12:52:36 +0000 |
---|---|---|
committer | Robert Newson <robert.newson@cloudant.com> | 2013-11-11 12:52:48 +0000 |
commit | 30a45fea3773d17028f8a1fc22ec09ef92d20147 (patch) | |
tree | e10f4b3f6032a09ebaeafb2d5ac5c0555593c727 | |
parent | 777adaf9867c873953cdb50397b1565357d9833b (diff) | |
download | couchdb-30a45fea3773d17028f8a1fc22ec09ef92d20147.tar.gz |
Introduce state record
-rw-r--r-- | src/custodian/src/custodian_util.erl | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/src/custodian/src/custodian_util.erl b/src/custodian/src/custodian_util.erl index d180c2325..bc4a4e86b 100644 --- a/src/custodian/src/custodian_util.erl +++ b/src/custodian/src/custodian_util.erl @@ -9,6 +9,8 @@ -export([summary/0, report/0]). -export([ensure_dbs_exists/0]). +-record(state, {live, n, callback, db, acc}). + %% public functions. summary() -> @@ -39,13 +41,14 @@ ensure_dbs_exists() -> %% private functions. -fold_dbs(Acc0, Fun) -> +fold_dbs(Acc, Fun) -> Live = [node() | nodes()], N = list_to_integer(config:get("cluster", "n", "3")), {ok, Db} = ensure_dbs_exists(), try - {ok, _, {_, _, _, _, Acc1}} = couch_db:enum_docs(Db, fun fold_dbs/3, {Live, N, Fun, Db, Acc0}, []), - Acc1 + State0 = #state{live=Live, n=N, callback=Fun, db=Db, acc=Acc}, + {ok, _, State1} = couch_db:enum_docs(Db, fun fold_dbs/3, State0, []), + State1#state.acc after couch_db:close(Db) end. @@ -54,31 +57,31 @@ fold_dbs(#full_doc_info{id = <<"_design/", _/binary>>}, _, Acc) -> {ok, Acc}; fold_dbs(#full_doc_info{deleted=true}, _, Acc) -> {ok, Acc}; -fold_dbs(#full_doc_info{id = Id} = FDI, _, {_Live, _N, Fun, Db, Acc0} = Acc) -> +fold_dbs(#full_doc_info{id = Id} = FDI, _, State) -> InternalAcc = case count_conflicts(FDI) of 0 -> - Acc0; + State#state.acc; ConflictCount -> - Fun(Id, null, {conflicted, ConflictCount}, Acc0) + (State#state.callback)(Id, null, {conflicted, ConflictCount}, State#state.acc) end, - Shards = load_shards(Db, FDI), + Shards = load_shards(State#state.db, FDI), Rs = [R || #shard{range=R} <- lists:ukeysort(#shard.range, Shards)], ActualN = [{R1, [N || #shard{node=N,range=R2} <- Shards, R1 == R2]} || R1 <- Rs], - fold_dbs(Id, ActualN, setelement(5, Acc, InternalAcc)); + fold_dbs(Id, ActualN, State#state{acc=InternalAcc}); fold_dbs(_Id, [], Acc) -> {ok, Acc}; -fold_dbs(Id, [{Range, Nodes}|Rest], {Live, N, Fun, Db, Acc0}) -> +fold_dbs(Id, [{Range, Nodes}|Rest], State) -> Nodes1 = maybe_redirect(Nodes), - Nodes2 = [Node || Node <- Nodes1, lists:member(Node, Live)], - Acc1 = case length(Nodes2) of + Nodes2 = [Node || Node <- Nodes1, lists:member(Node, State#state.live)], + Acc = case length(Nodes2) of 0 -> - Fun(Id, Range, unavailable, Acc0); - N1 when N1 < N -> - Fun(Id, Range, {impaired, N1}, Acc0); + (State#state.callback)(Id, Range, unavailable, State#state.acc); + N1 when N1 < State#state.n -> + (State#state.callback)(Id, Range, {impaired, N1}, State#state.acc); _ -> - Acc0 + State#state.acc end, - fold_dbs(Id, Rest, {Live, N, Fun, Db, Acc1}). + fold_dbs(Id, Rest, State#state{acc=Acc}). load_shards(Db, #full_doc_info{id = Id} = FDI) -> case couch_db:open_doc(Db, FDI, []) of |