Skip to content

Commit ab16c25

Browse files
committed
MEDIUM: Fixed reload handling
On reload (SIGUSR1) we now reload the runtime API client by rereading the configuration, and we use a separate signal (SIGUSR2) to reread the config file. Use case is when you write the file manually you can reread the config to memory using SIGUSR2 signal. This will stop additional disk I/O every time haproxy master process sends SIGUSR1 signal to the dataplane API when started from program section.
1 parent af6c8a4 commit ab16c25

File tree

1 file changed

+42
-22
lines changed

1 file changed

+42
-22
lines changed

configure_data_plane.go

+42-22
Original file line numberDiff line numberDiff line change
@@ -129,20 +129,12 @@ func configureAPI(api *operations.DataPlaneAPI) http.Handler {
129129

130130
api.ServerShutdown = serverShutdown
131131

132-
c := configureNativeClient()
133-
client := &c
132+
client := configureNativeClient()
134133

135134
// Handle reload signals
136135
sigs := make(chan os.Signal, 1)
137-
signal.Notify(sigs, syscall.SIGUSR1)
138-
139-
go func() {
140-
sig := <-sigs
141-
if sig == syscall.SIGUSR1 {
142-
c = configureNativeClient()
143-
log.Info("Reloaded Data Plane API")
144-
}
145-
}()
136+
signal.Notify(sigs, syscall.SIGUSR1, syscall.SIGUSR2)
137+
go handleSignals(sigs, client)
146138

147139
// Initialize reload agent
148140
ra := &haproxy.ReloadAgent{}
@@ -476,7 +468,7 @@ func serverShutdown() {
476468
}
477469
}
478470

479-
func configureNativeClient() client_native.HAProxyClient {
471+
func configureNativeClient() *client_native.HAProxyClient {
480472
// Override options with env variables
481473
if os.Getenv("HAPROXY_MWORKER") == "1" {
482474
masterRuntime := os.Getenv("HAPROXY_MASTER_CLI")
@@ -490,16 +482,9 @@ func configureNativeClient() client_native.HAProxyClient {
490482
haproxyOptions.ConfigFile = cfg[0]
491483
}
492484
// Initialize HAProxy native client
493-
confClient := &configuration.Client{}
494-
confParams := configuration.ClientParams{
495-
ConfigurationFile: haproxyOptions.ConfigFile,
496-
Haproxy: haproxyOptions.HAProxy,
497-
UseValidation: false,
498-
TransactionDir: haproxyOptions.TransactionDir,
499-
}
500-
err := confClient.Init(confParams)
485+
confClient, err := configureConfigurationClient()
501486
if err != nil {
502-
log.Fatalf("Error setting up configuration client: %s", err.Error())
487+
log.Fatalf(err.Error())
503488
}
504489

505490
runtimeClient := configureRuntimeClient(confClient)
@@ -508,7 +493,23 @@ func configureNativeClient() client_native.HAProxyClient {
508493
log.Fatalf("Error setting up native client: %s", err.Error())
509494
}
510495

511-
return *client
496+
return client
497+
}
498+
499+
func configureConfigurationClient() (*configuration.Client, error) {
500+
confClient := &configuration.Client{}
501+
confParams := configuration.ClientParams{
502+
ConfigurationFile: haproxyOptions.ConfigFile,
503+
Haproxy: haproxyOptions.HAProxy,
504+
UseValidation: false,
505+
PersistentTransactions: false,
506+
TransactionDir: haproxyOptions.TransactionDir,
507+
}
508+
err := confClient.Init(confParams)
509+
if err != nil {
510+
return nil, fmt.Errorf("Error setting up configuration client: %s", err.Error())
511+
}
512+
return confClient, nil
512513
}
513514

514515
func configureRuntimeClient(confClient *configuration.Client) *runtime_api.Client {
@@ -551,3 +552,22 @@ func configureRuntimeClient(confClient *configuration.Client) *runtime_api.Clien
551552
}
552553
return runtimeClient
553554
}
555+
556+
func handleSignals(sigs chan os.Signal, client *client_native.HAProxyClient) {
557+
for {
558+
select {
559+
case sig := <-sigs:
560+
if sig == syscall.SIGUSR1 {
561+
client.Runtime = configureRuntimeClient(client.Configuration)
562+
log.Info("Reloaded Data Plane API")
563+
} else if sig == syscall.SIGUSR2 {
564+
confClient, err := configureConfigurationClient()
565+
if err != nil {
566+
log.Fatalf(err.Error())
567+
}
568+
log.Info("Rereading Configuration Files")
569+
client.Configuration = confClient
570+
}
571+
}
572+
}
573+
}

0 commit comments

Comments
 (0)