@@ -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"
@@ -58,7 +59,7 @@ type InstanceOptions struct {
58
59
ReloadQueue utils.QueueFacade
59
60
ReloadStrategy string
60
61
SortEndpointsBy string
61
- StopCh <- chan struct {}
62
+ StopCtx context. Context
62
63
TrackInstances bool
63
64
ValidateConfig bool
64
65
// TODO Fake is used to skip real haproxy calls. Use a mock instead.
@@ -83,7 +84,7 @@ func CreateInstance(logger types.Logger, options InstanceOptions) Instance {
83
84
waitProc : make (chan struct {}),
84
85
logger : logger ,
85
86
options : & options ,
86
- conns : newConnections (options .MasterSocket , options .AdminSocket ),
87
+ conns : newConnections (options .StopCtx , options . MasterSocket , options .AdminSocket ),
87
88
metrics : options .Metrics ,
88
89
//
89
90
haproxyTmpl : template .CreateConfig (),
@@ -648,7 +649,7 @@ func (i *instance) reloadEmbeddedDaemon() error {
648
649
func (i * instance ) reloadEmbeddedMasterWorker () error {
649
650
i .embdStart .Do (func () {
650
651
go func () {
651
- wait .Until (i .startHAProxySync , 4 * time .Second , i . options . StopCh )
652
+ wait .UntilWithContext (i .options . StopCtx , i . startHAProxySync , 4 * time .Second )
652
653
close (i .waitProc )
653
654
}()
654
655
})
@@ -665,7 +666,7 @@ func (i *instance) reloadEmbeddedMasterWorker() error {
665
666
return i .waitWorker (prevReloads )
666
667
}
667
668
668
- func (i * instance ) startHAProxySync () {
669
+ func (i * instance ) startHAProxySync (ctx context. Context ) {
669
670
cmd := exec .Command (
670
671
"haproxy" ,
671
672
"-W" ,
@@ -692,7 +693,7 @@ func (i *instance) startHAProxySync() {
692
693
close (wait )
693
694
}()
694
695
select {
695
- case <- i . options . StopCh :
696
+ case <- ctx . Done () :
696
697
i .logger .Info ("stopping haproxy master process (pid: %d)" , cmd .Process .Pid )
697
698
if err := cmd .Process .Signal (syscall .SIGTERM ); err != nil {
698
699
i .logger .Error ("error stopping haproxy process: %v" , err )
@@ -726,14 +727,14 @@ func (i *instance) waitMaster() error {
726
727
errCh := make (chan error )
727
728
masterSock := i .conns .Master ()
728
729
go func () {
729
- _ , err := socket .HAProxyProcs (masterSock )
730
+ _ , err := socket .HAProxyProcs (i . options . StopCtx , masterSock )
730
731
errCh <- err
731
732
}()
732
733
for {
733
734
select {
734
735
case err := <- errCh :
735
736
return err
736
- case <- i .options .StopCh :
737
+ case <- i .options .StopCtx . Done () :
737
738
return fmt .Errorf ("received sigterm" )
738
739
case <- time .After (10 * time .Second ):
739
740
i .logger .Info ("... still waiting for the master socket '%s'" , masterSock .Address ())
@@ -747,7 +748,7 @@ func (i *instance) reloadWorker() (int, error) {
747
748
i .logger .Warn ("failed to persist servers state before worker reload: %w" , err )
748
749
}
749
750
}
750
- procs , err := socket .HAProxyProcs (i .conns .Master ())
751
+ procs , err := socket .HAProxyProcs (i .options . StopCtx , i . conns .Master ())
751
752
if err != nil {
752
753
return 0 , fmt .Errorf ("error reading haproxy procs: %w" , err )
753
754
}
@@ -758,12 +759,17 @@ func (i *instance) reloadWorker() (int, error) {
758
759
}
759
760
760
761
func (i * instance ) waitWorker (prevReloads int ) error {
761
- out , err := socket .HAProxyProcs (i .conns .Master ())
762
+ out , err := socket .HAProxyProcs (i .options . StopCtx , i . conns .Master ())
762
763
for err == nil && out .Master .Reloads <= prevReloads {
763
- // continues to wait until we can see `reloads` greater than the previous one.
764
- time .Sleep (time .Second )
765
- i .logger .Info ("reconnecting to master socket. current-reloads=%d prev-reloads=%d" , out .Master .Reloads , prevReloads )
766
- out , err = socket .HAProxyProcs (i .conns .Master ())
764
+ // Continues to wait until we can see `Reloads` greater than the previous one.
765
+ // This is needed on 2.6 and older, whose `reload` command runs async.
766
+ select {
767
+ case <- time .After (time .Second ):
768
+ case <- i .options .StopCtx .Done ():
769
+ return fmt .Errorf ("received sigterm" )
770
+ }
771
+ i .logger .Info ("reconnecting master socket. current-reloads=%d prev-reloads=%d" , out .Master .Reloads , prevReloads )
772
+ out , err = socket .HAProxyProcs (i .options .StopCtx , i .conns .Master ())
767
773
}
768
774
if err != nil {
769
775
return fmt .Errorf ("error reading procs from master socket: %w" , err )
0 commit comments