From b7d46723fc704eb37555ac5dce96eab1724bdc2e Mon Sep 17 00:00:00 2001 From: Adam Kocoloski Date: Thu, 17 Jun 2010 12:34:11 -0400 Subject: updates to use 0.11-style missing_revs --- src/fabric_doc_missing_revs.erl | 2 +- src/fabric_rpc.erl | 25 ++++++++++++++++++++++--- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/fabric_doc_missing_revs.erl b/src/fabric_doc_missing_revs.erl index fe6deac6..8f1f5b4c 100644 --- a/src/fabric_doc_missing_revs.erl +++ b/src/fabric_doc_missing_revs.erl @@ -55,7 +55,7 @@ group_idrevs_by_shard(DbName, IdsRevs) -> end, dict:new(), IdsRevs)). update_dict(D0, KVs) -> - lists:foldl(fun({K,V}, D1) -> dict:store(K, V, D1) end, D0, KVs). + lists:foldl(fun({K,V,_}, D1) -> dict:store(K, V, D1) end, D0, KVs). skip_message({1, Dict}) -> {stop, dict:fold(fun force_reply/3, [], Dict)}; diff --git a/src/fabric_rpc.erl b/src/fabric_rpc.erl index e9d9eb20..4b6e4e62 100644 --- a/src/fabric_rpc.erl +++ b/src/fabric_rpc.erl @@ -162,10 +162,11 @@ get_missing_revs(DbName, IdRevsList) -> Ids = [Id1 || {Id1, _Revs} <- IdRevsList], {ok, lists:zipwith(fun({Id, Revs}, FullDocInfoResult) -> case FullDocInfoResult of - {ok, #full_doc_info{rev_tree=RevisionTree}} -> - {Id, couch_key_tree:find_missing(RevisionTree, Revs)}; + {ok, #full_doc_info{rev_tree=RevisionTree} = FullInfo} -> + MissingRevs = couch_key_tree:find_missing(RevisionTree, Revs), + {Id, MissingRevs, possible_ancestors(FullInfo, MissingRevs)}; not_found -> - {Id, Revs} + {Id, Revs, []} end end, IdRevsList, couch_btree:lookup(Db#db.id_tree, Ids))}; Error -> @@ -304,3 +305,21 @@ doc_member(Shard, Id, Rev) -> Error -> Error end. + +possible_ancestors(_FullInfo, []) -> + []; +possible_ancestors(FullInfo, MissingRevs) -> + #doc_info{revs=RevsInfo} = couch_doc:to_doc_info(FullInfo), + LeafRevs = [Rev || #rev_info{rev=Rev} <- RevsInfo], + % Find the revs that are possible parents of this rev + lists:foldl(fun({LeafPos, LeafRevId}, Acc) -> + % this leaf is a "possible ancenstor" of the missing + % revs if this LeafPos lessthan any of the missing revs + case lists:any(fun({MissingPos, _}) -> + LeafPos < MissingPos end, MissingRevs) of + true -> + [{LeafPos, LeafRevId} | Acc]; + false -> + Acc + end + end, [], LeafRevs). -- cgit v1.2.3