summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Newson <robert.newson@cloudant.com>2013-11-11 12:52:36 +0000
committerRobert Newson <robert.newson@cloudant.com>2013-11-11 12:52:48 +0000
commit30a45fea3773d17028f8a1fc22ec09ef92d20147 (patch)
treee10f4b3f6032a09ebaeafb2d5ac5c0555593c727
parent777adaf9867c873953cdb50397b1565357d9833b (diff)
downloadcouchdb-30a45fea3773d17028f8a1fc22ec09ef92d20147.tar.gz
Introduce state record
-rw-r--r--src/custodian/src/custodian_util.erl35
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