7
7
using System . Linq ;
8
8
using System . Reactive . Linq ;
9
9
using System . Threading . Tasks ;
10
- using Microsoft . Azure . AppService . Proxy . Common . Extensions ;
11
10
using Microsoft . Azure . AppService . Proxy . Common . Infra ;
12
- using Microsoft . Azure . AppService . Proxy . Runtime ;
13
11
using Microsoft . Azure . WebJobs . Script . Config ;
14
12
using Microsoft . Azure . WebJobs . Script . Diagnostics ;
15
13
using Microsoft . Azure . WebJobs . Script . Eventing ;
@@ -36,7 +34,7 @@ public class WebHostRpcWorkerChannelManager : IWebHostRpcWorkerChannelManager
36
34
private Action _shutdownStandbyWorkerChannels ;
37
35
private IConfiguration _config ;
38
36
39
- private ConcurrentDictionary < string , Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > > _workerChannels = new ConcurrentDictionary < string , Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > > ( StringComparer . OrdinalIgnoreCase ) ;
37
+ private ConcurrentDictionary < string , ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > > _workerChannels = new ( StringComparer . OrdinalIgnoreCase ) ;
40
38
41
39
public WebHostRpcWorkerChannelManager ( IScriptEventManager eventManager ,
42
40
IEnvironment environment ,
@@ -101,7 +99,7 @@ await rpcWorkerChannel.StartWorkerProcessAsync().ContinueWith(processStartTask =
101
99
102
100
internal Task < IRpcWorkerChannel > GetChannelAsync ( string language )
103
101
{
104
- if ( ! string . IsNullOrEmpty ( language ) && _workerChannels . TryGetValue ( language , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > workerChannels ) )
102
+ if ( ! string . IsNullOrEmpty ( language ) && _workerChannels . TryGetValue ( language , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > workerChannels ) )
105
103
{
106
104
if ( workerChannels . Count > 0 && workerChannels . TryGetValue ( workerChannels . Keys . First ( ) , out TaskCompletionSource < IRpcWorkerChannel > valueTask ) )
107
105
{
@@ -111,9 +109,9 @@ internal Task<IRpcWorkerChannel> GetChannelAsync(string language)
111
109
return Task . FromResult < IRpcWorkerChannel > ( null ) ;
112
110
}
113
111
114
- public Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > GetChannels ( string language )
112
+ public IDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > GetChannels ( string language )
115
113
{
116
- if ( ! string . IsNullOrEmpty ( language ) && _workerChannels . TryGetValue ( language , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > workerChannels ) )
114
+ if ( ! string . IsNullOrEmpty ( language ) && _workerChannels . TryGetValue ( language , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > workerChannels ) )
117
115
{
118
116
return workerChannels ;
119
117
}
@@ -237,7 +235,7 @@ public Task<bool> ShutdownChannelIfExistsAsync(string language, string workerId,
237
235
238
236
if ( _hostingConfigOptions . Value . RevertWorkerShutdownBehaviour )
239
237
{
240
- if ( _workerChannels . TryRemove ( language , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > rpcWorkerChannels ) )
238
+ if ( _workerChannels . TryRemove ( language , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > rpcWorkerChannels ) )
241
239
{
242
240
if ( rpcWorkerChannels . TryGetValue ( workerId , out TaskCompletionSource < IRpcWorkerChannel > value ) )
243
241
{
@@ -264,7 +262,7 @@ public Task<bool> ShutdownChannelIfExistsAsync(string language, string workerId,
264
262
}
265
263
else
266
264
{
267
- if ( _workerChannels . TryGetValue ( language , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > rpcWorkerChannels )
265
+ if ( _workerChannels . TryGetValue ( language , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > rpcWorkerChannels )
268
266
&& rpcWorkerChannels . TryRemove ( workerId , out TaskCompletionSource < IRpcWorkerChannel > value ) )
269
267
{
270
268
value ? . Task . ContinueWith ( channelTask =>
@@ -304,7 +302,7 @@ internal void ScheduleShutdownStandbyChannels()
304
302
using ( _metricsLogger . LatencyEvent ( string . Format ( MetricEventNames . SpecializationShutdownStandbyChannels , runtime . Key ) ) )
305
303
{
306
304
_logger . LogInformation ( "Disposing standby channel for runtime:{language}" , runtime . Key ) ;
307
- if ( _workerChannels . TryRemove ( runtime . Key , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > standbyChannels ) )
305
+ if ( _workerChannels . TryRemove ( runtime . Key , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > standbyChannels ) )
308
306
{
309
307
foreach ( string workerId in standbyChannels . Keys )
310
308
{
@@ -338,7 +336,7 @@ public async Task ShutdownChannelsAsync()
338
336
foreach ( string runtime in _workerChannels . Keys )
339
337
{
340
338
_logger . LogInformation ( "Shutting down language worker channels for runtime:{runtime}" , runtime ) ;
341
- if ( _workerChannels . TryRemove ( runtime , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > standbyChannels ) )
339
+ if ( _workerChannels . TryRemove ( runtime , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > standbyChannels ) )
342
340
{
343
341
foreach ( string workerId in standbyChannels . Keys )
344
342
{
@@ -378,21 +376,21 @@ internal void AddOrUpdateWorkerChannels(string initializedRuntime, IRpcWorkerCha
378
376
_workerChannels . AddOrUpdate ( initializedRuntime ,
379
377
( runtime ) =>
380
378
{
381
- Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > newLanguageWorkerChannels = new Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > ( ) ;
382
- newLanguageWorkerChannels . Add ( initializedLanguageWorkerChannel . Id , new TaskCompletionSource < IRpcWorkerChannel > ( ) ) ;
379
+ ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > newLanguageWorkerChannels = new ( StringComparer . OrdinalIgnoreCase ) ;
380
+ newLanguageWorkerChannels . TryAdd ( initializedLanguageWorkerChannel . Id , new TaskCompletionSource < IRpcWorkerChannel > ( ) ) ;
383
381
return newLanguageWorkerChannels ;
384
382
} ,
385
383
( runtime , existingLanguageWorkerChannels ) =>
386
384
{
387
- existingLanguageWorkerChannels . Add ( initializedLanguageWorkerChannel . Id , new TaskCompletionSource < IRpcWorkerChannel > ( ) ) ;
385
+ existingLanguageWorkerChannels . TryAdd ( initializedLanguageWorkerChannel . Id , new TaskCompletionSource < IRpcWorkerChannel > ( ) ) ;
388
386
return existingLanguageWorkerChannels ;
389
387
} ) ;
390
388
}
391
389
392
390
internal void SetInitializedWorkerChannel ( string initializedRuntime , IRpcWorkerChannel initializedLanguageWorkerChannel )
393
391
{
394
392
_logger . LogDebug ( "Adding webhost language worker channel for runtime: {language}. workerId:{id}" , initializedRuntime , initializedLanguageWorkerChannel . Id ) ;
395
- if ( _workerChannels . TryGetValue ( initializedRuntime , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > channel ) )
393
+ if ( _workerChannels . TryGetValue ( initializedRuntime , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > channel ) )
396
394
{
397
395
if ( channel . TryGetValue ( initializedLanguageWorkerChannel . Id , out TaskCompletionSource < IRpcWorkerChannel > value ) )
398
396
{
@@ -404,7 +402,7 @@ internal void SetInitializedWorkerChannel(string initializedRuntime, IRpcWorkerC
404
402
internal void SetExceptionOnInitializedWorkerChannel ( string initializedRuntime , IRpcWorkerChannel initializedLanguageWorkerChannel , Exception exception )
405
403
{
406
404
_logger . LogDebug ( "Failed to initialize webhost language worker channel for runtime: {language}. workerId:{id}" , initializedRuntime , initializedLanguageWorkerChannel . Id ) ;
407
- if ( _workerChannels . TryGetValue ( initializedRuntime , out Dictionary < string , TaskCompletionSource < IRpcWorkerChannel > > channel ) )
405
+ if ( _workerChannels . TryGetValue ( initializedRuntime , out ConcurrentDictionary < string , TaskCompletionSource < IRpcWorkerChannel > > channel ) )
408
406
{
409
407
if ( channel . TryGetValue ( initializedLanguageWorkerChannel . Id , out TaskCompletionSource < IRpcWorkerChannel > value ) )
410
408
{
0 commit comments