You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by ja...@apache.org on 2021/10/27 18:22:53 UTC
[couchdb] branch 3.x updated (294e777 -> c119ac7)
This is an automated email from the ASF dual-hosted git repository.
jaydoane pushed a change to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git.
from 294e777 Minimize rewinds when a node is down (#3792)
new b62a51d Mock `couch_log` for config application
new 4ea233f Parameterize shards db
new 537fd31 Use unique ddoc id to prevent collisions
new c119ac7 Mock `couch_log:warning/2`
The 4 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
src/mem3/src/mem3_rep.erl | 27 +++++++++---
src/mem3/src/mem3_sync_event_listener.erl | 4 ++
src/mem3/test/eunit/mem3_bdu_test.erl | 68 ++++++++++++++++---------------
3 files changed, 61 insertions(+), 38 deletions(-)
[couchdb] 02/04: Parameterize shards db
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jaydoane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 4ea233fb250e465cd36c83a41bb0630af0c08ce9
Author: Jay Doane <ja...@apache.org>
AuthorDate: Tue Oct 26 16:43:40 2021 -0700
Parameterize shards db
Depending on configuration, it is possible for the shards db to be
different than `_dbs`.
---
src/mem3/test/eunit/mem3_bdu_test.erl | 62 +++++++++++++++++------------------
1 file changed, 31 insertions(+), 31 deletions(-)
diff --git a/src/mem3/test/eunit/mem3_bdu_test.erl b/src/mem3/test/eunit/mem3_bdu_test.erl
index 056cced..27d5783 100644
--- a/src/mem3/test/eunit/mem3_bdu_test.erl
+++ b/src/mem3/test/eunit/mem3_bdu_test.erl
@@ -23,7 +23,6 @@
-define(PASS, "pass").
-define(AUTH, {basic_auth, {?USER, ?PASS}}).
-define(JSON, {"Content-Type", "application/json"}).
--define(DBS, "_node/_local/_dbs").
setup() ->
@@ -33,10 +32,11 @@ setup() ->
Db = ?tempdb(),
Port = mochiweb_socket_server:get(chttpd, port),
Url = lists:concat(["http://", Addr, ":", Port, "/"]),
- {Url, Db}.
+ ShardsDb = "_node/_local/" ++ config:get("mem3", "shards_db", "_dbs"),
+ {Url, Db, ShardsDb}.
-teardown({Url, Db}) ->
+teardown({Url, Db, _}) ->
sync_delete_db(Url, Db),
ok = config:delete("admins", ?USER, _Persist=false).
@@ -78,7 +78,7 @@ mem3_bdu_shard_doc_test_() ->
}.
-t_can_insert_shard_map_doc({Top, Db}) ->
+t_can_insert_shard_map_doc({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -87,22 +87,22 @@ t_can_insert_shard_map_doc({Top, Db}) ->
<<"by_range">> => #{Range => [Node]},
<<"suffix">> => suffix()
},
- {Code, Res} = req(post, Top ++ ?DBS, ShardMap),
+ {Code, Res} = req(post, Top ++ ShardsDb, ShardMap),
?assertEqual(201, Code),
?assertMatch(#{<<"ok">> := true}, Res).
-t_missing_by_node_section({Top, Db}) ->
+t_missing_by_node_section({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
<<"_id">> => Db,
<<"by_range">> => #{Range => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_by_node_not_a_map({Top, Db}) ->
+t_by_node_not_a_map({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -110,20 +110,20 @@ t_by_node_not_a_map({Top, Db}) ->
<<"by_node">> => 42,
<<"by_range">> => #{Range => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_missing_by_range_section({Top, Db}) ->
+t_missing_by_range_section({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
<<"_id">> => Db,
<<"by_node">> => #{Node => [Range]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_by_range_not_a_map({Top, Db}) ->
+t_by_range_not_a_map({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -131,10 +131,10 @@ t_by_range_not_a_map({Top, Db}) ->
<<"by_node">> => #{Node => [Range]},
<<"by_range">> => 42
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_missing_range_in_by_range({Top, Db}) ->
+t_missing_range_in_by_range({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -142,10 +142,10 @@ t_missing_range_in_by_range({Top, Db}) ->
<<"by_node">> => #{Node => [Range]},
<<"by_range">> => #{<<"xyz">> => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_missing_node_in_by_range_node_list({Top, Db}) ->
+t_missing_node_in_by_range_node_list({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -153,10 +153,10 @@ t_missing_node_in_by_range_node_list({Top, Db}) ->
<<"by_node">> => #{Node => [Range]},
<<"by_range">> => #{Range => [<<"xyz">>]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_missing_node_in_by_node({Top, Db}) ->
+t_missing_node_in_by_node({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -164,10 +164,10 @@ t_missing_node_in_by_node({Top, Db}) ->
<<"by_node">> => #{<<"xyz">> => [Range]},
<<"by_range">> => #{Range => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_missing_range_in_by_node_range_list({Top, Db}) ->
+t_missing_range_in_by_node_range_list({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -175,10 +175,10 @@ t_missing_range_in_by_node_range_list({Top, Db}) ->
<<"by_node">> => #{Node => [<<"xyz">>]},
<<"by_range">> => #{Range => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_by_node_val_not_array({Top, Db}) ->
+t_by_node_val_not_array({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -186,10 +186,10 @@ t_by_node_val_not_array({Top, Db}) ->
<<"by_node">> => #{Node => 42},
<<"by_range">> => #{Range => [Node]}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_by_range_val_not_array({Top, Db}) ->
+t_by_range_val_not_array({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -197,12 +197,12 @@ t_by_range_val_not_array({Top, Db}) ->
<<"by_node">> => #{Node => [Range]},
<<"by_range">> => #{Range => 42}
},
- ?assertMatch({403, _}, req(post, Top ++ ?DBS, ShardMap)).
+ ?assertMatch({403, _}, req(post, Top ++ ShardsDb, ShardMap)).
-t_design_docs_are_not_validated({Top, _}) ->
+t_design_docs_are_not_validated({Top, _, ShardsDb}) ->
DDoc = #{<<"_id">> => <<"_design/ddoc_bdu_test">>},
- {Code, Res} = req(post, Top ++ ?DBS, DDoc),
+ {Code, Res} = req(post, Top ++ ShardsDb, DDoc),
?assertEqual(201, Code),
#{<<"rev">> := Rev} = Res,
Deleted = #{
@@ -210,10 +210,10 @@ t_design_docs_are_not_validated({Top, _}) ->
<<"_rev">> => Rev,
<<"_deleted">> => true
},
- ?assertMatch({200, _}, req(post, Top ++ ?DBS, Deleted)).
+ ?assertMatch({200, _}, req(post, Top ++ ShardsDb, Deleted)).
-t_replicated_changes_not_validated({Top, Db}) ->
+t_replicated_changes_not_validated({Top, Db, ShardsDb}) ->
Node = atom_to_binary(node(), utf8),
Range = <<"00000000-ffffffff">>,
ShardMap = #{
@@ -232,7 +232,7 @@ t_replicated_changes_not_validated({Top, Db}) ->
<<"docs">> => [ShardMap],
<<"new_edits">> => false
},
- {Code, Res} = req(post, Top ++ ?DBS ++ "/_bulk_docs", Docs),
+ {Code, Res} = req(post, Top ++ ShardsDb ++ "/_bulk_docs", Docs),
?assertEqual(201, Code),
?assertEqual([], Res),
Deleted = #{
@@ -240,7 +240,7 @@ t_replicated_changes_not_validated({Top, Db}) ->
<<"_rev">> => <<"1-abc">>,
<<"_deleted">> => true
},
- ?assertMatch({200, _}, req(post, Top ++ ?DBS, Deleted)).
+ ?assertMatch({200, _}, req(post, Top ++ ShardsDb, Deleted)).
delete_db(Top, Db) when is_binary(Db) ->
[couchdb] 01/04: Mock `couch_log` for config application
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jaydoane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit b62a51d5f71e6ddcc58d9613edeaf372ae144e2d
Author: Jay Doane <ja...@apache.org>
AuthorDate: Tue Oct 26 16:44:07 2021 -0700
Mock `couch_log` for config application
Prevent failures like this:
mem3_sync_event_listener:267: should_set_sync_delay...*failed*
in function gen_server:call/3 (gen_server.erl, line 214)
in call from mem3_sync_event_listener:'-should_set_sync_delay/1-fun-1-'/1
(src/mem3_sync_event_listener.erl, line 268)
**exit:{{noproc,{gen_server,call,
[couch_log_server,
{log,{log_entry,notice,<0.31789.5>,
["config",58,32,91,[...]|...],
"--------",
["2021",45,[...]|...]}}]}},
---
src/mem3/src/mem3_sync_event_listener.erl | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/src/mem3/src/mem3_sync_event_listener.erl b/src/mem3/src/mem3_sync_event_listener.erl
index cad3422..5a8d162 100644
--- a/src/mem3/src/mem3_sync_event_listener.erl
+++ b/src/mem3/src/mem3_sync_event_listener.erl
@@ -218,6 +218,10 @@ subscribe_for_config() ->
-include_lib("couch/include/couch_eunit.hrl").
setup_all() ->
+ % couch_log used by config app
+ ok = meck:expect(couch_log, notice, 2, ok),
+ ok = meck:expect(couch_log, warning, 2, ok),
+
application:start(config),
ok = meck:new(couch_event, [passthrough]),
[couchdb] 04/04: Mock `couch_log:warning/2`
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jaydoane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit c119ac72ce151676d0bbc95abe199b16f0df9a79
Author: Jay Doane <ja...@apache.org>
AuthorDate: Tue Oct 26 22:28:52 2021 -0700
Mock `couch_log:warning/2`
Prevent failures like:
mem3_rep: find_source_seq_unknown_node_test...*failed*
in function gen_server:call/2 (gen_server.erl, line 206)
in call from couch_log:log/3 (src/couch_log.erl, line 73)
in call from mem3_rep:find_source_seq_int/5 (src/mem3_rep.erl, line 248)
in call from mem3_rep:'-find_source_seq_unknown_node_test/0-fun-0-'/0 (src/mem3_rep.erl, line 794)
**exit:{noproc,{gen_server,call,
[couch_log_server,
{log,{log_entry,warning,<0.17426.5>,
["mem3_rep",32,102,105,110,100|...],
"--------",
["2021",45,"10",45|...]}}]}}
output:<<"">>
---
src/mem3/src/mem3_rep.erl | 27 ++++++++++++++++++++++-----
1 file changed, 22 insertions(+), 5 deletions(-)
diff --git a/src/mem3/src/mem3_rep.erl b/src/mem3/src/mem3_rep.erl
index 7fa0fc0..2487e6a 100644
--- a/src/mem3/src/mem3_rep.erl
+++ b/src/mem3/src/mem3_rep.erl
@@ -788,36 +788,53 @@ reset_remaining(#{} = Targets) ->
-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").
+-define(TDEF(A), {atom_to_list(A), fun A/0}).
-find_source_seq_unknown_node_test() ->
+
+find_source_seq_int_test_() ->
+ {
+ setup,
+ fun() -> meck:expect(couch_log, warning, 2, ok) end,
+ fun(_) -> meck:unload() end,
+ [
+ ?TDEF(t_unknown_node),
+ ?TDEF(t_unknown_uuid),
+ ?TDEF(t_ok),
+ ?TDEF(t_old_ok),
+ ?TDEF(t_different_node)
+ ]
+ }.
+
+
+t_unknown_node() ->
?assertEqual(
find_source_seq_int(doc_(), <<"foo">>, <<"bing">>, <<"bar_uuid">>, 10),
0
).
-find_source_seq_unknown_uuid_test() ->
+t_unknown_uuid() ->
?assertEqual(
find_source_seq_int(doc_(), <<"foo">>, <<"bar">>, <<"teapot">>, 10),
0
).
-find_source_seq_ok_test() ->
+t_ok() ->
?assertEqual(
find_source_seq_int(doc_(), <<"foo">>, <<"bar">>, <<"bar_uuid">>, 100),
100
).
-find_source_seq_old_ok_test() ->
+t_old_ok() ->
?assertEqual(
find_source_seq_int(doc_(), <<"foo">>, <<"bar">>, <<"bar_uuid">>, 84),
50
).
-find_source_seq_different_node_test() ->
+t_different_node() ->
?assertEqual(
find_source_seq_int(doc_(), <<"foo2">>, <<"bar">>, <<"bar_uuid">>, 92),
31
[couchdb] 03/04: Use unique ddoc id to prevent collisions
Posted by ja...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
jaydoane pushed a commit to branch 3.x
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit 537fd31185142190ff3dc55d707f9d899b455b17
Author: Jay Doane <ja...@apache.org>
AuthorDate: Tue Oct 26 21:24:34 2021 -0700
Use unique ddoc id to prevent collisions
Prevent failures like this from repeated test runs:
mem3_bdu_test:73: mem3_bdu_shard_doc_test_ (t_design_docs_are_not_validated)...*failed*
in function mem3_bdu_test:'-t_design_docs_are_not_validated/1-fun-0-'/1 (test/eunit/mem3_bdu_test.erl, line 206)
in call from mem3_bdu_test:t_design_docs_are_not_validated/1 (test/eunit/mem3_bdu_test.erl, line 206)
in call from eunit_test:run_testfun/1 (eunit_test.erl, line 71)
in call from eunit_proc:run_test/1 (eunit_proc.erl, line 510)
in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 335)
in call from eunit_proc:handle_test/2 (eunit_proc.erl, line 493)
in call from eunit_proc:tests_inorder/3 (eunit_proc.erl, line 435)
in call from eunit_proc:with_timeout/3 (eunit_proc.erl, line 325)
**error:{assertEqual,[{module,mem3_bdu_test},
{line,206},
{expression,"Code"},
{expected,201},
{value,409}]}
output:<<"">>
---
src/mem3/test/eunit/mem3_bdu_test.erl | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/src/mem3/test/eunit/mem3_bdu_test.erl b/src/mem3/test/eunit/mem3_bdu_test.erl
index 27d5783..ad047f6 100644
--- a/src/mem3/test/eunit/mem3_bdu_test.erl
+++ b/src/mem3/test/eunit/mem3_bdu_test.erl
@@ -201,12 +201,14 @@ t_by_range_val_not_array({Top, Db, ShardsDb}) ->
t_design_docs_are_not_validated({Top, _, ShardsDb}) ->
- DDoc = #{<<"_id">> => <<"_design/ddoc_bdu_test">>},
+ Suffix = integer_to_list(erlang:system_time() + rand:uniform(1000)),
+ DDocId = list_to_binary("_design/ddoc_bdu_test-" ++ Suffix),
+ DDoc = #{<<"_id">> => DDocId},
{Code, Res} = req(post, Top ++ ShardsDb, DDoc),
?assertEqual(201, Code),
#{<<"rev">> := Rev} = Res,
Deleted = #{
- <<"id">> => <<"_design/ddoc_bdu_test">>,
+ <<"id">> => DDocId,
<<"_rev">> => Rev,
<<"_deleted">> => true
},