@@ -37,6 +37,8 @@ import (
37
37
"github.com/cockroachdb/cockroach/pkg/sql/rowenc"
38
38
"github.com/cockroachdb/cockroach/pkg/sql/rowinfra"
39
39
"github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scexec"
40
+ "github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scop"
41
+ "github.com/cockroachdb/cockroach/pkg/sql/schemachanger/scplan"
40
42
"github.com/cockroachdb/cockroach/pkg/sql/sem/catid"
41
43
"github.com/cockroachdb/cockroach/pkg/sql/sem/idxtype"
42
44
"github.com/cockroachdb/cockroach/pkg/sql/sem/tree"
@@ -581,7 +583,8 @@ func TestIndexBackfillerResumePreservesProgress(t *testing.T) {
581
583
582
584
ctx := context .Background ()
583
585
backfillProgressCompletedCh := make (chan []roachpb.Span )
584
- const numSpans = 100
586
+ const numRows = 100
587
+ const numSpans = 20
585
588
var isBlockingBackfillProgress atomic.Bool
586
589
isBlockingBackfillProgress .Store (true )
587
590
@@ -610,22 +613,35 @@ func TestIndexBackfillerResumePreservesProgress(t *testing.T) {
610
613
}
611
614
return nil
612
615
},
616
+ AfterStage : func (p scplan.Plan , stageIdx int ) error {
617
+ if p .Stages [stageIdx ].Type () != scop .BackfillType || ! isBlockingBackfillProgress .Load () {
618
+ return nil
619
+ }
620
+ isBlockingBackfillProgress .Store (false )
621
+ close (backfillProgressCompletedCh )
622
+ return nil
623
+ },
613
624
},
614
625
},
615
626
})
616
627
defer tc .Stopper ().Stop (ctx )
617
628
618
629
_ , err := db .Exec (`SET CLUSTER SETTING bulkio.index_backfill.batch_size = 10` )
619
630
require .NoError (t , err )
631
+ _ , err = db .Exec (`SET CLUSTER SETTING bulkio.index_backfill.ingest_concurrency=4` )
632
+ require .NoError (t , err )
620
633
// Ensure that we checkpoint our progress to the backfill job so that
621
634
// RESUMEs can get an up-to-date backfill progress.
622
635
_ , err = db .Exec (`SET CLUSTER SETTING bulkio.index_backfill.checkpoint_interval = '10ms'` )
623
636
require .NoError (t , err )
624
637
_ , err = db .Exec (`CREATE TABLE t(i INT PRIMARY KEY)` )
625
638
require .NoError (t , err )
626
- _ , err = db .Exec (`INSERT INTO t SELECT generate_series(1, $1)` , numSpans )
639
+ // Have a 100 splits each containing a 100 rows.
640
+ _ , err = db .Exec (`INSERT INTO t SELECT generate_series(1, $1)` , (numRows * numSpans )+ 1 )
627
641
require .NoError (t , err )
628
- _ , err = db .Exec (`ALTER TABLE t SPLIT AT TABLE generate_series(1, $1)` , numSpans )
642
+ for split := 0 ; split < numSpans ; split ++ {
643
+ _ , err = db .Exec (`ALTER TABLE t SPLIT AT VALUES ($1)` , numRows * numSpans )
644
+ }
629
645
require .NoError (t , err )
630
646
var descID catid.DescID
631
647
descIDRow := db .QueryRow (`SELECT 't'::regclass::oid` )
@@ -669,21 +685,28 @@ func TestIndexBackfillerResumePreservesProgress(t *testing.T) {
669
685
}
670
686
671
687
var completedSpans roachpb.SpanGroup
688
+ var observedSpans []roachpb.Span
672
689
receiveProgressUpdate := func () {
673
- progressUpdate := <- backfillProgressCompletedCh
674
-
675
- // Make sure the progress update does not contain overlapping spans.
676
- for i , span1 := range progressUpdate {
677
- for j , span2 := range progressUpdate {
678
- if i <= j {
679
- continue
680
- }
681
- if span1 .Overlaps (span2 ) {
682
- t .Fatalf ("progress update contains overlapping spans: %s and %s" , span1 , span2 )
690
+ updateCount := 2
691
+ for isBlockingBackfillProgress .Load () && updateCount > 0 {
692
+ progressUpdate := <- backfillProgressCompletedCh
693
+ // Make sure the progress update does not contain overlapping spans.
694
+ for i , span1 := range progressUpdate {
695
+ for j , span2 := range progressUpdate {
696
+ if i == j {
697
+ continue
698
+ }
699
+ if span1 .Overlaps (span2 ) {
700
+ t .Fatalf ("progress update contains overlapping spans: %s and %s" , span1 , span2 )
701
+ }
683
702
}
684
703
}
704
+ hasMoreSpans := completedSpans .Add (progressUpdate ... )
705
+ if hasMoreSpans {
706
+ updateCount -= 1
707
+ }
708
+ observedSpans = append (observedSpans , progressUpdate ... )
685
709
}
686
- completedSpans .Add (progressUpdate ... )
687
710
}
688
711
689
712
ensureCompletedSpansAreCheckpointed := func () {
@@ -717,45 +740,35 @@ func TestIndexBackfillerResumePreservesProgress(t *testing.T) {
717
740
}, 5 * time .Second )
718
741
}
719
742
720
- // Let the backfill step forward a bit before we do our PAUSE/RESUME
721
- // dance.
722
- for i := 0 ; i < 2 ; i ++ {
743
+ for isBlockingBackfillProgress .Load () {
723
744
receiveProgressUpdate ()
724
- }
725
-
726
- ensureCompletedSpansAreCheckpointed ()
727
- t .Logf ("pausing backfill" )
728
- _ , err = db .Exec (`PAUSE JOB $1` , jobID )
729
- require .NoError (t , err )
730
- ensureJobState ("paused" )
731
-
732
- t .Logf ("resuming backfill" )
733
- _ , err = db .Exec (`RESUME JOB $1` , jobID )
734
- require .NoError (t , err )
735
- ensureJobState ("running" )
745
+ ensureCompletedSpansAreCheckpointed ()
746
+ t .Logf ("pausing backfill" )
747
+ _ , err = db .Exec (`PAUSE JOB $1` , jobID )
748
+ require .NoError (t , err )
749
+ ensureJobState ("paused" )
736
750
737
- // Step forward again before re-pausing.
738
- for i := 0 ; i < 2 ; i ++ {
739
- receiveProgressUpdate ()
751
+ t .Logf ("resuming backfill" )
752
+ _ , err = db .Exec (`RESUME JOB $1` , jobID )
753
+ require .NoError (t , err )
754
+ ensureJobState ("running" )
740
755
}
741
-
742
- ensureCompletedSpansAreCheckpointed ()
743
- isBlockingBackfillProgress .Store (false )
744
-
745
- t .Logf ("pausing backfill" )
746
- _ , err = db .Exec (`PAUSE JOB $1` , jobID )
747
- require .NoError (t , err )
748
- ensureJobState ("paused" )
749
-
750
- t .Logf ("resuming backfill" )
751
- _ , err = db .Exec (`RESUME JOB $1` , jobID )
752
- require .NoError (t , err )
753
- ensureJobState ("running" )
754
-
755
756
// Now we can wait for the job to succeed
756
757
ensureJobState ("succeeded" )
757
-
758
758
if err = g .Wait (); err != nil {
759
759
require .NoError (t , err )
760
760
}
761
+ // Make sure the spans we are adding do not overlap otherwise, this indicates
762
+ // a bug. Where we computed chunks incorrectly. Each chunk should be an independent
763
+ // piece of work.
764
+ for i , span1 := range observedSpans {
765
+ for j , span2 := range observedSpans {
766
+ if i == j {
767
+ continue
768
+ }
769
+ if span1 .Overlaps (span2 ) {
770
+ t .Fatalf ("progress update contains overlapping spans: %s and %s" , span1 , span2 )
771
+ }
772
+ }
773
+ }
761
774
}
0 commit comments