Skip to content

Commit

Permalink
Merge #92131
Browse files Browse the repository at this point in the history
92131: sql: support crdb_internal.ranges{_no_leases} for secondary tenants r=knz,arulajmani a=ecwall

This PR makes crdb_internal.ranges{_no_leases} and SHOW RANGES
work for secondary tenants.
    
Release note (sql change): crdb_internal.ranges{_no_leases} and
SHOW RANGES statements now work on secondary tenants.

Epic: CRDB-14522

Co-authored-by: Evan Wall <wall@cockroachlabs.com>
  • Loading branch information
craig[bot] and ecwall committed Dec 6, 2022
2 parents c79c663 + 5617565 commit 1f50a93
Show file tree
Hide file tree
Showing 7 changed files with 125 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func TestScanRangeDescriptors(t *testing.T) {
})
require.NoError(t, err)

//Split some ranges within tenant2 that we'll scan over.
// Split some ranges within tenant2 that we'll scan over.
ten2Codec := keys.MakeSQLCodec(ten2ID)
ten2Split1 := append(ten2Codec.TenantPrefix(), 'a')
ten2Split2 := append(ten2Codec.TenantPrefix(), 'b')
Expand All @@ -57,10 +57,7 @@ func TestScanRangeDescriptors(t *testing.T) {
}

iteratorFactory := tenant2.RangeDescIteratorFactory().(rangedesc.IteratorFactory)
iter, err := iteratorFactory.NewIterator(ctx, roachpb.Span{
Key: ten2Codec.TenantPrefix(),
EndKey: ten2Codec.TenantPrefix().PrefixEnd(),
})
iter, err := iteratorFactory.NewIterator(ctx, ten2Codec.TenantSpan())
require.NoError(t, err)

var rangeDescs []roachpb.RangeDescriptor
Expand Down
12 changes: 8 additions & 4 deletions pkg/ccl/logictestccl/testdata/logic_test/crdb_internal_tenant
Original file line number Diff line number Diff line change
Expand Up @@ -301,11 +301,15 @@ SELECT * FROM crdb_internal.node_inflight_trace_spans WHERE span_id < 0
----
trace_id parent_span_id span_id goroutine_id finished start_time duration operation

statement error not fully contained in tenant keyspace
SELECT * FROM crdb_internal.ranges WHERE range_id < 0
query ITTI
SELECT range_id, start_pretty, end_pretty, lease_holder FROM crdb_internal.ranges
----
55 /Tenant/10 /Max 1

statement error not fully contained in tenant keyspace
SELECT * FROM crdb_internal.ranges_no_leases WHERE range_id < 0
query ITT
SELECT range_id, start_pretty, end_pretty FROM crdb_internal.ranges_no_leases
----
55 /Tenant/10 /Max

query IT
SELECT zone_id, target FROM crdb_internal.zones ORDER BY 1
Expand Down
6 changes: 6 additions & 0 deletions pkg/keys/sql.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,12 @@ func (e sqlEncoder) TenantPrefix() roachpb.Key {
return *e.buf
}

// TenantPrefix returns the key prefix used for the tenants's data.
func (e sqlEncoder) TenantSpan() roachpb.Span {
key := *e.buf
return roachpb.Span{Key: key, EndKey: key.PrefixEnd()}
}

