This is an automated email from the ASF dual-hosted git repository. davisp pushed a commit to branch 3.x in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 2c9477ec87b9fff2672d1891797a994a29fe17f5 Author: Paul J. Davis <[email protected]> AuthorDate: Wed Sep 6 16:26:03 2017 -0500 Optimize btree node writes This uses the new couch_file:append_terms/2 function to write all chunks in a single write call. --- src/couch/src/couch_btree.erl | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/src/couch/src/couch_btree.erl b/src/couch/src/couch_btree.erl index ea0cf69..858ae2b 100644 --- a/src/couch/src/couch_btree.erl +++ b/src/couch/src/couch_btree.erl @@ -437,20 +437,22 @@ get_node(#btree{fd = Fd}, NodePos) -> write_node(#btree{fd = Fd, compression = Comp} = Bt, NodeType, NodeList) -> % split up nodes into smaller sizes - NodeListList = chunkify(NodeList), + Chunks = chunkify(NodeList), % now write out each chunk and return the KeyPointer pairs for those nodes - ResultList = [ - begin - {ok, Pointer, Size} = couch_file:append_term( - Fd, {NodeType, ANodeList}, [{compression, Comp}]), - {LastKey, _} = lists:last(ANodeList), - SubTreeSize = reduce_tree_size(NodeType, Size, ANodeList), - {LastKey, {Pointer, reduce_node(Bt, NodeType, ANodeList), SubTreeSize}} - end - || - ANodeList <- NodeListList - ], - {ok, ResultList}. + ToWrite = [{NodeType, Chunk} || Chunk <- Chunks], + WriteOpts = [{compression, Comp}], + {ok, PtrSizes} = couch_file:append_terms(Fd, ToWrite, WriteOpts), + {ok, group_kps(Bt, NodeType, Chunks, PtrSizes)}. + + +group_kps(_Bt, _NodeType, [], []) -> + []; + +group_kps(Bt, NodeType, [Chunk | RestChunks], [{Ptr, Size} | RestPtrSizes]) -> + {LastKey, _} = lists:last(Chunk), + SubTreeSize = reduce_tree_size(NodeType, Size, Chunk), + KP = {LastKey, {Ptr, reduce_node(Bt, NodeType, Chunk), SubTreeSize}}, + [KP | group_kps(Bt, NodeType, RestChunks, RestPtrSizes)]. write_node(Bt, _OldNode, NodeType, [], NewList) ->
