@@ -20,7 +20,7 @@ namespace Microsoft.Azure.WebJobs.Script.Rpc
20
20
internal class FunctionDispatcher : IFunctionDispatcher
21
21
{
22
22
private readonly IMetricsLogger _metricsLogger ;
23
- private readonly ILoggerFactory _loggerFactory ;
23
+ private readonly ILogger _logger ;
24
24
private IScriptEventManager _eventManager ;
25
25
private IEnumerable < WorkerConfig > _workerConfigs ;
26
26
private CreateChannel _channelFactory ;
@@ -42,8 +42,8 @@ public FunctionDispatcher(IOptions<ScriptJobHostOptions> scriptHostOptions,
42
42
_scriptOptions = scriptHostOptions . Value ;
43
43
_languageWorkerChannelManager = languageWorkerChannelManager ;
44
44
_eventManager = eventManager ;
45
- _loggerFactory = loggerFactory ;
46
45
_workerConfigs = languageWorkerOptions . Value . WorkerConfigs ;
46
+ _logger = loggerFactory . CreateLogger ( ScriptConstants . LogCategoryFunctionDispatcher ) ;
47
47
48
48
_workerErrorSubscription = _eventManager . OfType < WorkerErrorEvent > ( )
49
49
. Subscribe ( WorkerError ) ;
@@ -59,7 +59,7 @@ internal CreateChannel ChannelFactory
59
59
{
60
60
_channelFactory = ( language , registrations , attemptCount ) =>
61
61
{
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 ) ;
63
63
languageWorkerChannel . StartWorkerProcess ( ) ;
64
64
return languageWorkerChannel ;
65
65
} ;
@@ -94,18 +94,19 @@ public LanguageWorkerState CreateWorkerStateWithExistingChannel(string language,
94
94
public void Initialize ( string workerRuntime , IEnumerable < FunctionMetadata > functions )
95
95
{
96
96
_languageWorkerChannelManager . ShutdownStandbyChannels ( functions ) ;
97
-
98
97
workerRuntime = workerRuntime ?? Utility . GetWorkerRuntime ( functions ) ;
99
98
100
99
if ( Utility . IsSupportedRuntime ( workerRuntime , _workerConfigs ) )
101
100
{
102
101
ILanguageWorkerChannel initializedChannel = _languageWorkerChannelManager . GetChannel ( workerRuntime ) ;
103
102
if ( initializedChannel != null )
104
103
{
104
+ _logger . LogDebug ( $ "Found initialized language worker channel for runtime: { 0 } ", workerRuntime ) ;
105
105
CreateWorkerStateWithExistingChannel ( workerRuntime , initializedChannel ) ;
106
106
}
107
107
else
108
108
{
109
+ _logger . LogDebug ( $ "Creating new language worker channel for runtime:{ 0 } ", workerRuntime ) ;
109
110
CreateWorkerState ( workerRuntime ) ;
110
111
}
111
112
}
@@ -129,26 +130,31 @@ public void WorkerError(WorkerErrorEvent workerError)
129
130
{
130
131
if ( _workerStates . TryGetValue ( workerError . Language , out LanguageWorkerState erroredWorkerState ) )
131
132
{
133
+ _logger . LogDebug ( $ "Handling WorkerErrorEvent for runtime:{ workerError . Language } ") ;
132
134
erroredWorkerState . Errors . Add ( workerError . Exception ) ;
133
135
bool isPreInitializedChannel = _languageWorkerChannelManager . ShutdownChannelIfExists ( workerError . Language ) ;
134
136
if ( ! isPreInitializedChannel )
135
137
{
138
+ _logger . LogDebug ( $ "Disposing errored channel for workerId: { 0 } , for runtime:{ 1 } ", erroredWorkerState . Channel . Id , workerError . Language ) ;
136
139
erroredWorkerState . Channel . Dispose ( ) ;
137
140
}
141
+ _logger . LogDebug ( $ "Restarting worker channel for runtime:{ 0 } ", workerError . Language ) ;
138
142
RestartWorkerChannel ( workerError . Language , erroredWorkerState ) ;
139
143
}
140
144
}
141
145
142
- private void RestartWorkerChannel ( string language , LanguageWorkerState erroredWorkerState )
146
+ private void RestartWorkerChannel ( string runtime , LanguageWorkerState erroredWorkerState )
143
147
{
144
148
if ( erroredWorkerState . Errors . Count < 3 )
145
149
{
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 ;
148
153
}
149
154
else
150
155
{
151
- PublishWorkerProcessErrorEvent ( language , erroredWorkerState ) ;
156
+ _logger . LogDebug ( $ "Exceeded language worker restart retry count for runtime:{ 0 } ", runtime ) ;
157
+ PublishWorkerProcessErrorEvent ( runtime , erroredWorkerState ) ;
152
158
}
153
159
}
154
160
@@ -190,7 +196,11 @@ protected virtual void Dispose(bool disposing)
190
196
foreach ( var pair in _workerStates )
191
197
{
192
198
// 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
+ }
194
204
pair . Value . Functions . Dispose ( ) ;
195
205
}
196
206
}
0 commit comments