@@ -372,8 +372,7 @@ internal void FunctionEnvironmentReloadResponse(FunctionEnvironmentReloadRespons
372372 _workerConfig . Description . DefaultRuntimeVersion = _workerConfig . Description . DefaultRuntimeVersion ?? res ? . WorkerMetadata ? . RuntimeVersion ;
373373 _workerConfig . Description . DefaultRuntimeName = _workerConfig . Description . DefaultRuntimeName ?? res ? . WorkerMetadata ? . RuntimeName ;
374374
375- UpdateCapabilities ( res . Capabilities ) ;
376- _cancelCapabilityEnabled ??= ! string . IsNullOrEmpty ( _workerCapabilities . GetCapabilityState ( RpcWorkerConstants . HandlesInvocationCancelMessage ) ) ;
375+ ApplyCapabilities ( res . Capabilities , res . CapabilitiesUpdateStrategy . ToGrpcCapabilitiesUpdateStrategy ( ) ) ;
377376
378377 if ( res . Result . IsFailure ( out Exception reloadEnvironmentVariablesException ) )
379378 {
@@ -410,7 +409,36 @@ internal void WorkerInitResponse(GrpcEvent initEvent)
410409
411410 _state = _state | RpcWorkerChannelState . Initialized ;
412411
413- UpdateCapabilities ( _initMessage . Capabilities ) ;
412+ ApplyCapabilities ( _initMessage . Capabilities ) ;
413+
414+ _workerInitTask . TrySetResult ( true ) ;
415+ }
416+
417+ private void LogWorkerMetadata ( WorkerMetadata workerMetadata )
418+ {
419+ if ( workerMetadata == null )
420+ {
421+ return ;
422+ }
423+
424+ workerMetadata . UpdateWorkerMetadata ( _workerConfig ) ;
425+ var workerMetadataString = workerMetadata . ToString ( ) ;
426+ _metricsLogger . LogEvent ( MetricEventNames . WorkerMetadata , functionName : null , workerMetadataString ) ;
427+ _workerChannelLogger . LogDebug ( "Worker metadata: {workerMetadata}" , workerMetadataString ) ;
428+ }
429+
430+ // Allow tests to add capabilities, even if not directly supported by the worker.
431+ internal virtual void UpdateCapabilities ( IDictionary < string , string > fields , GrpcCapabilitiesUpdateStrategy strategy )
432+ {
433+ _workerCapabilities . UpdateCapabilities ( fields , strategy ) ;
434+ }
435+
436+ // Helper method that updates and applies capabilities
437+ // Used at worker initialization and environment reload (placeholder scenarios)
438+ // The default strategy for updating capabilities is merge
439+ internal void ApplyCapabilities ( IDictionary < string , string > capabilities , GrpcCapabilitiesUpdateStrategy strategy = GrpcCapabilitiesUpdateStrategy . Merge )
440+ {
441+ UpdateCapabilities ( capabilities , strategy ) ;
414442
415443 _isSharedMemoryDataTransferEnabled = IsSharedMemoryDataTransferEnabled ( ) ;
416444 _cancelCapabilityEnabled ??= ! string . IsNullOrEmpty ( _workerCapabilities . GetCapabilityState ( RpcWorkerConstants . HandlesInvocationCancelMessage ) ) ;
@@ -441,27 +469,6 @@ internal void WorkerInitResponse(GrpcEvent initEvent)
441469 HandleWorkerInitError ( ex ) ;
442470 }
443471 }
444-
445- _workerInitTask . TrySetResult ( true ) ;
446- }
447-
448- private void LogWorkerMetadata ( WorkerMetadata workerMetadata )
449- {
450- if ( workerMetadata == null )
451- {
452- return ;
453- }
454-
455- workerMetadata . UpdateWorkerMetadata ( _workerConfig ) ;
456- var workerMetadataString = workerMetadata . ToString ( ) ;
457- _metricsLogger . LogEvent ( MetricEventNames . WorkerMetadata , functionName : null , workerMetadataString ) ;
458- _workerChannelLogger . LogDebug ( "Worker metadata: {workerMetadata}" , workerMetadataString ) ;
459- }
460-
461- // Allow tests to add capabilities, even if not directly supported by the worker.
462- internal virtual void UpdateCapabilities ( IDictionary < string , string > fields )
463- {
464- _workerCapabilities . UpdateCapabilities ( fields ) ;
465472 }
466473
467474 public void SetupFunctionInvocationBuffers ( IEnumerable < FunctionMetadata > functions )
0 commit comments