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  }