This is an automated email from the ASF dual-hosted git repository. vatamane pushed a commit to branch jenkins-sm-128 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 061760fec54217da06cbc7063bb652c9306c0276 Author: Nick Vatamaniuc <vatam...@gmail.com> AuthorDate: Thu Aug 28 17:44:55 2025 -0400 Fix and improve couch_btree testing Previously, it turns out, we didn't actually test the reverse sorted keys. Instead we just renamed the `Reversed = Sorted` and then tested the `Sorted` case. But it's even worse than that because in order to "force" the test to pass we had effectively disable the check so make it count element whether they were there or not (Count + 1) in this snippet: ```diff FoldFun = fun(Element, {[HAcc | TAcc], Count}) -> case Element == HAcc of true -> {ok, {TAcc, Count + 1}}; - _ -> {ok, {TAcc, Count + 1}} + _ -> {ok, {TAcc, Count}} end end, ``` Luckily, it seems we survived with the code being correct as far as fixing the test didn't reveal any actual btree logic errors. In addition, we were missing tests trying out various chunk sizes, so added two extra cases: one with much smaller chunks, and another with much larger chunks. --- src/couch/test/eunit/couch_btree_tests.erl | 69 ++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/src/couch/test/eunit/couch_btree_tests.erl b/src/couch/test/eunit/couch_btree_tests.erl index 6a5f9a791..f365a37cf 100644 --- a/src/couch/test/eunit/couch_btree_tests.erl +++ b/src/couch/test/eunit/couch_btree_tests.erl @@ -38,6 +38,26 @@ setup_kvs_with_cache(_) -> ]), {Fd, Btree}. +setup_kvs_with_small_chunk_size(_) -> + % Less than a 1/4 than current default 1279 + config:set("couchdb", "btree_chunk_size", "300", false), + {ok, Fd} = couch_file:open(?tempfile(), [create, overwrite]), + {ok, Btree} = couch_btree:open(nil, Fd, [ + {compression, none}, + {reduce, fun reduce_fun/2} + ]), + {Fd, Btree}. + +setup_kvs_with_large_chunk_size(_) -> + % About 4x than current default 1279 + config:set("couchdb", "btree_chunk_size", "5000", false), + {ok, Fd} = couch_file:open(?tempfile(), [create, overwrite]), + {ok, Btree} = couch_btree:open(nil, Fd, [ + {compression, none}, + {reduce, fun reduce_fun/2} + ]), + {Fd, Btree}. + setup_red() -> {_, EvenOddKVs} = lists:foldl( fun(Idx, {Key, Acc}) -> @@ -114,7 +134,7 @@ sorted_kvs_test_() -> rsorted_kvs_test_() -> Sorted = [{Seq, rand:uniform()} || Seq <- lists:seq(1, ?ROWS)], Funs = kvs_test_funs(), - Reversed = Sorted, + Reversed = lists:reverse(Sorted), { "BTree with backward sorted keys", { @@ -167,6 +187,42 @@ sorted_kvs_with_cache_test_() -> } }. +sorted_kvs_small_chunk_size_test_() -> + Funs = kvs_test_funs(), + Sorted = [{Seq, rand:uniform()} || Seq <- lists:seq(1, ?ROWS)], + { + "BTree with a small chunk size and sorted keys", + { + setup, + fun() -> test_util:start_couch() end, + fun test_util:stop/1, + { + foreachx, + fun setup_kvs_with_small_chunk_size/1, + fun teardown/2, + [{Sorted, Fun} || Fun <- Funs] + } + } + }. + +sorted_kvs_large_chunk_size_test_() -> + Funs = kvs_test_funs(), + Sorted = [{Seq, rand:uniform()} || Seq <- lists:seq(1, ?ROWS)], + { + "BTree with a large chunk size and sorted keys", + { + setup, + fun() -> test_util:start_couch() end, + fun test_util:stop/1, + { + foreachx, + fun setup_kvs_with_large_chunk_size/1, + fun teardown/2, + [{Sorted, Fun} || Fun <- Funs] + } + } + }. + reductions_test_() -> { "BTree reductions", @@ -642,18 +698,15 @@ test_key_access(Btree, List) -> FoldFun = fun(Element, {[HAcc | TAcc], Count}) -> case Element == HAcc of true -> {ok, {TAcc, Count + 1}}; - _ -> {ok, {TAcc, Count + 1}} + _ -> {ok, {TAcc, Count}} end end, Length = length(List), Sorted = lists:sort(List), {ok, _, {[], Length}} = couch_btree:foldl(Btree, FoldFun, {Sorted, 0}), - {ok, _, {[], Length}} = couch_btree:fold( - Btree, - FoldFun, - {Sorted, 0}, - [{dir, rev}] - ), + Reversed = lists:reverse(Sorted), + RevOpts = [{dir, rev}], + {ok, _, {[], Length}} = couch_btree:fold(Btree, FoldFun, {Reversed, 0}, RevOpts), ok. test_lookup_access(Btree, KeyValues) ->