@@ -17,6 +17,7 @@ limitations under the License.
17
17
package haproxy
18
18
19
19
import (
20
+ "context"
20
21
"fmt"
21
22
"os"
22
23
"os/exec"
@@ -59,7 +60,7 @@ type InstanceOptions struct {
59
60
ReloadQueue * workqueue.WorkQueue [any ]
60
61
ReloadStrategy string
61
62
SortEndpointsBy string
62
- StopCh <- chan struct {}
63
+ StopCtx context. Context
63
64
TrackInstances bool
64
65
ValidateConfig bool
65
66
// TODO Fake is used to skip real haproxy calls. Use a mock instead.
@@ -84,7 +85,7 @@ func CreateInstance(logger types.Logger, options InstanceOptions) Instance {
84
85
waitProc : make (chan struct {}),
85
86
logger : logger ,
86
87
options : & options ,
87
- conns : newConnections (options .MasterSocket , options .AdminSocket ),
88
+ conns : newConnections (options .StopCtx , options . MasterSocket , options .AdminSocket ),
88
89
metrics : options .Metrics ,
89
90
//
90
91
haproxyTmpl : template .CreateConfig (),
@@ -638,7 +639,7 @@ func (i *instance) reloadEmbeddedDaemon() error {
638
639
func (i * instance ) reloadEmbeddedMasterWorker () error {
639
640
i .embdStart .Do (func () {
640
641
go func () {
641
- wait .Until (i .startHAProxySync , 4 * time .Second , i . options . StopCh )
642
+ wait .UntilWithContext (i .options . StopCtx , i . startHAProxySync , 4 * time .Second )
642
643
close (i .waitProc )
643
644
}()
644
645
})
@@ -655,7 +656,7 @@ func (i *instance) reloadEmbeddedMasterWorker() error {
655
656
return i .waitWorker (prevReloads )
656
657
}
657
658
658
- func (i * instance ) startHAProxySync () {
659
+ func (i * instance ) startHAProxySync (ctx context. Context ) {
659
660
cmd := exec .Command (
660
661
"haproxy" ,
661
662
"-W" ,
@@ -682,7 +683,7 @@ func (i *instance) startHAProxySync() {
682
683
close (wait )
683
684
}()
684
685
select {
685
- case <- i . options . StopCh :
686
+ case <- ctx . Done () :
686
687
i .logger .Info ("stopping haproxy master process (pid: %d)" , cmd .Process .Pid )
687
688
if err := cmd .Process .Signal (syscall .SIGTERM ); err != nil {
688
689
i .logger .Error ("error stopping haproxy process: %v" , err )
@@ -716,14 +717,14 @@ func (i *instance) waitMaster() error {
716
717
errCh := make (chan error )
717
718
masterSock := i .conns .Master ()
718
719
go func () {
719
- _ , err := socket .HAProxyProcs (masterSock )
720
+ _ , err := socket .HAProxyProcs (i . options . StopCtx , masterSock )
720
721
errCh <- err
721
722
}()
722
723
for {
723
724
select {
724
725
case err := <- errCh :
725
726
return err
726
- case <- i .options .StopCh :
727
+ case <- i .options .StopCtx . Done () :
727
728
return fmt .Errorf ("received sigterm" )
728
729
case <- time .After (10 * time .Second ):
729
730
i .logger .Info ("... still waiting for the master socket '%s'" , masterSock .Address ())
@@ -737,7 +738,7 @@ func (i *instance) reloadWorker() (int, error) {
737
738
i .logger .Warn ("failed to persist servers state before worker reload: %w" , err )
738
739
}
739
740
}
740
- procs , err := socket .HAProxyProcs (i .conns .Master ())
741
+ procs , err := socket .HAProxyProcs (i .options . StopCtx , i . conns .Master ())
741
742
if err != nil {
742
743
return 0 , fmt .Errorf ("error reading haproxy procs: %w" , err )
743
744
}
@@ -756,17 +757,17 @@ func (i *instance) reloadWorker() (int, error) {
756
757
}
757
758
758
759
func (i * instance ) waitWorker (prevReloads int ) error {
759
- out , err := socket .HAProxyProcs (i .conns .Master ())
760
+ out , err := socket .HAProxyProcs (i .options . StopCtx , i . conns .Master ())
760
761
for err == nil && out .Master .Reloads <= prevReloads {
761
762
// Continues to wait until we can see `Reloads` greater than the previous one.
762
763
// This is needed on 2.6 and older, whose `reload` command runs async.
763
764
select {
764
765
case <- time .After (time .Second ):
765
- case <- i .options .StopCh :
766
+ case <- i .options .StopCtx . Done () :
766
767
return fmt .Errorf ("received sigterm" )
767
768
}
768
769
i .logger .Info ("reconnecting master socket. current-reloads=%d prev-reloads=%d" , out .Master .Reloads , prevReloads )
769
- out , err = socket .HAProxyProcs (i .conns .Master ())
770
+ out , err = socket .HAProxyProcs (i .options . StopCtx , i . conns .Master ())
770
771
}
771
772
if err != nil {
772
773
return fmt .Errorf ("error reading procs from master socket: %w" , err )
0 commit comments