func()

in pkg/procmanager/procmanager.go [65:112]


func (pm *ProcManager) RunWithRetries(
	ctx context.Context,
	args []string,
	stdIn io.Reader,
	stdOut io.Writer,
	stdErr io.Writer,
	cmdDir string,
	retries int,
	retryOnErrors []string,
	retryDelay int,
	containerName string) error {
	attempt := 0
	var err error
	for attempt <= retries {
		log.Printf("Launching container with name: %s\n", containerName)

		var stdOutBuf, stdErrBuf bytes.Buffer
		var stdOutWriter, stdErrWriter io.Writer

		needToCheckError := len(retryOnErrors) > 0

		if needToCheckError {
			stdOutWriter = io.MultiWriter(&stdOutBuf, stdOut)
			stdErrWriter = io.MultiWriter(&stdErrBuf, stdErr)
		} else {
			stdOutWriter = stdOut
			stdErrWriter = stdErr
		}

		if err = pm.Run(ctx, args, stdIn, stdOutWriter, stdErrWriter, cmdDir); err == nil {
			log.Printf("Successfully executed container: %s\n", containerName)
			break
		}

		attempt++
		if attempt <= retries {
			if !needToCheckError || containsAnyError(retryOnErrors, &stdOutBuf, &stdErrBuf) {
				log.Printf("Container failed during run: %s, waiting %d seconds before retrying...\n", containerName, retryDelay)
				time.Sleep(time.Duration(retryDelay) * time.Second)
				continue
			}
		}

		log.Printf("Container failed during run: %s. No retries remaining.\n", containerName)
		break
	}
	return err
}