@@ -21,9 +21,11 @@ import (
21
21
"github.com/cockroachdb/cockroach/pkg/cloud"
22
22
"github.com/cockroachdb/cockroach/pkg/crosscluster"
23
23
"github.com/cockroachdb/cockroach/pkg/kv"
24
+ "github.com/cockroachdb/cockroach/pkg/kv/bulk"
24
25
"github.com/cockroachdb/cockroach/pkg/kv/kvpb"
25
26
"github.com/cockroachdb/cockroach/pkg/roachpb"
26
27
"github.com/cockroachdb/cockroach/pkg/security/username"
28
+ "github.com/cockroachdb/cockroach/pkg/settings"
27
29
"github.com/cockroachdb/cockroach/pkg/sql/catalog"
28
30
"github.com/cockroachdb/cockroach/pkg/sql/catalog/tabledesc"
29
31
"github.com/cockroachdb/cockroach/pkg/sql/catalog/typedesc"
@@ -44,6 +46,13 @@ import (
44
46
"github.com/cockroachdb/errors"
45
47
)
46
48
49
+ var importElasticCPUControlEnabled = settings .RegisterBoolSetting (
50
+ settings .ApplicationLevel ,
51
+ "bulkio.import.elastic_control.enabled" ,
52
+ "determines whether import operations integrate with elastic CPU control" ,
53
+ false , // TODO(dt): enable this by default after more benchmarking.
54
+ )
55
+
47
56
func runImport (
48
57
ctx context.Context ,
49
58
flowCtx * execinfra.FlowCtx ,
@@ -567,9 +576,15 @@ func runParallelImport(
567
576
var span * tracing.Span
568
577
ctx , span = tracing .ChildSpan (ctx , "import-file-to-rows" )
569
578
defer span .Finish ()
579
+
580
+ // Create a pacer for admission control for the producer.
581
+ pacer := bulk .NewCPUPacer (ctx , importCtx .db , importElasticCPUControlEnabled )
582
+ defer pacer .Close ()
583
+
570
584
var numSkipped int64
571
585
var count int64
572
586
for producer .Scan () {
587
+ pacer .Pace (ctx )
573
588
// Skip rows if needed.
574
589
count ++
575
590
if count <= fileCtx .skip {
@@ -660,6 +675,10 @@ func (p *parallelImporter) importWorker(
660
675
fileCtx * importFileContext ,
661
676
minEmitted []int64 ,
662
677
) error {
678
+ // Create a pacer for admission control for this worker.
679
+ pacer := bulk .NewCPUPacer (ctx , importCtx .db , importElasticCPUControlEnabled )
680
+ defer pacer .Close ()
681
+
663
682
conv , err := makeDatumConverter (ctx , importCtx , fileCtx , importCtx .db )
664
683
if err != nil {
665
684
return err
@@ -680,6 +699,8 @@ func (p *parallelImporter) importWorker(
680
699
conv .KvBatch .Progress = batch .progress
681
700
for batchIdx , record := range batch .data {
682
701
rowNum = batch .startPos + int64 (batchIdx )
702
+ // Pace the admission control before processing each row.
703
+ pacer .Pace (ctx )
683
704
if err := consumer .FillDatums (ctx , record , rowNum , conv ); err != nil {
684
705
if err = handleCorruptRow (ctx , fileCtx , err ); err != nil {
685
706
return err
0 commit comments