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