@@ -23,9 +23,10 @@ import (
2323 "github.com/stretchr/testify/require"
2424)
2525
26- // TestIterateRangeIDKeys lays down a number of tombstones (at keys.RangeTombstoneKey) interspersed
27- // with other irrelevant keys (both chosen randomly). It then verifies that iterateRangeIDKeys
28- // correctly returns only the relevant keys and values.
26+ // TestIterateRangeIDKeys lays down a number of RangeTombstone and ReplicaID
27+ // keys (at keys.RangeTombstoneKey and keys.RaftReplicaIDKey) interspersed with
28+ // other irrelevant keys (both chosen randomly). It then verifies that
29+ // iterateRangeIDKeys correctly returns only the relevant keys and values.
2930func TestIterateRangeIDKeys (t * testing.T ) {
3031 defer leaktest .AfterTest (t )()
3132 defer log .Scope (t ).Close (t )
@@ -54,6 +55,9 @@ func TestIterateRangeIDKeys(t *testing.T) {
5455 rangeIDFn := func () roachpb.RangeID {
5556 return 1 + roachpb .RangeID (rng .Intn (10 * rangeCount )) // spread rangeIDs out
5657 }
58+ toss := func (x , outOf int ) bool {
59+ return rng .Intn (outOf ) < x
60+ }
5761
5862 // Write a number of keys that should be irrelevant to the iteration in this test.
5963 for i := 0 ; i < rangeCount ; i ++ {
@@ -74,25 +78,40 @@ func TestIterateRangeIDKeys(t *testing.T) {
7478 type seenT struct {
7579 rangeID roachpb.RangeID
7680 tombstone kvserverpb.RangeTombstone
81+ replicaID kvserverpb.RaftReplicaID
7782 }
7883
7984 // Next, write the keys we're planning to see again.
8085 wanted := make ([]seenT , 0 , rangeCount )
8186 for used := make (map [roachpb.RangeID ]struct {}); len (wanted ) < rangeCount ; {
8287 rangeID := rangeIDFn ()
8388 if _ , ok := used [rangeID ]; ok {
84- // We already wrote this key , so roll the dice again.
89+ // We already wrote this RangeID , so roll the dice again.
8590 continue
8691 }
8792 used [rangeID ] = struct {}{}
8893
89- tombstone := kvserverpb.RangeTombstone {
90- NextReplicaID : roachpb .ReplicaID (rng .Int31n (100 )),
94+ // Write one or both keys, each combination with 1/3 chance.
95+ writeTombstone := toss (2 , 3 ) // p == 2/3
96+ writeReplicaID := ! writeTombstone || toss (1 , 2 ) // p == 2/3
97+
98+ sl := MakeStateLoader (rangeID )
99+ written := seenT {rangeID : rangeID }
100+ if writeTombstone {
101+ written .tombstone = kvserverpb.RangeTombstone {
102+ NextReplicaID : roachpb .ReplicaID (rng .Int31n (100 )),
103+ }
104+ t .Logf ("writing tombstone at rangeID=%d" , rangeID )
105+ require .NoError (t , sl .SetRangeTombstone (ctx , eng , written .tombstone ))
106+ }
107+ if writeReplicaID {
108+ id := roachpb .ReplicaID (rng .Int31n (100 ))
109+ written .replicaID = kvserverpb.RaftReplicaID {ReplicaID : id }
110+ t .Logf ("writing ReplicaID at rangeID=%d" , rangeID )
111+ require .NoError (t , sl .SetRaftReplicaID (ctx , eng , id ))
91112 }
92- wanted = append (wanted , seenT {rangeID : rangeID , tombstone : tombstone })
93113
94- t .Logf ("writing tombstone at rangeID=%d" , rangeID )
95- require .NoError (t , MakeStateLoader (rangeID ).SetRangeTombstone (ctx , eng , tombstone ))
114+ wanted = append (wanted , written )
96115 }
97116
98117 sort .Slice (wanted , func (i , j int ) bool {
@@ -102,10 +121,17 @@ func TestIterateRangeIDKeys(t *testing.T) {
102121 var seen []seenT
103122 require .NoError (t , iterateRangeIDKeys (ctx , eng , func (id roachpb.RangeID , get readKeyFn ) error {
104123 var tombstone kvserverpb.RangeTombstone
105- if ok , err := get (keys .RangeTombstoneKey (id ), & tombstone ); err != nil {
124+ foundTS , err := get (keys .RangeTombstoneKey (id ), & tombstone )
125+ if err != nil {
106126 return err
107- } else if ok {
108- seen = append (seen , seenT {rangeID : id , tombstone : tombstone })
127+ }
128+ var replicaID kvserverpb.RaftReplicaID
129+ foundID , err := get (keys .RaftReplicaIDKey (id ), & replicaID )
130+ if err != nil {
131+ return err
132+ }
133+ if foundTS || foundID {
134+ seen = append (seen , seenT {rangeID : id , tombstone : tombstone , replicaID : replicaID })
109135 }
110136 return nil
111137 }))
0 commit comments