@@ -16,16 +16,22 @@ namespace Microsoft.Azure.WebJobs.Script.Rpc
1616 public class RpcInitializationService : IHostedService
1717 {
1818 private readonly IOptionsMonitor < ScriptApplicationHostOptions > _applicationHostOptions ;
19-
19+ private readonly IEnvironment _environment ;
2020 private readonly ILanguageWorkerChannelManager _languageWorkerChannelManager ;
2121 private readonly IRpcServer _rpcServer ;
2222 private readonly ILogger _logger ;
2323
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 )
2530 {
2631 _applicationHostOptions = applicationHostOptions ?? throw new ArgumentNullException ( nameof ( applicationHostOptions ) ) ;
2732 _logger = loggerFactory . CreateLogger ( ScriptConstants . LogCategoryRpcInitializationService ) ;
2833 _rpcServer = rpcServer ;
34+ _environment = environment ;
2935 _languageWorkerChannelManager = languageWorkerChannelManager ?? throw new ArgumentNullException ( nameof ( languageWorkerChannelManager ) ) ;
3036 }
3137
@@ -35,19 +41,19 @@ public async Task StartAsync(CancellationToken cancellationToken)
3541 {
3642 return ;
3743 }
38- _logger . LogInformation ( "Initializing Rpc Channels Manager " ) ;
44+ _logger . LogInformation ( "Starting Rpc Initialization Service. " ) ;
3945 await InitializeRpcServerAsync ( ) ;
40- await _languageWorkerChannelManager . InitializeAsync ( ) ;
46+ await InitializeChannelsAsync ( ) ;
4147 }
4248
4349 public async Task StopAsync ( CancellationToken cancellationToken )
4450 {
4551 _logger . LogInformation ( "Shuttingdown Rpc Channels Manager" ) ;
46- await _rpcServer . KillAsync ( ) ;
4752 await _languageWorkerChannelManager . ShutdownChannelsAsync ( ) ;
53+ await _rpcServer . KillAsync ( ) ;
4854 }
4955
50- private async Task InitializeRpcServerAsync ( )
56+ internal async Task InitializeRpcServerAsync ( )
5157 {
5258 try
5359 {
@@ -59,5 +65,31 @@ private async Task InitializeRpcServerAsync()
5965 var hostInitEx = new HostInitializationException ( $ "Failed to start Rpc Server. Check if your app is hitting connection limits.", grpcInitEx ) ;
6066 }
6167 }
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 ) ;
6294 }
6395}
0 commit comments