summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJay Doane <jaydoane@apache.org>2020-02-18 21:40:32 -0800
committerPaul J. Davis <paul.joseph.davis@gmail.com>2020-03-02 12:26:22 -0600
commit42062b6b2de1e00f41a9ba528653d2f06fcc62f9 (patch)
tree9d8859630aeb4c541254db029202db85ba80335d
parent47b6b3378221ed52a71469826bd87eca98010fc0 (diff)
downloadcouchdb-42062b6b2de1e00f41a9ba528653d2f06fcc62f9.tar.gz
Add fdb_to_revinfo compatibility with 5-tuple Val
Currently, a 5-tuple `Val` parameter crashes fdb_to_revinfo with a function_clause error. This adds a compatible function clause, and also a catchall clause to log an error and throw an informative exception.
-rw-r--r--src/fabric/src/fabric2_fdb.erl26
-rw-r--r--src/fabric/test/fabric2_db_misc_tests.erl37
2 files changed, 62 insertions, 1 deletions
diff --git a/src/fabric/src/fabric2_fdb.erl b/src/fabric/src/fabric2_fdb.erl
index e51b8de5d..c18122533 100644
--- a/src/fabric/src/fabric2_fdb.erl
+++ b/src/fabric/src/fabric2_fdb.erl
@@ -38,6 +38,8 @@
incr_stat/3,
incr_stat/4,
+ fdb_to_revinfo/2,
+
get_all_revs/2,
get_winning_revs/3,
get_winning_revs_future/3,
@@ -1253,6 +1255,21 @@ fdb_to_revinfo(Key, {?CURR_REV_FORMAT, _, _, _, _, _} = Val) ->
rev_size => RevSize
};
+fdb_to_revinfo(Key, {?CURR_REV_FORMAT, _, _, _, _} = Val) ->
+ {?DB_REVS, _DocId, NotDeleted, RevPos, Rev} = Key,
+ {_RevFormat, Sequence, RevSize, RevPath, AttHash} = Val,
+ #{
+ winner => true,
+ exists => true,
+ deleted => not NotDeleted,
+ rev_id => {RevPos, Rev},
+ rev_path => tuple_to_list(RevPath),
+ sequence => Sequence,
+ branch_count => undefined,
+ att_hash => AttHash,
+ rev_size => RevSize
+ };
+
fdb_to_revinfo(Key, {?CURR_REV_FORMAT, _, _, _} = Val) ->
{?DB_REVS, _DocId, NotDeleted, RevPos, Rev} = Key,
{_RevFormat, RevPath, AttHash, RevSize} = Val,
@@ -1282,7 +1299,14 @@ fdb_to_revinfo(Key, {1, Seq, BCount, RPath, AttHash}) ->
fdb_to_revinfo(Key, {1, RPath, AttHash}) ->
Val = {?CURR_REV_FORMAT, RPath, AttHash, 0},
- fdb_to_revinfo(Key, Val).
+ fdb_to_revinfo(Key, Val);
+
+fdb_to_revinfo(Key, Val) ->
+ couch_log:error(
+ "~p:fdb_to_revinfo unsupported val format "
+ "rev_format=~p key_size=~p val_size=~p",
+ [?MODULE, element(1, Val), tuple_size(Key), tuple_size(Val)]),
+ throw({unsupported_data_format, fdb_to_revinfo_val}).
doc_to_fdb(Db, #doc{} = Doc) ->
diff --git a/src/fabric/test/fabric2_db_misc_tests.erl b/src/fabric/test/fabric2_db_misc_tests.erl
index 42a63e2f9..7c88b4ac4 100644
--- a/src/fabric/test/fabric2_db_misc_tests.erl
+++ b/src/fabric/test/fabric2_db_misc_tests.erl
@@ -333,3 +333,40 @@ db_version_bump({DbName, _, _}) ->
% Check that db handle in the cache got the new metadata version
?assertMatch(#{db_version := NewDbVersion}, Db2).
+
+
+fdb_to_revinfo_test_() ->
+ {
+ "Test fdb_to_revinfo compatibility",
+ {
+ setup,
+ fun() -> ok end,
+ fun(_) -> ok end,
+ with([
+ ?TDEF(fdb_to_revinfo)
+ ])
+ }
+ }.
+
+
+fdb_to_revinfo(_) ->
+ Sequence = {versionstamp, 10873034897377, 0, 0},
+ Rev = <<60,84,174,140,210,120,192,18,100,148,9,181,129,165,248,92>>,
+ Key = {20, <<"d491280e-feab-42ce-909e-a7287d7b078-bluemix">>, true, 1, Rev},
+ FiveTupleVal = {2, Sequence, 1, {}, <<>>},
+ Expect = #{
+ att_hash => <<>>,
+ branch_count => undefined,
+ deleted => false,
+ exists => true,
+ rev_id =>
+ {1, <<60,84,174,140,210,120,192,18,100,148,9,181,129,165,248,92>>},
+ rev_path => [],
+ rev_size => 1,
+ sequence => Sequence,
+ winner => true
+ },
+ ?assertEqual(Expect, fabric2_fdb:fdb_to_revinfo(Key, FiveTupleVal)),
+ ?assertThrow({unsupported_data_format, fdb_to_revinfo_val},
+ fabric2_fdb:fdb_to_revinfo({bad}, {input})),
+ ok.