@@ -16,16 +16,22 @@ namespace Microsoft.Azure.WebJobs.Script.Rpc
16
16
public class RpcInitializationService : IHostedService
17
17
{
18
18
private readonly IOptionsMonitor < ScriptApplicationHostOptions > _applicationHostOptions ;
19
-
19
+ private readonly IEnvironment _environment ;
20
20
private readonly ILanguageWorkerChannelManager _languageWorkerChannelManager ;
21
21
private readonly IRpcServer _rpcServer ;
22
22
private readonly ILogger _logger ;
23
23
24
- public RpcInitializationService ( IOptionsMonitor < ScriptApplicationHostOptions > applicationHostOptions , IRpcServer rpcServer , ILanguageWorkerChannelManager languageWorkerChannelManager , ILoggerFactory loggerFactory )
24
+ private List < string > _languages = new List < string > ( )
25
+ {
26
+ LanguageWorkerConstants . JavaLanguageWorkerName
27
+ } ;
28
+
29
+ public RpcInitializationService ( IOptionsMonitor < ScriptApplicationHostOptions > applicationHostOptions , IEnvironment environment , IRpcServer rpcServer , ILanguageWorkerChannelManager languageWorkerChannelManager , ILoggerFactory loggerFactory )
25
30
{
26
31
_applicationHostOptions = applicationHostOptions ?? throw new ArgumentNullException ( nameof ( applicationHostOptions ) ) ;
27
32
_logger = loggerFactory . CreateLogger ( ScriptConstants . LogCategoryRpcInitializationService ) ;
28
33
_rpcServer = rpcServer ;
34
+ _environment = environment ;
29
35
_languageWorkerChannelManager = languageWorkerChannelManager ?? throw new ArgumentNullException ( nameof ( languageWorkerChannelManager ) ) ;
30
36
}
31
37
@@ -35,19 +41,19 @@ public async Task StartAsync(CancellationToken cancellationToken)
35
41
{
36
42
return ;
37
43
}
38
- _logger . LogInformation ( "Initializing Rpc Channels Manager " ) ;
44
+ _logger . LogInformation ( "Starting Rpc Initialization Service. " ) ;
39
45
await InitializeRpcServerAsync ( ) ;
40
- await _languageWorkerChannelManager . InitializeAsync ( ) ;
46
+ await InitializeChannelsAsync ( ) ;
41
47
}
42
48
43
49
public async Task StopAsync ( CancellationToken cancellationToken )
44
50
{
45
51
_logger . LogInformation ( "Shuttingdown Rpc Channels Manager" ) ;
46
- await _rpcServer . KillAsync ( ) ;
47
52
await _languageWorkerChannelManager . ShutdownChannelsAsync ( ) ;
53
+ await _rpcServer . KillAsync ( ) ;
48
54
}
49
55
50
- private async Task InitializeRpcServerAsync ( )
56
+ internal async Task InitializeRpcServerAsync ( )
51
57
{
52
58
try
53
59
{
@@ -59,5 +65,31 @@ private async Task InitializeRpcServerAsync()
59
65
var hostInitEx = new HostInitializationException ( $ "Failed to start Rpc Server. Check if your app is hitting connection limits.", grpcInitEx ) ;
60
66
}
61
67
}
68
+
69
+ internal Task InitializeChannelsAsync ( )
70
+ {
71
+ string workerRuntime = _environment . GetEnvironmentVariable ( LanguageWorkerConstants . FunctionWorkerRuntimeSettingName ) ;
72
+ if ( _environment . IsLinuxAppServiceEnvironment ( ) )
73
+ {
74
+ return Task . CompletedTask ;
75
+ }
76
+ if ( _environment . IsLinuxContainerEnvironment ( ) )
77
+ {
78
+ return Task . CompletedTask ;
79
+ }
80
+ if ( string . IsNullOrEmpty ( workerRuntime ) && _environment . IsPlaceholderModeEnabled ( ) )
81
+ {
82
+ // Only warm up language workers in placeholder mode in worker runtime is not set
83
+ return Task . WhenAll ( _languages . Select ( runtime => _languageWorkerChannelManager . InitializeChannelAsync ( runtime ) ) ) ;
84
+ }
85
+ if ( _languages . Contains ( workerRuntime ) )
86
+ {
87
+ return _languageWorkerChannelManager . InitializeChannelAsync ( workerRuntime ) ;
88
+ }
89
+ return Task . CompletedTask ;
90
+ }
91
+
92
+ // To help with unit tests
93
+ internal void AddSupportedRuntime ( string language ) => _languages . Add ( language ) ;
62
94
}
63
95
}
0 commit comments