@@ -121,6 +121,8 @@ type changeAggregator struct {
121
121
sliMetricsID int64
122
122
closeTelemetryRecorder func ()
123
123
knobs TestingKnobs
124
+
125
+ targets changefeedbase.Targets
124
126
}
125
127
126
128
type timestampLowerBoundOracle interface {
@@ -286,7 +288,7 @@ func (ca *changeAggregator) MustBeStreaming() bool {
286
288
// wrapMetricsRecorderWithTelemetry wraps the supplied metricsRecorder
287
289
// so it periodically emits metrics to telemetry.
288
290
func (ca * changeAggregator ) wrapMetricsRecorderWithTelemetry (
289
- ctx context.Context , recorder metricsRecorder ,
291
+ ctx context.Context , recorder metricsRecorder , targets changefeedbase. Targets ,
290
292
) (metricsRecorder , error ) {
291
293
details := ca .spec .Feed
292
294
jobID := ca .spec .JobID
@@ -307,7 +309,7 @@ func (ca *changeAggregator) wrapMetricsRecorderWithTelemetry(
307
309
description = job .Payload ().Description
308
310
}
309
311
310
- recorderWithTelemetry , err := wrapMetricsRecorderWithTelemetry (ctx , details , description , jobID , ca .FlowCtx .Cfg .Settings , recorder , ca .knobs )
312
+ recorderWithTelemetry , err := wrapMetricsRecorderWithTelemetry (ctx , details , description , jobID , ca .FlowCtx .Cfg .Settings , recorder , ca .knobs , targets )
311
313
if err != nil {
312
314
return ca .sliMetrics , err
313
315
}
@@ -350,8 +352,15 @@ func (ca *changeAggregator) Start(ctx context.Context) {
350
352
return
351
353
}
352
354
353
- feed := makeChangefeedConfigFromJobDetails (ca .spec .Feed )
354
-
355
+ feed , err := makeChangefeedConfigFromJobDetails (ctx , ca .spec .Feed , ca .FlowCtx .Cfg .ExecutorConfig .(* sql.ExecutorConfig ))
356
+ if err != nil {
357
+ if log .V (2 ) {
358
+ log .Infof (ca .Ctx (), "change aggregator moving to draining due to error making changefeed config: %v" , err )
359
+ }
360
+ ca .MoveToDraining (err )
361
+ ca .cancel ()
362
+ return
363
+ }
355
364
opts := feed .Opts
356
365
357
366
timestampOracle := & changeAggregatorLowerBoundOracle {
@@ -378,20 +387,29 @@ func (ca *changeAggregator) Start(ctx context.Context) {
378
387
return
379
388
}
380
389
ca .sliMetricsID = ca .sliMetrics .claimId ()
390
+ ca .targets , err = AllTargets (ctx , ca .spec .Feed , ca .FlowCtx .Cfg .ExecutorConfig .(* sql.ExecutorConfig ))
391
+ if err != nil {
392
+ if log .V (2 ) {
393
+ log .Infof (ca .Ctx (), "change aggregator moving to draining due to error getting targets: %v" , err )
394
+ }
395
+ ca .MoveToDraining (err )
396
+ ca .cancel ()
397
+ return
398
+ }
381
399
382
400
recorder := metricsRecorder (ca .sliMetrics )
383
- recorder , err = ca .wrapMetricsRecorderWithTelemetry (ctx , recorder )
401
+ recorder , err = ca .wrapMetricsRecorderWithTelemetry (ctx , recorder , ca .targets )
402
+
384
403
if err != nil {
385
404
if log .V (2 ) {
386
405
log .Infof (ca .Ctx (), "change aggregator moving to draining due to error wrapping metrics controller: %v" , err )
387
406
}
388
407
ca .MoveToDraining (err )
389
408
ca .cancel ()
390
- return
391
409
}
392
410
393
411
ca .sink , err = getEventSink (ctx , ca .FlowCtx .Cfg , ca .spec .Feed , timestampOracle ,
394
- ca .spec .User (), ca .spec .JobID , recorder )
412
+ ca .spec .User (), ca .spec .JobID , recorder , ca . targets )
395
413
if err != nil {
396
414
err = changefeedbase .MarkRetryableError (err )
397
415
if log .V (2 ) {
@@ -535,7 +553,7 @@ func (ca *changeAggregator) makeKVFeedCfg(
535
553
if schemaChange .Policy == changefeedbase .OptSchemaChangePolicyIgnore || initialScanOnly {
536
554
sf = schemafeed .DoNothingSchemaFeed
537
555
} else {
538
- sf = schemafeed .New (ctx , cfg , schemaChange .EventClass , AllTargets ( ca .spec . Feed ) ,
556
+ sf = schemafeed .New (ctx , cfg , schemaChange .EventClass , ca .targets ,
539
557
initialHighWater , & ca .metrics .SchemaFeedMetrics , config .Opts .GetCanHandle ())
540
558
}
541
559
@@ -552,7 +570,7 @@ func (ca *changeAggregator) makeKVFeedCfg(
552
570
Clock : cfg .DB .KV ().Clock (),
553
571
Spans : spans ,
554
572
SpanLevelCheckpoint : ca .spec .SpanLevelCheckpoint ,
555
- Targets : AllTargets ( ca .spec . Feed ) ,
573
+ Targets : ca .targets ,
556
574
Metrics : & ca .metrics .KVFeedMetrics ,
557
575
MM : memMon ,
558
576
InitialHighWater : initialHighWater ,
@@ -1073,6 +1091,8 @@ type changeFrontier struct {
1073
1091
1074
1092
usageWg sync.WaitGroup
1075
1093
usageWgCancel context.CancelFunc
1094
+
1095
+ targets changefeedbase.Targets
1076
1096
}
1077
1097
1078
1098
const (
@@ -1295,8 +1315,13 @@ func newChangeFrontierProcessor(
1295
1315
if err != nil {
1296
1316
return nil , err
1297
1317
}
1318
+ targets , err := AllTargets (ctx , spec .Feed , flowCtx .Cfg .ExecutorConfig .(* sql.ExecutorConfig ))
1319
+ if err != nil {
1320
+ return nil , err
1321
+ }
1322
+ cf .targets = targets
1298
1323
if cf .encoder , err = getEncoder (
1299
- ctx , encodingOpts , AllTargets ( spec . Feed ) , spec .Feed .Select != "" ,
1324
+ ctx , encodingOpts , targets , spec .Feed .Select != "" ,
1300
1325
makeExternalConnectionProvider (ctx , flowCtx .Cfg .DB ), sliMetrics ,
1301
1326
sourceProvider ,
1302
1327
); err != nil {
@@ -1349,9 +1374,8 @@ func (cf *changeFrontier) Start(ctx context.Context) {
1349
1374
return
1350
1375
}
1351
1376
cf .sliMetrics = sli
1352
-
1353
1377
cf .sink , err = getResolvedTimestampSink (ctx , cf .FlowCtx .Cfg , cf .spec .Feed , nilOracle ,
1354
- cf .spec .User (), cf .spec .JobID , sli )
1378
+ cf .spec .User (), cf .spec .JobID , sli , cf . targets )
1355
1379
if err != nil {
1356
1380
err = changefeedbase .MarkRetryableError (err )
1357
1381
if log .V (2 ) {
@@ -1924,10 +1948,9 @@ func (cf *changeFrontier) manageProtectedTimestamps(
1924
1948
if highWater .Less (cf .highWaterAtStart ) {
1925
1949
highWater = cf .highWaterAtStart
1926
1950
}
1927
-
1928
1951
if progress .ProtectedTimestampRecord == uuid .Nil {
1929
1952
ptr := createProtectedTimestampRecord (
1930
- ctx , cf .FlowCtx .Codec (), cf .spec .JobID , AllTargets ( cf .spec . Feed ) , highWater ,
1953
+ ctx , cf .FlowCtx .Codec (), cf .spec .JobID , cf .targets , highWater ,
1931
1954
)
1932
1955
progress .ProtectedTimestampRecord = ptr .ID .GetUUID ()
1933
1956
return true , pts .Protect (ctx , ptr )
@@ -1954,7 +1977,7 @@ func (cf *changeFrontier) manageProtectedTimestamps(
1954
1977
// If we've identified more tables that need to be protected since this
1955
1978
// changefeed was created, it will be missing here. If so, we "migrate" it
1956
1979
// to include all the appropriate targets.
1957
- if targets := AllTargets ( cf . spec . Feed ); ! makeTargetToProtect (targets ).Equal (rec .Target ) {
1980
+ if ! makeTargetToProtect (cf . targets ).Equal (rec .Target ) {
1958
1981
if preservePTSTargets := cf .knobs .PreservePTSTargets != nil && cf .knobs .PreservePTSTargets (); preservePTSTargets {
1959
1982
return false , nil
1960
1983
}
@@ -1988,7 +2011,7 @@ func (cf *changeFrontier) remakePTSRecord(
1988
2011
) error {
1989
2012
prevRecordId := progress .ProtectedTimestampRecord
1990
2013
ptr := createProtectedTimestampRecord (
1991
- ctx , cf .FlowCtx .Codec (), cf .spec .JobID , AllTargets ( cf .spec . Feed ) , resolved ,
2014
+ ctx , cf .FlowCtx .Codec (), cf .spec .JobID , cf .targets , resolved ,
1992
2015
)
1993
2016
if err := pts .Protect (ctx , ptr ); err != nil {
1994
2017
return err
0 commit comments