@@ -78,7 +78,7 @@ internal class GrpcWorkerChannel : IRpcWorkerChannel, IDisposable
7878 private TaskCompletionSource < List < RawFunctionMetadata > > _functionsIndexingTask = new TaskCompletionSource < List < RawFunctionMetadata > > ( TaskCreationOptions . RunContinuationsAsynchronously ) ;
7979 private TimeSpan _functionLoadTimeout = TimeSpan . FromMinutes ( 1 ) ;
8080 private bool _isSharedMemoryDataTransferEnabled ;
81- private bool _cancelCapabilityEnabled ;
81+ private bool ? _cancelCapabilityEnabled ;
8282 private bool _isWorkerApplicationInsightsLoggingEnabled ;
8383
8484 private System . Timers . Timer _timer ;
@@ -357,6 +357,11 @@ internal WorkerInitRequest GetWorkerInitRequest()
357357 internal void FunctionEnvironmentReloadResponse ( FunctionEnvironmentReloadResponse res , IDisposable latencyEvent )
358358 {
359359 _workerChannelLogger . LogDebug ( "Received FunctionEnvironmentReloadResponse from WorkerProcess with Pid: '{0}'" , _rpcWorkerProcess . Id ) ;
360+
361+ LogWorkerMetadata ( res . WorkerMetadata ) ;
362+ UpdateCapabilities ( res . Capabilities ) ;
363+ _cancelCapabilityEnabled ??= ! string . IsNullOrEmpty ( _workerCapabilities . GetCapabilityState ( RpcWorkerConstants . HandlesInvocationCancelMessage ) ) ;
364+
360365 if ( res . Result . IsFailure ( out Exception reloadEnvironmentVariablesException ) )
361366 {
362367 _workerChannelLogger . LogError ( reloadEnvironmentVariablesException , "Failed to reload environment variables" ) ;
@@ -375,13 +380,10 @@ internal void WorkerInitResponse(GrpcEvent initEvent)
375380 _initMessage = initEvent . Message . WorkerInitResponse ;
376381 _workerChannelLogger . LogDebug ( "Worker capabilities: {capabilities}" , _initMessage . Capabilities ) ;
377382
378- if ( _initMessage . WorkerMetadata != null )
379- {
380- _initMessage . UpdateWorkerMetadata ( _workerConfig ) ;
381- var workerMetadata = _initMessage . WorkerMetadata . ToString ( ) ;
382- _metricsLogger . LogEvent ( MetricEventNames . WorkerMetadata , functionName : null , workerMetadata ) ;
383- _workerChannelLogger . LogDebug ( "Worker metadata: {workerMetadata}" , workerMetadata ) ;
384- }
383+ // In placeholder scenario, the capabilities and worker metadata will not be available
384+ // until specialization is done (env reload request). So these can be removed from worker init response code path.
385+ // to do to track this: https://github.com/Azure/azure-functions-host/issues/9019
386+ LogWorkerMetadata ( _initMessage . WorkerMetadata ) ;
385387
386388 if ( _initMessage . Result . IsFailure ( out Exception exc ) )
387389 {
@@ -395,7 +397,7 @@ internal void WorkerInitResponse(GrpcEvent initEvent)
395397 UpdateCapabilities ( _initMessage . Capabilities ) ;
396398
397399 _isSharedMemoryDataTransferEnabled = IsSharedMemoryDataTransferEnabled ( ) ;
398- _cancelCapabilityEnabled = ! string . IsNullOrEmpty ( _workerCapabilities . GetCapabilityState ( RpcWorkerConstants . HandlesInvocationCancelMessage ) ) ;
400+ _cancelCapabilityEnabled ?? = ! string . IsNullOrEmpty ( _workerCapabilities . GetCapabilityState ( RpcWorkerConstants . HandlesInvocationCancelMessage ) ) ;
399401
400402 if ( ! _isSharedMemoryDataTransferEnabled )
401403 {
@@ -413,6 +415,19 @@ internal void WorkerInitResponse(GrpcEvent initEvent)
413415 _workerInitTask . TrySetResult ( true ) ;
414416 }
415417
418+ private void LogWorkerMetadata ( WorkerMetadata workerMetadata )
419+ {
420+ if ( workerMetadata == null )
421+ {
422+ return ;
423+ }
424+
425+ workerMetadata . UpdateWorkerMetadata ( _workerConfig ) ;
426+ var workerMetadataString = workerMetadata . ToString ( ) ;
427+ _metricsLogger . LogEvent ( MetricEventNames . WorkerMetadata , functionName : null , workerMetadataString ) ;
428+ _workerChannelLogger . LogDebug ( "Worker metadata: {workerMetadata}" , workerMetadataString ) ;
429+ }
430+
416431 // Allow tests to add capabilities, even if not directly supported by the worker.
417432 internal virtual void UpdateCapabilities ( IDictionary < string , string > fields )
418433 {
@@ -668,7 +683,7 @@ await SendStreamingMessageAsync(new StreamingMessage
668683 InvocationRequest = invocationRequest
669684 } ) ;
670685
671- if ( _cancelCapabilityEnabled )
686+ if ( _cancelCapabilityEnabled != null && _cancelCapabilityEnabled . Value )
672687 {
673688 context . CancellationToken . Register ( ( ) => SendInvocationCancel ( invocationRequest . InvocationId ) ) ;
674689 }
0 commit comments