func handleReset()

in lambda/rapid/start.go [588:640]


func handleReset(execCtx *rapidContext, watchdog *core.Watchdog, reset *interop.Reset) {
	log.Warnf("Reset initiated: %s", reset.Reason)
	if execCtx.initCachingEnabled {
		execCtx.credentialsService.UnblockService()
	}

	if err := execCtx.eventsAPI.SendRuntimeDone(reset.Reason); err != nil {
		log.Errorf("Failed to send RUNDONE: %s", err)
	}

	profiler := metering.ExtensionsResetDurationProfiler{}
	gracefulShutdown(execCtx, watchdog, &profiler, reset.DeadlineNs, execCtx.standaloneMode, reset.Reason)

	extensionsResetMs, resetTimeout := profiler.CalculateExtensionsResetMs()

	meta := interop.DoneMetadata{
		ExtensionsResetMs: extensionsResetMs,
	}

	if !execCtx.standaloneMode {
		// GIRP interopServer implementation sends GIRP RSTFAIL/RSTDONE
		if resetTimeout {
			// TODO: DoneFail must contain a reset timeout ErrorType for rapid local to distinguish errors
			doneFail := &interop.DoneFail{CorrelationID: reset.CorrelationID, Meta: meta}
			if err := execCtx.interopServer.SendDoneFail(doneFail); err != nil {
				log.Panicf("Failed to SendDoneFail: %s", err)
			}
		} else {
			done := &interop.Done{CorrelationID: reset.CorrelationID, Meta: meta}
			if err := execCtx.interopServer.SendDone(done); err != nil {
				log.Panicf("Failed to SendDone: %s", err)
			}
		}

		os.Exit(0)
	}

	reinitialize(execCtx, watchdog)

	fatalErrorType, _ := appctx.LoadFirstFatalError(execCtx.appCtx)

	if resetTimeout {
		doneFail := &interop.DoneFail{CorrelationID: reset.CorrelationID, ErrorType: fatalErrorType, Meta: meta}
		if err := execCtx.interopServer.SendDoneFail(doneFail); err != nil {
			log.Panicf("Failed to SendDoneFail: %s", err)
		}
	} else {
		done := &interop.Done{CorrelationID: reset.CorrelationID, ErrorType: fatalErrorType, Meta: meta}
		if err := execCtx.interopServer.SendDone(done); err != nil {
			log.Panicf("Failed to SendDone: %s", err)
		}
	}
}