1
0
mirror of https://github.com/containers/podman.git synced 2026-02-05 06:45:31 +01:00
Files
podman/pkg/machine/gvproxy.go
lstocchi ca44e3a4d7 Fix race condition in CleanupGVProxy when reading gvproxy PID file
When startVM fails quickly, CleanupGVProxy may attempt to read the
gvproxy.pid file before gvproxy has written it, causing cleanup to
fail.

This commit adds retry logic that waits up to 2 seconds for the PID
file to appear.

Signed-off-by: lstocchi <lstocchi@redhat.com>
2026-01-09 08:07:04 +01:00

56 lines
1.2 KiB
Go

package machine
import (
"errors"
"fmt"
"io/fs"
"strconv"
"time"
"github.com/containers/podman/v6/pkg/machine/define"
)
const (
pidFileWaitTimeout = 2 * time.Second
pidFileCheckInterval = 50 * time.Millisecond
)
func readPIDFileWithRetry(f define.VMFile) ([]byte, error) {
deadline := time.Now().Add(pidFileWaitTimeout)
for time.Now().Before(deadline) {
gvPid, err := f.Read()
if err == nil {
return gvPid, nil
}
if !errors.Is(err, fs.ErrNotExist) {
return nil, err
}
time.Sleep(pidFileCheckInterval)
}
// Final attempt after timeout
return f.Read()
}
// CleanupGVProxy reads the --pid-file for gvproxy attempts to stop it
func CleanupGVProxy(f define.VMFile) error {
gvPid, err := readPIDFileWithRetry(f)
if err != nil {
// The file will also be removed by gvproxy when it exits so
// we need to account for the race and can just ignore it here.
if errors.Is(err, fs.ErrNotExist) {
return nil
}
return fmt.Errorf("unable to read gvproxy pid file: %v", err)
}
proxyPid, err := strconv.Atoi(string(gvPid))
if err != nil {
return fmt.Errorf("unable to convert pid to integer: %v", err)
}
if err := waitOnProcess(proxyPid); err != nil {
return err
}
return removeGVProxyPIDFile(f)
}