@@ -20,7 +20,7 @@ namespace Microsoft.Azure.WebJobs.Script.Rpc
2020 internal class FunctionDispatcher : IFunctionDispatcher
2121 {
2222 private readonly IMetricsLogger _metricsLogger ;
23- private readonly ILoggerFactory _loggerFactory ;
23+ private readonly ILogger _logger ;
2424 private IScriptEventManager _eventManager ;
2525 private IEnumerable < WorkerConfig > _workerConfigs ;
2626 private CreateChannel _channelFactory ;
@@ -42,8 +42,8 @@ public FunctionDispatcher(IOptions<ScriptJobHostOptions> scriptHostOptions,
4242 _scriptOptions = scriptHostOptions . Value ;
4343 _languageWorkerChannelManager = languageWorkerChannelManager ;
4444 _eventManager = eventManager ;
45- _loggerFactory = loggerFactory ;
4645 _workerConfigs = languageWorkerOptions . Value . WorkerConfigs ;
46+ _logger = loggerFactory . CreateLogger ( ScriptConstants . LogCategoryFunctionDispatcher ) ;
4747
4848 _workerErrorSubscription = _eventManager . OfType < WorkerErrorEvent > ( )
4949 . Subscribe ( WorkerError ) ;
@@ -59,7 +59,7 @@ internal CreateChannel ChannelFactory
5959 {
6060 _channelFactory = ( language , registrations , attemptCount ) =>
6161 {
62- var languageWorkerChannel = _languageWorkerChannelManager . CreateLanguageWorkerChannel ( Guid . NewGuid ( ) . ToString ( ) , _scriptOptions . RootScriptPath , language , registrations , _metricsLogger , attemptCount ) ;
62+ var languageWorkerChannel = _languageWorkerChannelManager . CreateLanguageWorkerChannel ( Guid . NewGuid ( ) . ToString ( ) , _scriptOptions . RootScriptPath , language , registrations , _metricsLogger , attemptCount , false ) ;
6363 languageWorkerChannel . StartWorkerProcess ( ) ;
6464 return languageWorkerChannel ;
6565 } ;
@@ -94,18 +94,19 @@ public LanguageWorkerState CreateWorkerStateWithExistingChannel(string language,
9494 public void Initialize ( string workerRuntime , IEnumerable < FunctionMetadata > functions )
9595 {
9696 _languageWorkerChannelManager . ShutdownStandbyChannels ( functions ) ;
97-
9897 workerRuntime = workerRuntime ?? Utility . GetWorkerRuntime ( functions ) ;
9998
10099 if ( Utility . IsSupportedRuntime ( workerRuntime , _workerConfigs ) )
101100 {
102101 ILanguageWorkerChannel initializedChannel = _languageWorkerChannelManager . GetChannel ( workerRuntime ) ;
103102 if ( initializedChannel != null )
104103 {
104+ _logger . LogDebug ( $ "Found initialized language worker channel for runtime: { 0 } ", workerRuntime ) ;
105105 CreateWorkerStateWithExistingChannel ( workerRuntime , initializedChannel ) ;
106106 }
107107 else
108108 {
109+ _logger . LogDebug ( $ "Creating new language worker channel for runtime:{ 0 } ", workerRuntime ) ;
109110 CreateWorkerState ( workerRuntime ) ;
110111 }
111112 }
@@ -129,26 +130,31 @@ public void WorkerError(WorkerErrorEvent workerError)
129130 {
130131 if ( _workerStates . TryGetValue ( workerError . Language , out LanguageWorkerState erroredWorkerState ) )
131132 {
133+ _logger . LogDebug ( $ "Handling WorkerErrorEvent for runtime:{ workerError . Language } ") ;
132134 erroredWorkerState . Errors . Add ( workerError . Exception ) ;
133135 bool isPreInitializedChannel = _languageWorkerChannelManager . ShutdownChannelIfExists ( workerError . Language ) ;
134136 if ( ! isPreInitializedChannel )
135137 {
138+ _logger . LogDebug ( $ "Disposing errored channel for workerId: { 0 } , for runtime:{ 1 } ", erroredWorkerState . Channel . Id , workerError . Language ) ;
136139 erroredWorkerState . Channel . Dispose ( ) ;
137140 }
141+ _logger . LogDebug ( $ "Restarting worker channel for runtime:{ 0 } ", workerError . Language ) ;
138142 RestartWorkerChannel ( workerError . Language , erroredWorkerState ) ;
139143 }
140144 }
141145
142- private void RestartWorkerChannel ( string language , LanguageWorkerState erroredWorkerState )
146+ private void RestartWorkerChannel ( string runtime , LanguageWorkerState erroredWorkerState )
143147 {
144148 if ( erroredWorkerState . Errors . Count < 3 )
145149 {
146- erroredWorkerState . Channel = CreateNewChannelWithExistingWorkerState ( language , erroredWorkerState ) ;
147- _workerStates [ language ] = erroredWorkerState ;
150+ _logger . LogDebug ( "retrying process start" ) ;
151+ erroredWorkerState . Channel = CreateNewChannelWithExistingWorkerState ( runtime , erroredWorkerState ) ;
152+ _workerStates [ runtime ] = erroredWorkerState ;
148153 }
149154 else
150155 {
151- PublishWorkerProcessErrorEvent ( language , erroredWorkerState ) ;
156+ _logger . LogDebug ( $ "Exceeded language worker restart retry count for runtime:{ 0 } ", runtime ) ;
157+ PublishWorkerProcessErrorEvent ( runtime , erroredWorkerState ) ;
152158 }
153159 }
154160
@@ -190,7 +196,11 @@ protected virtual void Dispose(bool disposing)
190196 foreach ( var pair in _workerStates )
191197 {
192198 // TODO #3296 - send WorkerTerminate message to shut down language worker process gracefully (instead of just a killing)
193- pair . Value . Channel . Dispose ( ) ;
199+ // WebhostLanguageWorkerChannels life time is managed by LanguageWorkerChannelManager
200+ if ( ! pair . Value . Channel . IsWebhostChannel )
201+ {
202+ pair . Value . Channel . Dispose ( ) ;
203+ }
194204 pair . Value . Functions . Dispose ( ) ;
195205 }
196206 }
0 commit comments