This is an automated email from the ASF dual-hosted git repository. rnewson pushed a commit to branch auto-delete-3 in repository https://gitbox.apache.org/repos/asf/couchdb.git
commit d5d72b94bfbf30723f5908cc04e3beb1b445e802 Author: Robert Newson <[email protected]> AuthorDate: Tue May 13 14:32:42 2025 +0100 crossref before and after split --- src/fabric/src/fabric_drop_seq.erl | 63 +++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 5 deletions(-) diff --git a/src/fabric/src/fabric_drop_seq.erl b/src/fabric/src/fabric_drop_seq.erl index a79f3627b..739356115 100644 --- a/src/fabric/src/fabric_drop_seq.erl +++ b/src/fabric/src/fabric_drop_seq.erl @@ -88,11 +88,11 @@ go(DbName) -> go_int(Shards0, UuidMap, PeerCheckpoints0, ShardSyncHistory) -> Shards1 = fully_replicated_shards_only(Shards0, ShardSyncHistory), - PeerCheckpoints1 = substitute_splits(Shards1, UuidMap, PeerCheckpoints0), - { - Shards1, - calculate_drop_seqs(PeerCheckpoints1, ShardSyncHistory) - }. + PeerCheckpoints1 = crossref(PeerCheckpoints0, ShardSyncHistory), + PeerCheckpoints2 = substitute_splits(Shards1, UuidMap, PeerCheckpoints1), + DropSeqs = calculate_drop_seqs(PeerCheckpoints2, ShardSyncHistory), + + {Shards1, DropSeqs}. -spec calculate_drop_seqs(peer_checkpoints(), shard_sync_history()) -> peer_checkpoints(). @@ -748,6 +748,59 @@ substitute_splits_test() -> substitute_splits(Shards, UuidMap, PeerCheckpoints) ). +crossref_test_() -> + Range = [0, 10], + Node1 = '[email protected]', + Node2 = '[email protected]', + Node3 = '[email protected]', + [ + ?_assertEqual(#{}, crossref(#{}, #{})), + ?_assertEqual( + #{ + {Range, Node1} => {<<"n1">>, 5}, + {Range, Node2} => {<<"n2">>, 4}, + {Range, Node3} => {<<"n3">>, 3} + }, + crossref( + #{{Range, Node1} => {<<"n1">>, 5}}, + #{ + {Range, Node1, Node2} => [ + {<<"n1">>, 10, <<"n2">>, 9}, + {<<"n1">>, 5, <<"n2">>, 4}, + {<<"n1">>, 2, <<"n2">>, 1} + ], + {Range, Node1, Node3} => [ + {<<"n1">>, 9, <<"n3">>, 8}, + {<<"n1">>, 4, <<"n3">>, 3}, + {<<"n1">>, 3, <<"n3">>, 2} + ] + } + ) + ), + ?_assertEqual( + #{ + {Range, Node1} => {<<"n1">>, 5}, + {Range, Node2} => {<<"n2x">>, 4}, + {Range, Node3} => {<<"n3x">>, 3} + }, + crossref( + #{{Range, Node1} => {<<"n1">>, 5}}, + #{ + {Range, Node1, Node2} => [ + {<<"n1x">>, 10, <<"n2x">>, 9}, + {<<"n1x">>, 5, <<"n2x">>, 4}, + {<<"n1x">>, 2, <<"n2x">>, 1} + ], + {Range, Node1, Node3} => [ + {<<"n1x">>, 9, <<"n3x">>, 8}, + {<<"n1x">>, 4, <<"n3x">>, 3}, + {<<"n1x">>, 3, <<"n3x">>, 2} + ] + } + ) + ) + ]. + go_int_test_() -> Range = [0, 10], Subrange1 = [0, 5],
