@@ -6,10 +6,12 @@ import (
6
6
"fmt"
7
7
"io"
8
8
"os"
9
+ "os/signal"
9
10
"path"
10
11
"path/filepath"
11
12
"runtime"
12
13
"strings"
14
+ "syscall"
13
15
"time"
14
16
15
17
"github.com/containers/podman/v5/pkg/machine"
@@ -440,6 +442,7 @@ func stopLocked(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *mach
440
442
func Start (mc * vmconfigs.MachineConfig , mp vmconfigs.VMProvider , dirs * machineDefine.MachineDirs , opts machine.StartOptions ) error {
441
443
defaultBackoff := 500 * time .Millisecond
442
444
maxBackoffs := 6
445
+ signalChanClosed := false
443
446
444
447
mc .Lock ()
445
448
defer mc .Unlock ()
@@ -471,17 +474,41 @@ func Start(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *machineDe
471
474
}
472
475
}
473
476
477
+ // if the machine cannot continue starting due to a signal, ensure the state
478
+ // reflects the machine is no longer starting
479
+ signalChan := make (chan os.Signal , 1 )
480
+ signal .Notify (signalChan , os .Interrupt , syscall .SIGTERM )
481
+ go func () {
482
+ sig , ok := <- signalChan
483
+ if ok {
484
+ mc .Starting = false
485
+ logrus .Error ("signal received when starting the machine: " , sig )
486
+
487
+ if err := mc .Write (); err != nil {
488
+ logrus .Error (err )
489
+ }
490
+
491
+ os .Exit (1 )
492
+ }
493
+ }()
494
+
474
495
// Set starting to true
475
496
mc .Starting = true
476
497
if err := mc .Write (); err != nil {
477
498
logrus .Error (err )
478
499
}
500
+
479
501
// Set starting to false on exit
480
502
defer func () {
481
503
mc .Starting = false
482
504
if err := mc .Write (); err != nil {
483
505
logrus .Error (err )
484
506
}
507
+
508
+ if ! signalChanClosed {
509
+ signal .Stop (signalChan )
510
+ close (signalChan )
511
+ }
485
512
}()
486
513
487
514
gvproxyPidFile , err := dirs .RuntimeDir .AppendToNewVMFile ("gvproxy.pid" , nil )
@@ -557,6 +584,11 @@ func Start(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *machineDe
557
584
return errors .New (msg )
558
585
}
559
586
587
+ // now that the machine has transitioned into the running state, we don't need a goroutine listening for SIGINT or SIGTERM to handle state
588
+ signal .Stop (signalChan )
589
+ close (signalChan )
590
+ signalChanClosed = true
591
+
560
592
if err := proxyenv .ApplyProxies (mc ); err != nil {
561
593
return err
562
594
}
0 commit comments