You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by da...@apache.org on 2017/03/30 16:44:37 UTC

[4/4] couch commit: updated refs/heads/feat-optimize-compaction-docid-phase to 14766b3

Use parallel file API to avoid copying revision trees multiple times


Project: http://git-wip-us.apache.org/repos/asf/couchdb-couch/repo
Commit: http://git-wip-us.apache.org/repos/asf/couchdb-couch/commit/14766b3f
Tree: http://git-wip-us.apache.org/repos/asf/couchdb-couch/tree/14766b3f
Diff: http://git-wip-us.apache.org/repos/asf/couchdb-couch/diff/14766b3f

Branch: refs/heads/feat-optimize-compaction-docid-phase
Commit: 14766b3f7bb07a23df8ae4766e0544ae57ea221f
Parents: 880b6b7
Author: Paul J. Davis <pa...@gmail.com>
Authored: Thu Mar 30 11:44:15 2017 -0500
Committer: Paul J. Davis <pa...@gmail.com>
Committed: Thu Mar 30 11:44:15 2017 -0500

----------------------------------------------------------------------
 src/couch_db_updater.erl | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/couchdb-couch/blob/14766b3f/src/couch_db_updater.erl
----------------------------------------------------------------------
diff --git a/src/couch_db_updater.erl b/src/couch_db_updater.erl
index 1afad34..875cc4b 100644
--- a/src/couch_db_updater.erl
+++ b/src/couch_db_updater.erl
@@ -27,6 +27,7 @@
 }).
 
 -record(merge_st, {
+    fd,
     id_tree,
     seq_tree,
     curr,
@@ -1097,17 +1098,23 @@ copy_docs(Db, #db{fd = DestFd} = NewDb, MixedInfos, Retry) ->
         [Seq || {ok, #full_doc_info{update_seq=Seq}} <- Existing]
     end,
 
+    {ok, IdEms} = update_emsort(NewDb, NewInfos),
     {ok, SeqTree} = couch_btree:add_remove(
             NewDb#db.seq_tree, NewInfos, RemoveSeqs),
 
-    FDIKVs = lists:map(fun(#full_doc_info{id=Id, update_seq=Seq}=FDI) ->
-        {{Id, Seq}, FDI}
-    end, NewInfos),
-    {ok, IdEms} = couch_emsort:add(NewDb#db.id_tree, FDIKVs),
     update_compact_task(length(NewInfos)),
     NewDb#db{id_tree=IdEms, seq_tree=SeqTree}.
 
 
+update_emsort(#db{id_tree=IdTree}, FDIs) ->
+    Fd = couch_emsort:get_fd(IdTree),
+    {ok, PosSizePairs} = couch_file:append_terms(Fd, FDIs),
+    KVs = lists:zipwith(fun(#full_doc_info{id=Id, update_seq=Seq}, {Pos, _}) ->
+        {{Id, Seq}, Pos}
+    end, FDIs, PosSizePairs),
+    couch_emsort:add(IdTree, KVs).
+
+
 copy_compact(Db, NewDb0, Retry) ->
     Compression = couch_compress:get_compression_method(),
     NewDb = NewDb0#db{compression=Compression},
@@ -1411,6 +1418,7 @@ copy_meta_data(#db{fd=Fd, header=Header}=Db, DocCount) ->
     ]),
     {ok, Iter} = couch_emsort:iter(Src),
     Acc0 = #merge_st{
+        fd=couch_emsort:get_fd(Src),
         id_tree=IdTree0,
         seq_tree=Db#db.seq_tree,
         rem_seqs=[],
@@ -1466,11 +1474,13 @@ next_info(Iter, {Id, Seq, FDI}, Seqs) ->
 
 flush_merge_st(MergeSt) ->
     #merge_st{
+        fd=Fd,
         id_tree=IdTree0,
         seq_tree=SeqTree0,
-        infos=Infos,
+        infos=PosList,
         rem_seqs=RemSeqs
     } = MergeSt,
+    {ok, Infos} = couch_file:mpread_terms(Fd, PosList),
     {ok, IdTree1} = couch_btree:add(IdTree0, Infos),
     {ok, SeqTree1} = couch_btree:add_remove(SeqTree0, [], RemSeqs),
     update_compact_task(length(Infos)),