Skip to content

Commit

Permalink
Fix OOME when compacting doc w/ lots of conflicts, COUCHDB-888
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.0.x@1049257 13f79535-47bb-0310-9956-ffa450edef68
  • Loading branch information
kocolosk committed Dec 14, 2010
1 parent 852fa04 commit 4ad46e6
Showing 1 changed file with 8 additions and 23 deletions.
31 changes: 8 additions & 23 deletions src/couchdb/couch_db_updater.erl
Expand Up @@ -765,39 +765,24 @@ copy_doc_attachments(#db{fd=SrcFd}=SrcDb, {Pos,_RevId}, SrcSp, DestFd) ->
end, BinInfos),
{BodyData, NewBinInfos}.

copy_rev_tree_attachments(SrcDb, DestFd, Tree) ->
couch_key_tree:map(
fun(Rev, {IsDel, Sp, Seq}, leaf) ->
DocBody = copy_doc_attachments(SrcDb, Rev, Sp, DestFd),
{IsDel, DocBody, Seq};
(_, _, branch) ->
?REV_MISSING
end, Tree).


copy_docs(Db, #db{fd=DestFd}=NewDb, InfoBySeq0, Retry) ->
% COUCHDB-968, make sure we prune duplicates during compaction
InfoBySeq = lists:usort(fun(#doc_info{id=A}, #doc_info{id=B}) -> A =< B end,
InfoBySeq0),
Ids = [Id || #doc_info{id=Id} <- InfoBySeq],
LookupResults = couch_btree:lookup(Db#db.fulldocinfo_by_id_btree, Ids),

% write out the attachments
NewFullDocInfos0 = lists:map(
fun({ok, #full_doc_info{rev_tree=RevTree}=Info}) ->
Info#full_doc_info{rev_tree=copy_rev_tree_attachments(Db, DestFd, RevTree)}
end, LookupResults),
% write out the docs
% we do this in 2 stages so the docs are written out contiguously, making
% view indexing and replication faster.
NewFullDocInfos1 = lists:map(
fun(#full_doc_info{rev_tree=RevTree}=Info) ->
Info#full_doc_info{rev_tree=couch_key_tree:map_leafs(
fun(_Key, {IsDel, DocBody, Seq}) ->
fun({ok, #full_doc_info{rev_tree=RevTree}=Info}) ->
Info#full_doc_info{rev_tree=couch_key_tree:map(
fun(Rev, {IsDel, Sp, Seq}, leaf) ->
DocBody = copy_doc_attachments(Db, Rev, Sp, DestFd),
{ok, Pos} = couch_file:append_term_md5(DestFd, DocBody),
{IsDel, Pos, Seq}
{IsDel, Pos, Seq};
(_, _, branch) ->
?REV_MISSING
end, RevTree)}
end, NewFullDocInfos0),
end, LookupResults),

NewFullDocInfos = stem_full_doc_infos(Db, NewFullDocInfos1),
NewDocInfos = [couch_doc:to_doc_info(Info) || Info <- NewFullDocInfos],
Expand Down

0 comments on commit 4ad46e6

Please sign in to comment.