You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@couchdb.apache.org by va...@apache.org on 2022/09/15 20:46:02 UTC
[couchdb] 01/01: Remove the long deprecated bigcouch 0.4 change sequence support
This is an automated email from the ASF dual-hosted git repository.
vatamane pushed a commit to branch remove-long-deprecated-bigcouch-sequences
in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit c03d6d31441363bfe5fe4883bdf4ba4bdd683a55
Author: Nick Vatamaniuc <va...@gmail.com>
AuthorDate: Thu Sep 15 16:34:22 2022 -0400
Remove the long deprecated bigcouch 0.4 change sequence support
We always ran a regex match for it, then failed, and tried the regular pattern.
Regexes are pretty fast (15-30 micorseconds on my laptop), but it's still a
waste of resources. For comparison a `config:get/3` is about microsecond, so
it's like needlessly performing 10 extra config lookup per `_changes` feed
request.
Improve unit tests by having more cases and one test per case.
Remove unrechable `"now"` clause in `validate_start_seq/2`. By that point
`get_start_seq/2` should have transformed `"now"` into a proper sequence so
it's confusing validating that case as passing. At that point it should be
considered a failure, which is what one of the new unit tests checks for.
---
src/fabric/src/fabric_view_changes.erl | 192 +++++++++++++++++++--------------
1 file changed, 110 insertions(+), 82 deletions(-)
diff --git a/src/fabric/src/fabric_view_changes.erl b/src/fabric/src/fabric_view_changes.erl
index b561da151..0ee996df7 100644
--- a/src/fabric/src/fabric_view_changes.erl
+++ b/src/fabric/src/fabric_view_changes.erl
@@ -24,7 +24,6 @@
-include_lib("fabric/include/fabric.hrl").
-include_lib("mem3/include/mem3.hrl").
-include_lib("couch/include/couch_db.hrl").
--include_lib("eunit/include/eunit.hrl").
-import(fabric_db_update_listener, [wait_db_updated/1]).
@@ -431,16 +430,10 @@ seq({Seq, _Uuid}) -> Seq;
seq(Seq) -> Seq.
unpack_seq_regex_match(Packed) ->
- NewPattern = "^\\[[0-9]+\s*,\s*\"(?<opaque>.*)\"\\]$",
- OldPattern = "^\"?([0-9]+-)?(?<opaque>.*?)\"?$",
+ Pattern = "^\"?([0-9]+-)?(?<opaque>.*?)\"?$",
Options = [{capture, [opaque], binary}],
- case re:run(Packed, NewPattern, Options) of
- {match, Match} ->
- Match;
- nomatch ->
- {match, Match} = re:run(Packed, OldPattern, Options),
- Match
- end.
+ {match, Match} = re:run(Packed, Pattern, Options),
+ Match.
unpack_seq_decode_term(Opaque) ->
binary_to_term(couch_util:decodeBase64Url(Opaque)).
@@ -464,9 +457,6 @@ unpack_seqs(0, DbName) ->
fabric_dict:init(mem3:shards(DbName), 0);
unpack_seqs("0", DbName) ->
fabric_dict:init(mem3:shards(DbName), 0);
-% deprecated
-unpack_seqs([_SeqNum, Opaque], DbName) ->
- do_unpack_seqs(Opaque, DbName);
unpack_seqs(Packed, DbName) ->
Opaque = unpack_seq_regex_match(Packed),
do_unpack_seqs(Opaque, DbName).
@@ -758,21 +748,14 @@ make_split_seq({Num, Uuid, Node}, RepCount) when RepCount > 1 ->
make_split_seq(Seq, _) ->
Seq.
-validate_start_seq(_DbName, "now") ->
- ok;
validate_start_seq(_DbName, 0) ->
ok;
validate_start_seq(_DbName, "0") ->
ok;
-validate_start_seq(_DbName, Seq) ->
+validate_start_seq(_DbName, Seq) when is_list(Seq) orelse is_binary(Seq) ->
try
- case Seq of
- [_SeqNum, Opaque] ->
- unpack_seq_decode_term(Opaque);
- Seq ->
- Opaque = unpack_seq_regex_match(Seq),
- unpack_seq_decode_term(Opaque)
- end,
+ Opaque = unpack_seq_regex_match(Seq),
+ unpack_seq_decode_term(Opaque),
ok
catch
_:_ ->
@@ -792,10 +775,17 @@ get_changes_epoch() ->
increment_changes_epoch() ->
application:set_env(fabric, changes_epoch, os:timestamp()).
+-ifdef(TEST).
+
+-include_lib("eunit/include/eunit.hrl").
+
+-define(TDEF(Name), {atom_to_list(Name), fun Name/0}).
+
unpack_seq_setup() ->
meck:new(mem3),
meck:new(fabric_view),
meck:expect(mem3, get_shard, fun(_, _, _) -> {ok, #shard{}} end),
+ meck:expect(mem3, shards, fun(_) -> [#shard{}] end),
meck:expect(fabric_ring, is_progress_possible, fun(_) -> true end),
ok.
@@ -805,75 +795,111 @@ unpack_seqs_test_() ->
fun unpack_seq_setup/0,
fun(_) -> meck:unload() end,
[
- t_unpack_seqs()
+ ?TDEF(t_full_seq),
+ ?TDEF(t_full_seq_quoted),
+ ?TDEF(t_full_seq_with_hyphen),
+ ?TDEF(t_full_seq_quoted_with_hyphen),
+ ?TDEF(t_no_numeric_prefix),
+ ?TDEF(t_zero_seq_int),
+ ?TDEF(t_zero_seq_string),
+ ?TDEF(t_fail_now),
+ ?TDEF(t_fail_numeric_int),
+ ?TDEF(t_fail_numeric_string),
+ ?TDEF(t_fail_numeric_string_quoted),
+ ?TDEF(t_fail_empty_string),
+ ?TDEF(t_fail_empty_string_quoted),
+ ?TDEF(t_fail_random_junk),
+ ?TDEF(t_fail_old_bigcouch_term),
+ ?TDEF(t_fail_old_bigcouch_string)
]
}.
-t_unpack_seqs() ->
- ?_test(begin
- % BigCouch 0.3 style.
- assert_shards(
- "23423-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA"
- ),
+t_full_seq() ->
+ assert_shards(
+ "23423-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
+ "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
+ "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA"
+ ).
- % BigCouch 0.4 style.
- assert_shards([
- 23423,
- <<
- "g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA"
- >>
- ]),
-
- % BigCouch 0.4 style (as string).
- assert_shards(
- "[23423,\"g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\"]"
- ),
- assert_shards(
- "[23423 ,\"g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\"]"
- ),
- assert_shards(
- "[23423, \"g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\"]"
- ),
- assert_shards(
- "[23423 , \"g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
- "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\"]"
- ),
+t_full_seq_quoted() ->
+ assert_shards(
+ "\"23423-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
+ "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
+ "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\""
+ ).
- % with internal hypen
- assert_shards(
- "651-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwNDLXMwBCwxygOFMiQ"
- "5L8____sxJTcalIUgCSSfZgReE4FTmAFMWDFYXgVJQAUlQPVuSKS1EeC5BkaABSQHXz8"
- "VgJUbgAonB_VqIPfoUHIArvE7T6AUQh0I1-WQAzp1XB"
- ),
- assert_shards([
- 651,
- "g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwNDLXMwBCwxygOFMiQ"
- "5L8____sxJTcalIUgCSSfZgReE4FTmAFMWDFYXgVJQAUlQPVuSKS1EeC5BkaABSQHXz8"
- "VgJUbgAonB_VqIPfoUHIArvE7T6AUQh0I1-WQAzp1XB"
- ]),
-
- % CouchDB 1.2 style
- assert_shards(
- "\"23423-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
+t_full_seq_with_hyphen() ->
+ assert_shards(
+ "651-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwNDLXMwBCwxygOFMiQ"
+ "5L8____sxJTcalIUgCSSfZgReE4FTmAFMWDFYXgVJQAUlQPVuSKS1EeC5BkaABSQHXz8"
+ "VgJUbgAonB_VqIPfoUHIArvE7T6AUQh0I1-WQAzp1XB"
+ ).
+
+t_full_seq_quoted_with_hyphen() ->
+ assert_shards(
+ "\"651-g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwNDLXMwBCwxygOFMiQ"
+ "5L8____sxJTcalIUgCSSfZgReE4FTmAFMWDFYXgVJQAUlQPVuSKS1EeC5BkaABSQHXz8"
+ "VgJUbgAonB_VqIPfoUHIArvE7T6AUQh0I1-WQAzp1XB\""
+ ).
+
+t_no_numeric_prefix() ->
+ assert_shards(
+ "g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
+ "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
+ "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA"
+ ).
+
+t_zero_seq_int() ->
+ assert_shards(0).
+
+t_zero_seq_string() ->
+ assert_shards("0").
+
+t_fail_now() ->
+ % "now" should have been transformed into a sequence in get_start_seq/2
+ fail("now").
+
+t_fail_numeric_int() ->
+ fail(1234).
+
+t_fail_numeric_string() ->
+ fail("1234").
+
+t_fail_numeric_string_quoted() ->
+ fail("\"1234\"").
+
+t_fail_empty_string() ->
+ fail("").
+
+t_fail_empty_string_quoted() ->
+ fail("\"\"").
+
+t_fail_random_junk() ->
+ fail("randomjunk").
+
+t_fail_old_bigcouch_term() ->
+ fail([
+ 23423,
+ <<
+ "g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
"LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
- "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\""
- )
- end).
+ "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA"
+ >>
+ ]).
+
+t_fail_old_bigcouch_string() ->
+ fail(
+ "[23423,\"g1AAAAE7eJzLYWBg4MhgTmHgS0ktM3QwND"
+ "LXMwBCwxygOFMiQ5L8____sxIZcKlIUgCSSfZgRUw4FTmAFMWDFTHiVJQAUlSPX1Ee"
+ "C5BkaABSQHXzsxKZ8StcAFG4H4_bIAoPQBTeJ2j1A4hCUJBkAQC7U1NA\"]"
+ ).
assert_shards(Packed) ->
?assertMatch([{#shard{}, _} | _], unpack_seqs(Packed, <<"foo">>)).
+fail(Packed) ->
+ ?assertError(badarg, unpack_seqs(Packed, <<"foo">>)).
+
find_replacements_test() ->
% None of the workers are in the live list of shard but there is a
% replacement on n3 for the full range. It should get picked instead of
@@ -1040,3 +1066,5 @@ find_replacement_sequence_test() ->
Dead4 = mk_workers(Shards, {replace, 'n1', Uuid, 45}),
?assertEqual(0, find_replacement_sequence(Dead4, [0, 10])),
?assertEqual(0, find_replacement_sequence(Dead4, [0, 5])).
+
+-endif.