func handleInvoke()

in lambda/rapid/start.go [513:565]


func handleInvoke(ctx context.Context, execCtx *rapidContext, watchdog *core.Watchdog, invokeRequest *interop.Invoke) {
	interopServer, appCtx := execCtx.interopServer, execCtx.appCtx

	invokeMx := invokeMetrics{}

	if invokeRequest.ResyncState.IsResyncReceived {
		err := execCtx.credentialsService.UpdateCredentials(invokeRequest.ResyncState.AwsKey, invokeRequest.ResyncState.AwsSecret, invokeRequest.ResyncState.AwsSession)
		execCtx.credentialsService.UnblockService()

		if err != nil {
			log.WithError(err).WithField("InvokeID", invokeRequest.ID).Error("Resync for Invoke failed")
			doneFailMsg := generateDoneFail(execCtx, invokeRequest.CorrelationID, &invokeMx, invokeRequest.InvokeReceivedTime)
			handleInvokeError(doneFailMsg, execCtx, invokeRequest.ID, interopServer, err)
		}
	}

	if err := doInvoke(ctx, execCtx, watchdog, invokeRequest, &invokeMx); err != nil {
		log.WithError(err).WithField("InvokeID", invokeRequest.ID).Error("Invoke failed")
		doneFailMsg := generateDoneFail(execCtx, invokeRequest.CorrelationID, &invokeMx, invokeRequest.InvokeReceivedTime)
		handleInvokeError(doneFailMsg, execCtx, invokeRequest.ID, interopServer, err)
		return
	}

	if err := execCtx.interopServer.CommitResponse(); err != nil {
		log.Panic(err)
	}

	var invokeCompletionTimeNs int64
	if responseTimeNs := execCtx.registrationService.GetRuntime().GetRuntimeDescription().State.ResponseTimeNs; responseTimeNs != 0 {
		invokeCompletionTimeNs = time.Now().UnixNano() - responseTimeNs
	}

	doneMsg := &interop.Done{
		CorrelationID: invokeRequest.CorrelationID,
		Meta: interop.DoneMetadata{
			RuntimeRelease:          appctx.GetRuntimeRelease(appCtx),
			NumActiveExtensions:     execCtx.registrationService.CountAgents(),
			ExtensionNames:          execCtx.GetExtensionNames(),
			InvokeRequestReadTimeNs: invokeMx.rendererMetrics.ReadTime.Nanoseconds(),
			InvokeRequestSizeBytes:  int64(invokeMx.rendererMetrics.SizeBytes),
			InvokeCompletionTimeNs:  invokeCompletionTimeNs,
			InvokeReceivedTime:      invokeRequest.InvokeReceivedTime,
			RuntimeReadyTime:        invokeMx.runtimeReadyTime,
		},
	}
	if execCtx.telemetryAPIEnabled {
		doneMsg.Meta.LogsAPIMetrics = execCtx.logsSubscriptionAPI.FlushMetrics()
	}

	if err := interopServer.SendDone(doneMsg); err != nil {
		log.Panic(err)
	}
}