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
}