clean up socket and pid files from podman machine

to avoid segvs, we should clean up as much of the socket and regular
files from podman machine as possible on stop.  also, on start, we
should add logic to remove these files before starting in case the start
process is stopped prematurely (due to an error for example).

[NO TESTS NEEDED]

Signed-off-by: Brent Baude <bbaude@redhat.com>
This commit is contained in:
Brent Baude
2021-08-27 10:32:02 -05:00
parent 266a3892f2
commit a2a166345e

View File

@ -244,6 +244,7 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
qemuSocketConn net.Conn qemuSocketConn net.Conn
wait time.Duration = time.Millisecond * 500 wait time.Duration = time.Millisecond * 500
) )
if err := v.startHostNetworking(); err != nil { if err := v.startHostNetworking(); err != nil {
return errors.Errorf("unable to start host networking: %q", err) return errors.Errorf("unable to start host networking: %q", err)
} }
@ -264,7 +265,11 @@ func (v *MachineVM) Start(name string, _ machine.StartOptions) error {
if err != nil { if err != nil {
return err return err
} }
// If the qemusocketpath exists and the vm is off/down, we should rm
// it before the dial as to avoid a segv
if err := os.Remove(qemuSocketPath); err != nil && !errors.Is(err, os.ErrNotExist) {
logrus.Warn(err)
}
for i := 0; i < 6; i++ { for i := 0; i < 6; i++ {
qemuSocketConn, err = net.Dial("unix", qemuSocketPath) qemuSocketConn, err = net.Dial("unix", qemuSocketPath)
if err == nil { if err == nil {
@ -352,7 +357,7 @@ func (v *MachineVM) Stop(name string, _ machine.StopOptions) error {
if _, err = qmpMonitor.Run(input); err != nil { if _, err = qmpMonitor.Run(input); err != nil {
return err return err
} }
_, pidFile, err := v.getSocketandPid() qemuSocketFile, pidFile, err := v.getSocketandPid()
if err != nil { if err != nil {
return err return err
} }
@ -373,7 +378,16 @@ func (v *MachineVM) Stop(name string, _ machine.StopOptions) error {
if p == nil && err != nil { if p == nil && err != nil {
return err return err
} }
return p.Kill() // Kill the process
if err := p.Kill(); err != nil {
return err
}
// Remove the pidfile
if err := os.Remove(pidFile); err != nil && !errors.Is(err, os.ErrNotExist) {
logrus.Warn(err)
}
// Remove socket
return os.Remove(qemuSocketFile)
} }
// NewQMPMonitor creates the monitor subsection of our vm // NewQMPMonitor creates the monitor subsection of our vm