in host/src/FunctionsNetHost/Grpc/IncomingGrpcMessageHandler.cs [29:122]
private async Task Process(StreamingMessage msg)
{
if (_specializationDone)
{
// Specialization done. So forward all messages to customer payload.
await MessageChannel.Instance.SendInboundAsync(msg);
return;
}
var responseMessage = new StreamingMessage();
switch (msg.ContentCase)
{
case StreamingMessage.ContentOneofCase.WorkerInitRequest:
{
responseMessage.WorkerInitResponse = BuildWorkerInitResponse();
break;
}
case StreamingMessage.ContentOneofCase.FunctionsMetadataRequest:
{
responseMessage.FunctionMetadataResponse = BuildFunctionMetadataResponse();
break;
}
case StreamingMessage.ContentOneofCase.WorkerWarmupRequest:
{
Logger.LogTrace("Worker warmup request received.");
PreLauncher.Run();
responseMessage.WorkerWarmupResponse = new WorkerWarmupResponse
{
Result = new StatusResult { Status = StatusResult.Types.Status.Success }
};
break;
}
case StreamingMessage.ContentOneofCase.FunctionEnvironmentReloadRequest:
Configuration.Reload();
Logger.LogTrace("Specialization request received.");
var envReloadRequest = msg.FunctionEnvironmentReloadRequest;
var workerConfig = await WorkerConfigUtils.GetWorkerConfig(envReloadRequest.FunctionAppDirectory);
if (workerConfig?.Description is null)
{
Logger.LogTrace($"Could not find a worker config in {envReloadRequest.FunctionAppDirectory}");
responseMessage.FunctionEnvironmentReloadResponse = BuildFailedEnvironmentReloadResponse();
break;
}
// function app payload which uses an older version of Microsoft.Azure.Functions.Worker package does not support specialization.
if (!workerConfig.Description.CanUsePlaceholder)
{
Logger.LogTrace("App payload uses an older version of Microsoft.Azure.Functions.Worker SDK which does not support placeholder.");
var e = new EnvironmentReloadNotSupportedException("This app is not using the latest version of Microsoft.Azure.Functions.Worker SDK and therefore does not leverage all performance optimizations. See https://aka.ms/azure-functions/dotnet/placeholders for more information.");
responseMessage.FunctionEnvironmentReloadResponse = BuildFailedEnvironmentReloadResponse(e);
break;
}
var applicationExePath = Path.Combine(envReloadRequest.FunctionAppDirectory, workerConfig.Description.DefaultWorkerPath!);
Logger.LogTrace($"application path {applicationExePath}");
foreach (var kv in envReloadRequest.EnvironmentVariables)
{
EnvironmentUtils.SetValue(kv.Key, kv.Value);
}
#pragma warning disable CS4014
Task.Run(() =>
#pragma warning restore CS4014
{
_ = _appLoader.RunApplication(applicationExePath);
});
Logger.LogTrace($"Will wait for worker loaded signal.");
WorkerLoadStatusSignalManager.Instance.Signal.WaitOne();
var logMessage = $"FunctionApp assembly loaded successfully. ProcessId:{Environment.ProcessId}";
if (OperatingSystem.IsWindows())
{
logMessage += $", AppPoolId:{Environment.GetEnvironmentVariable(EnvironmentVariables.AppPoolId)}";
}
Logger.Log(logMessage);
await MessageChannel.Instance.SendInboundAsync(msg);
_specializationDone = true;
break;
}
if (responseMessage.ContentCase != StreamingMessage.ContentOneofCase.None)
{
await MessageChannel.Instance.SendOutboundAsync(responseMessage);
}
}