@@ -541,12 +541,19 @@ func generateAndValidateNewTargets(
541
541
(initialScanType == `only` && originalInitialScanOnlyOption )
542
542
543
543
// TODO(#142376): Audit whether this list is generated correctly.
544
- var existingTargetIDs []descpb. ID
544
+ var existingTargetSpanIDs []spanID
545
545
for _ , targetDesc := range newTableDescs {
546
- existingTargetIDs = append (existingTargetIDs , targetDesc .GetID ())
546
+ tableDesc , ok := targetDesc .(catalog.TableDescriptor )
547
+ if ! ok {
548
+ return nil , nil , hlc.Timestamp {}, nil , errors .AssertionFailedf ("expected table descriptor" )
549
+ }
550
+ existingTargetSpanIDs = append (existingTargetSpanIDs , spanID {
551
+ tableID : tableDesc .GetID (),
552
+ indexID : tableDesc .GetPrimaryIndexID (),
553
+ })
547
554
}
548
- existingTargetSpans := fetchSpansForDescs (p , existingTargetIDs )
549
- var newTargetIDs []descpb. ID
555
+ existingTargetSpans := fetchSpansForDescs (p , existingTargetSpanIDs )
556
+ var addedTargetSpanIDs []spanID
550
557
for _ , target := range v .Targets {
551
558
desc , found , err := getTargetDesc (ctx , p , descResolver , target .TableName )
552
559
if err != nil {
@@ -563,10 +570,17 @@ func generateAndValidateNewTargets(
563
570
k := targetKey {TableID : desc .GetID (), FamilyName : target .FamilyName }
564
571
newTargets [k ] = target
565
572
newTableDescs [desc .GetID ()] = desc
566
- newTargetIDs = append (newTargetIDs , k .TableID )
573
+ tableDesc , ok := desc .(catalog.TableDescriptor )
574
+ if ! ok {
575
+ return nil , nil , hlc.Timestamp {}, nil , errors .AssertionFailedf ("expected table descriptor" )
576
+ }
577
+ addedTargetSpanIDs = append (addedTargetSpanIDs , spanID {
578
+ tableID : tableDesc .GetID (),
579
+ indexID : tableDesc .GetPrimaryIndexID (),
580
+ })
567
581
}
568
582
569
- addedTargetSpans := fetchSpansForDescs (p , newTargetIDs )
583
+ addedTargetSpans := fetchSpansForDescs (p , addedTargetSpanIDs )
570
584
571
585
// By default, we will not perform an initial scan on newly added
572
586
// targets. Hence, the user must explicitly state that they want an
@@ -632,13 +646,18 @@ func generateAndValidateNewTargets(
632
646
for k := range newTargets {
633
647
addedTargets [k .TableID ] = struct {}{}
634
648
}
635
- droppedIDs := make ([]descpb. ID , 0 , len (droppedTargets ))
649
+ droppedSpanIDs := make ([]spanID , 0 , len (droppedTargets ))
636
650
for k := range droppedTargets {
637
651
if _ , wasAdded := addedTargets [k .TableID ]; ! wasAdded {
638
- droppedIDs = append (droppedIDs , k .TableID )
652
+ // For dropped tables, we might not have the desc anymore so
653
+ // we can't get the index ID. In any case, it's safe to wipe
654
+ // out the entire table span.
655
+ droppedSpanIDs = append (droppedSpanIDs , spanID {
656
+ tableID : k .TableID ,
657
+ })
639
658
}
640
659
}
641
- droppedTargetSpans := fetchSpansForDescs (p , droppedIDs )
660
+ droppedTargetSpans := fetchSpansForDescs (p , droppedSpanIDs )
642
661
if err := removeSpansFromProgress (newJobProgress , droppedTargetSpans ); err != nil {
643
662
return nil , nil , hlc.Timestamp {}, nil , err
644
663
}
@@ -874,19 +893,33 @@ func getSpanLevelCheckpointFromProgress(
874
893
return changefeedProgress .SpanLevelCheckpoint , nil
875
894
}
876
895
877
- func fetchSpansForDescs (p sql.PlanHookState , descIDs []descpb.ID ) (primarySpans []roachpb.Span ) {
878
- seen := make (map [descpb.ID ]struct {})
896
+ type spanID struct {
897
+ tableID descpb.ID
898
+ indexID descpb.IndexID
899
+ }
900
+
901
+ func fetchSpansForDescs (p sql.PlanHookState , spanIDs []spanID ) (primarySpans []roachpb.Span ) {
902
+ seen := make (map [spanID ]struct {})
879
903
codec := p .ExtendedEvalContext ().Codec
880
- for _ , id := range descIDs {
904
+ for _ , id := range spanIDs {
881
905
if _ , isDup := seen [id ]; isDup {
882
906
continue
883
907
}
884
908
seen [id ] = struct {}{}
885
- tablePrefix := codec .TablePrefix (uint32 (id ))
886
- primarySpan := roachpb.Span {
887
- Key : tablePrefix ,
888
- EndKey : tablePrefix .PrefixEnd (),
889
- }
909
+ primarySpan := func () roachpb.Span {
910
+ if id .indexID == 0 {
911
+ tablePrefix := codec .TablePrefix (uint32 (id .tableID ))
912
+ return roachpb.Span {
913
+ Key : tablePrefix ,
914
+ EndKey : tablePrefix .PrefixEnd (),
915
+ }
916
+ }
917
+ indexPrefix := codec .IndexPrefix (uint32 (id .tableID ), uint32 (id .indexID ))
918
+ return roachpb.Span {
919
+ Key : indexPrefix ,
920
+ EndKey : indexPrefix .PrefixEnd (),
921
+ }
922
+ }()
890
923
primarySpans = append (primarySpans , primarySpan )
891
924
}
892
925
return primarySpans
0 commit comments