@@ -192,9 +192,9 @@ type (
192
192
// WorkerStopChannel is a read only channel listen on worker close. The worker will close the channel before exit.
193
193
WorkerStopChannel <- chan struct {}
194
194
195
- // WorkerFatalErrorChannel is a channel for fatal errors that should stop
196
- // the worker. This is sent to asynchronously, so it should be buffered.
197
- WorkerFatalErrorChannel chan <- error
195
+ // WorkerFatalErrorCallback is a callback for fatal errors that should stop
196
+ // the worker.
197
+ WorkerFatalErrorCallback func ( error )
198
198
199
199
// SessionResourceID is a unique identifier of the resource the session will consume
200
200
SessionResourceID string
@@ -288,7 +288,7 @@ func newWorkflowTaskWorkerInternal(
288
288
identity : params .Identity ,
289
289
workerType : "WorkflowWorker" ,
290
290
stopTimeout : params .WorkerStopTimeout ,
291
- fatalErrCh : params .WorkerFatalErrorChannel },
291
+ fatalErrCb : params .WorkerFatalErrorCallback },
292
292
params .Logger ,
293
293
params .MetricsHandler ,
294
294
nil ,
@@ -312,7 +312,7 @@ func newWorkflowTaskWorkerInternal(
312
312
identity : params .Identity ,
313
313
workerType : "LocalActivityWorker" ,
314
314
stopTimeout : params .WorkerStopTimeout ,
315
- fatalErrCh : params .WorkerFatalErrorChannel },
315
+ fatalErrCb : params .WorkerFatalErrorCallback },
316
316
params .Logger ,
317
317
params .MetricsHandler ,
318
318
nil ,
@@ -428,7 +428,7 @@ func newActivityTaskWorker(taskHandler ActivityTaskHandler, service workflowserv
428
428
identity : workerParams .Identity ,
429
429
workerType : "ActivityWorker" ,
430
430
stopTimeout : workerParams .WorkerStopTimeout ,
431
- fatalErrCh : workerParams .WorkerFatalErrorChannel ,
431
+ fatalErrCb : workerParams .WorkerFatalErrorCallback ,
432
432
userContextCancel : workerParams .UserContextCancel },
433
433
workerParams .Logger ,
434
434
workerParams .MetricsHandler ,
@@ -856,8 +856,8 @@ type AggregatedWorker struct {
856
856
logger log.Logger
857
857
registry * registry
858
858
stopC chan struct {}
859
- fatalErrCh chan error
860
- fatalErrCb func ( error )
859
+ fatalErr error
860
+ fatalErrLock sync. Mutex
861
861
}
862
862
863
863
// RegisterWorkflow registers workflow implementation with the AggregatedWorker
@@ -1026,14 +1026,11 @@ func (aw *AggregatedWorker) Run(interruptCh <-chan interface{}) error {
1026
1026
case s := <- interruptCh :
1027
1027
aw .logger .Info ("Worker has been stopped." , "Signal" , s )
1028
1028
aw .Stop ()
1029
- case err := <- aw .fatalErrCh :
1030
- // Fatal error will already have been logged where it is set
1031
- if aw .fatalErrCb != nil {
1032
- aw .fatalErrCb (err )
1033
- }
1034
- aw .Stop ()
1035
- return err
1036
1029
case <- aw .stopC :
1030
+ aw .fatalErrLock .Lock ()
1031
+ defer aw .fatalErrLock .Unlock ()
1032
+ // This may be nil if this wasn't stopped due to fatal error
1033
+ return aw .fatalErr
1037
1034
}
1038
1035
return nil
1039
1036
}
@@ -1311,9 +1308,30 @@ func NewAggregatedWorker(client *WorkflowClient, taskQueue string, options Worke
1311
1308
panic ("cannot set MaxConcurrentWorkflowTaskPollers to 1" )
1312
1309
}
1313
1310
1314
- // We need this buffered since the sender will be sending async and we only
1315
- // need the first fatal error
1316
- fatalErrCh := make (chan error , 1 )
1311
+ // Need reference to result for fatal error handler
1312
+ var aw * AggregatedWorker
1313
+ fatalErrorCallback := func (err error ) {
1314
+ // Set the fatal error if not already set
1315
+ aw .fatalErrLock .Lock ()
1316
+ alreadySet := aw .fatalErr != nil
1317
+ if ! alreadySet {
1318
+ aw .fatalErr = err
1319
+ }
1320
+ aw .fatalErrLock .Unlock ()
1321
+ // Only do the rest if not already set
1322
+ if ! alreadySet {
1323
+ // Invoke the callback if present
1324
+ if options .OnFatalError != nil {
1325
+ options .OnFatalError (err )
1326
+ }
1327
+ // Stop the worker if not already stopped
1328
+ select {
1329
+ case <- aw .stopC :
1330
+ default :
1331
+ aw .Stop ()
1332
+ }
1333
+ }
1334
+ }
1317
1335
1318
1336
cache := NewWorkerCache ()
1319
1337
workerParams := workerExecutionParameters {
@@ -1337,7 +1355,7 @@ func NewAggregatedWorker(client *WorkflowClient, taskQueue string, options Worke
1337
1355
WorkflowPanicPolicy : options .WorkflowPanicPolicy ,
1338
1356
DataConverter : client .dataConverter ,
1339
1357
WorkerStopTimeout : options .WorkerStopTimeout ,
1340
- WorkerFatalErrorChannel : fatalErrCh ,
1358
+ WorkerFatalErrorCallback : fatalErrorCallback ,
1341
1359
ContextPropagators : client .contextPropagators ,
1342
1360
DeadlockDetectionTimeout : options .DeadlockDetectionTimeout ,
1343
1361
DefaultHeartbeatThrottleInterval : options .DefaultHeartbeatThrottleInterval ,
@@ -1393,17 +1411,16 @@ func NewAggregatedWorker(client *WorkflowClient, taskQueue string, options Worke
1393
1411
})
1394
1412
}
1395
1413
1396
- return & AggregatedWorker {
1414
+ aw = & AggregatedWorker {
1397
1415
client : client ,
1398
1416
workflowWorker : workflowWorker ,
1399
1417
activityWorker : activityWorker ,
1400
1418
sessionWorker : sessionWorker ,
1401
1419
logger : workerParams .Logger ,
1402
1420
registry : registry ,
1403
1421
stopC : make (chan struct {}),
1404
- fatalErrCh : fatalErrCh ,
1405
- fatalErrCb : options .OnFatalError ,
1406
1422
}
1423
+ return aw
1407
1424
}
1408
1425
1409
1426
func processTestTags (wOptions * WorkerOptions , ep * workerExecutionParameters ) {
0 commit comments