diff options
author | Paul J. Davis <paul.joseph.davis@gmail.com> | 2017-09-06 16:26:03 -0500 |
---|---|---|
committer | Paul J. Davis <paul.joseph.davis@gmail.com> | 2017-09-11 15:56:36 -0500 |
commit | 084f72a2f639a72a1ec8694a3caf1f14c6ba9f26 (patch) | |
tree | ff8dcd45094e3ffa4cbfba87b6797e1166b3ae6a | |
parent | 55f8718a5e124e963541971078c6d431a5a9f088 (diff) | |
download | couchdb-084f72a2f639a72a1ec8694a3caf1f14c6ba9f26.tar.gz |
Optimize btree node writes
This uses the new couch_file:append_terms/2 function to write all chunks
in a single write call.
-rw-r--r-- | src/couch/src/couch_btree.erl | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/src/couch/src/couch_btree.erl b/src/couch/src/couch_btree.erl index ea224b1ab..0ae6e7a04 100644 --- a/src/couch/src/couch_btree.erl +++ b/src/couch/src/couch_btree.erl @@ -436,20 +436,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) -> |