github.com/cockroachdb/cockroach@v20.2.0-alpha.1+incompatible/pkg/kv/kvclient/kvcoord/range_iter_test.go (about) 1 // Copyright 2016 The Cockroach Authors. 2 // 3 // Use of this software is governed by the Business Source License 4 // included in the file licenses/BSL.txt. 5 // 6 // As of the Change Date specified in that file, in accordance with 7 // the Business Source License, use of this software will be governed 8 // by the Apache License, Version 2.0, included in the file 9 // licenses/APL.txt. 10 11 package kvcoord 12 13 import ( 14 "context" 15 "reflect" 16 "testing" 17 "time" 18 19 "github.com/cockroachdb/cockroach/pkg/roachpb" 20 "github.com/cockroachdb/cockroach/pkg/rpc" 21 "github.com/cockroachdb/cockroach/pkg/settings/cluster" 22 "github.com/cockroachdb/cockroach/pkg/util/hlc" 23 "github.com/cockroachdb/cockroach/pkg/util/leaktest" 24 "github.com/cockroachdb/cockroach/pkg/util/log" 25 "github.com/cockroachdb/cockroach/pkg/util/stop" 26 "github.com/cockroachdb/cockroach/pkg/util/tracing" 27 ) 28 29 var alphaRangeDescriptors []roachpb.RangeDescriptor 30 var alphaRangeDescriptorDB MockRangeDescriptorDB 31 32 func init() { 33 lastKey := testMetaEndKey 34 for i, b := 0, byte('a'); b <= byte('z'); i, b = i+1, b+1 { 35 key := roachpb.RKey([]byte{b}) 36 alphaRangeDescriptors = append(alphaRangeDescriptors, roachpb.RangeDescriptor{ 37 RangeID: roachpb.RangeID(i + 2), 38 StartKey: lastKey, 39 EndKey: key, 40 InternalReplicas: []roachpb.ReplicaDescriptor{ 41 { 42 NodeID: 1, 43 StoreID: 1, 44 }, 45 }, 46 }) 47 lastKey = key 48 } 49 alphaRangeDescriptorDB = mockRangeDescriptorDBForDescs( 50 append(alphaRangeDescriptors, testMetaRangeDescriptor)..., 51 ) 52 } 53 54 func TestRangeIterForward(t *testing.T) { 55 defer leaktest.AfterTest(t)() 56 stopper := stop.NewStopper() 57 defer stopper.Stop(context.Background()) 58 59 clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) 60 rpcContext := rpc.NewInsecureTestingContext(clock, stopper) 61 g := makeGossip(t, stopper, rpcContext) 62 ds := NewDistSender(DistSenderConfig{ 63 AmbientCtx: log.AmbientContext{Tracer: tracing.NewTracer()}, 64 Clock: clock, 65 RPCContext: rpcContext, 66 RangeDescriptorDB: alphaRangeDescriptorDB, 67 Settings: cluster.MakeTestingClusterSettings(), 68 }, g) 69 70 ctx := context.Background() 71 72 ri := NewRangeIterator(ds) 73 i := 0 74 span := roachpb.RSpan{ 75 Key: testMetaEndKey, 76 EndKey: roachpb.RKey([]byte("z")), 77 } 78 for ri.Seek(ctx, span.Key, Ascending); ri.Valid(); ri.Next(ctx) { 79 if !reflect.DeepEqual(alphaRangeDescriptors[i], *ri.Desc()) { 80 t.Fatalf("%d: expected %v; got %v", i, alphaRangeDescriptors[i], ri.Desc()) 81 } 82 i++ 83 if !ri.NeedAnother(span) { 84 break 85 } 86 } 87 } 88 89 func TestRangeIterSeekForward(t *testing.T) { 90 defer leaktest.AfterTest(t)() 91 stopper := stop.NewStopper() 92 defer stopper.Stop(context.Background()) 93 94 clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) 95 rpcContext := rpc.NewInsecureTestingContext(clock, stopper) 96 g := makeGossip(t, stopper, rpcContext) 97 ds := NewDistSender(DistSenderConfig{ 98 AmbientCtx: log.AmbientContext{Tracer: tracing.NewTracer()}, 99 Clock: clock, 100 RPCContext: rpcContext, 101 RangeDescriptorDB: alphaRangeDescriptorDB, 102 Settings: cluster.MakeTestingClusterSettings(), 103 }, g) 104 105 ctx := context.Background() 106 107 ri := NewRangeIterator(ds) 108 i := 0 109 for ri.Seek(ctx, testMetaEndKey, Ascending); ri.Valid(); { 110 if !reflect.DeepEqual(alphaRangeDescriptors[i], *ri.Desc()) { 111 t.Fatalf("%d: expected %v; got %v", i, alphaRangeDescriptors[i], ri.Desc()) 112 } 113 i += 2 114 // Skip even ranges. 115 nextByte := ri.Desc().EndKey[0] + 1 116 if nextByte >= byte('z') { 117 break 118 } 119 seekKey := roachpb.RKey([]byte{nextByte}) 120 ri.Seek(ctx, seekKey, Ascending) 121 if !ri.Key().Equal(seekKey) { 122 t.Errorf("expected iterator key %s; got %s", seekKey, ri.Key()) 123 } 124 } 125 } 126 127 func TestRangeIterReverse(t *testing.T) { 128 defer leaktest.AfterTest(t)() 129 stopper := stop.NewStopper() 130 defer stopper.Stop(context.Background()) 131 132 clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) 133 rpcContext := rpc.NewInsecureTestingContext(clock, stopper) 134 g := makeGossip(t, stopper, rpcContext) 135 ds := NewDistSender(DistSenderConfig{ 136 AmbientCtx: log.AmbientContext{Tracer: tracing.NewTracer()}, 137 Clock: clock, 138 RPCContext: rpcContext, 139 RangeDescriptorDB: alphaRangeDescriptorDB, 140 Settings: cluster.MakeTestingClusterSettings(), 141 }, g) 142 143 ctx := context.Background() 144 145 ri := NewRangeIterator(ds) 146 i := len(alphaRangeDescriptors) - 1 147 span := roachpb.RSpan{ 148 Key: testMetaEndKey, 149 EndKey: roachpb.RKey([]byte{'z'}), 150 } 151 for ri.Seek(ctx, span.EndKey, Descending); ri.Valid(); ri.Next(ctx) { 152 if !reflect.DeepEqual(alphaRangeDescriptors[i], *ri.Desc()) { 153 t.Fatalf("%d: expected %v; got %v", i, alphaRangeDescriptors[i], ri.Desc()) 154 } 155 i-- 156 if !ri.NeedAnother(span) { 157 break 158 } 159 } 160 } 161 162 func TestRangeIterSeekReverse(t *testing.T) { 163 defer leaktest.AfterTest(t)() 164 stopper := stop.NewStopper() 165 defer stopper.Stop(context.Background()) 166 167 clock := hlc.NewClock(hlc.UnixNano, time.Nanosecond) 168 rpcContext := rpc.NewInsecureTestingContext(clock, stopper) 169 g := makeGossip(t, stopper, rpcContext) 170 ds := NewDistSender(DistSenderConfig{ 171 AmbientCtx: log.AmbientContext{Tracer: tracing.NewTracer()}, 172 Clock: clock, 173 RPCContext: rpcContext, 174 RangeDescriptorDB: alphaRangeDescriptorDB, 175 Settings: cluster.MakeTestingClusterSettings(), 176 }, g) 177 178 ctx := context.Background() 179 180 ri := NewRangeIterator(ds) 181 i := len(alphaRangeDescriptors) - 1 182 for ri.Seek(ctx, roachpb.RKey([]byte{'z'}), Descending); ri.Valid(); { 183 if !reflect.DeepEqual(alphaRangeDescriptors[i], *ri.Desc()) { 184 t.Fatalf("%d: expected %v; got %v", i, alphaRangeDescriptors[i], ri.Desc()) 185 } 186 i -= 2 187 // Skip every other range. 188 nextByte := ri.Desc().StartKey[0] - 1 189 if nextByte <= byte('a') { 190 break 191 } 192 seekKey := roachpb.RKey([]byte{nextByte}) 193 ri.Seek(ctx, seekKey, Descending) 194 if !ri.Key().Equal(seekKey) { 195 t.Errorf("expected iterator key %s; got %s", seekKey, ri.Key()) 196 } 197 } 198 }