in lambda/rapid/handlers.go [592:636]
func handleInit(execCtx *rapidContext, initRequest *interop.Init, initSuccessResponse chan<- interop.InitSuccess, initFailureResponse chan<- interop.InitFailure) {
if execCtx.initCachingEnabled {
var err error
if initRequest, err = execCtx.acceptInitRequestForInitCaching(initRequest); err != nil {
// TODO: call handleInitError only after sending the RUNNING, since
// Slicer will fail receiving DONEFAIL here as it is expecting RUNNING
handleInitError(execCtx, initRequest.InvokeID, err, initFailureResponse)
return
}
} else {
initRequest = execCtx.acceptInitRequest(initRequest)
}
if err := setupEventsWatcher(execCtx); err != nil {
handleInitError(execCtx, initRequest.InvokeID, err, initFailureResponse)
return
}
if !initRequest.SuppressInit {
// doRuntimeDomainInit() is used in both init/invoke, so the signature requires sbInfo arg
sbInfo := interop.SandboxInfoFromInit{
EnvironmentVariables: initRequest.EnvironmentVariables,
SandboxType: initRequest.SandboxType,
RuntimeBootstrap: initRequest.Bootstrap,
}
if err := doRuntimeDomainInit(execCtx, sbInfo, interop.LifecyclePhaseInit); err != nil {
handleInitError(execCtx, initRequest.InvokeID, err, initFailureResponse)
return
}
}
initSuccessMsg := interop.InitSuccess{
RuntimeRelease: appctx.GetRuntimeRelease(execCtx.appCtx),
NumActiveExtensions: execCtx.registrationService.CountAgents(),
ExtensionNames: execCtx.GetExtensionNames(),
Ack: make(chan struct{}),
}
if execCtx.telemetryAPIEnabled {
initSuccessMsg.LogsAPIMetrics = interop.MergeSubscriptionMetrics(execCtx.logsSubscriptionAPI.FlushMetrics(), execCtx.telemetrySubscriptionAPI.FlushMetrics())
}
initSuccessResponse <- initSuccessMsg
<-initSuccessMsg.Ack
}