// TablePrefix returns the key prefix used for the table's data.
func (e sqlEncoder) TablePrefix(tableID uint32) roachpb.Key {
k := e.TenantPrefix()
Expand Down
46 changes: 19 additions & 27 deletions pkg/sql/crdb_internal.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,6 @@ import (
"github.com/cockroachdb/cockroach/pkg/jobs/jobspb"
"github.com/cockroachdb/cockroach/pkg/keys"
"github.com/cockroachdb/cockroach/pkg/kv"
"github.com/cockroachdb/cockroach/pkg/kv/kvclient"
"github.com/cockroachdb/cockroach/pkg/kv/kvclient/kvcoord"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/concurrency/lock"
"github.com/cockroachdb/cockroach/pkg/kv/kvserver/liveness/livenesspb"
Expand Down Expand Up @@ -3660,34 +3659,27 @@ CREATE TABLE crdb_internal.ranges_no_leases (
if !hasPermission {
return nil, nil, pgerror.Newf(pgcode.InsufficientPrivilege, "only users with the ZONECONFIG privilege or the admin role can read crdb_internal.ranges_no_leases")
}
ranges, err := kvclient.ScanMetaKVs(ctx, p.txn, roachpb.Span{
Key: keys.MinKey,
EndKey: keys.MaxKey,
})

execCfg := p.ExecCfg()
rangeDescIterator, err := execCfg.RangeDescIteratorFactory.NewIterator(ctx, execCfg.Codec.TenantSpan())
if err != nil {
return nil, nil, err
}

var desc roachpb.RangeDescriptor

i := 0

return func() (tree.Datums, error) {
if i >= len(ranges) {
if !rangeDescIterator.Valid() {
return nil, nil
}

r := ranges[i]
i++
rangeDesc := rangeDescIterator.CurRangeDescriptor()

if err := r.ValueProto(&desc); err != nil {
return nil, err
}
rangeDescIterator.Next()

replicas := rangeDesc.Replicas()
votersAndNonVoters := append([]roachpb.ReplicaDescriptor(nil),
desc.Replicas().VoterAndNonVoterDescriptors()...)
replicas.VoterAndNonVoterDescriptors()...)
var learnerReplicaStoreIDs []int
for _, rd := range desc.Replicas().LearnerDescriptors() {
for _, rd := range replicas.LearnerDescriptors() {
learnerReplicaStoreIDs = append(learnerReplicaStoreIDs, int(rd.StoreID))
}
sort.Slice(votersAndNonVoters, func(i, j int) bool {
Expand All @@ -3701,13 +3693,13 @@ CREATE TABLE crdb_internal.ranges_no_leases (
}
}
votersArr := tree.NewDArray(types.Int)
for _, replica := range desc.Replicas().VoterDescriptors() {
for _, replica := range replicas.VoterDescriptors() {
if err := votersArr.Append(tree.NewDInt(tree.DInt(replica.StoreID))); err != nil {
return nil, err
}
}
nonVotersArr := tree.NewDArray(types.Int)
for _, replica := range desc.Replicas().NonVoterDescriptors() {
for _, replica := range replicas.NonVoterDescriptors() {
if err := nonVotersArr.Append(tree.NewDInt(tree.DInt(replica.StoreID))); err != nil {
return nil, err
}
Expand All @@ -3732,21 +3724,21 @@ CREATE TABLE crdb_internal.ranges_no_leases (
}

tableID, dbName, schemaName, tableName, indexName := lookupNamesByKey(
p, desc.StartKey.AsRawKey(), dbNames, tableNames, schemaNames,
p, rangeDesc.StartKey.AsRawKey(), dbNames, tableNames, schemaNames,
indexNames, schemaParents, parents,
)

splitEnforcedUntil := tree.DNull
if !desc.StickyBit.IsEmpty() {
splitEnforcedUntil = eval.TimestampToInexactDTimestamp(desc.StickyBit)
if !rangeDesc.StickyBit.IsEmpty() {
splitEnforcedUntil = eval.TimestampToInexactDTimestamp(rangeDesc.StickyBit)
}

return tree.Datums{
tree.NewDInt(tree.DInt(desc.RangeID)),
tree.NewDBytes(tree.DBytes(desc.StartKey)),
tree.NewDString(keys.PrettyPrint(nil /* valDirs */, desc.StartKey.AsRawKey())),
tree.NewDBytes(tree.DBytes(desc.EndKey)),
tree.NewDString(keys.PrettyPrint(nil /* valDirs */, desc.EndKey.AsRawKey())),
tree.NewDInt(tree.DInt(rangeDesc.RangeID)),
tree.NewDBytes(tree.DBytes(rangeDesc.StartKey)),
tree.NewDString(keys.PrettyPrint(nil /* valDirs */, rangeDesc.StartKey.AsRawKey())),
tree.NewDBytes(tree.DBytes(rangeDesc.EndKey)),
tree.NewDString(keys.PrettyPrint(nil /* valDirs */, rangeDesc.EndKey.AsRawKey())),
tree.NewDInt(tree.DInt(tableID)),
tree.NewDString(dbName),
tree.NewDString(schemaName),
Expand Down
Loading

0 comments on commit 1f50a93

Please sign in to comment.