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],

Reply via email to