You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by as...@apache.org on 2024/01/31 17:12:52 UTC

(apisix-ingress-controller) branch master updated: refactor(cmd/ingress): invert signal ctx logic (#2139)

This is an automated email from the ASF dual-hosted git repository.

ashishtiwari pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/apisix-ingress-controller.git


The following commit(s) were added to refs/heads/master by this push:
     new e6e58724 refactor(cmd/ingress): invert signal ctx logic (#2139)
e6e58724 is described below

commit e6e58724ea9da3514254e3d020b562d5031ef94a
Author: Aurelia <au...@acuteaura.net>
AuthorDate: Wed Jan 31 18:12:45 2024 +0100

    refactor(cmd/ingress): invert signal ctx logic (#2139)
    
    * refactor(cmd/ingress): invert signal ctx logic
    
    this commit changes the signal handling in cmd/ingress to be wrapped in
    a context, and inverts which goroutine runs the controller and
    which watches for the context to be cancelled, which allows some
    scaffolding (`sync.WaitGroup`) to be removed and now properly handles
    the controller exiting with `nil` (as it does when leader election
    fails)
---
 cmd/ingress/ingress.go      | 42 ++++++++++++++++++++----------------------
 pkg/providers/controller.go |  9 +++------
 2 files changed, 23 insertions(+), 28 deletions(-)

diff --git a/cmd/ingress/ingress.go b/cmd/ingress/ingress.go
index 3d2311e8..34bb05e7 100644
--- a/cmd/ingress/ingress.go
+++ b/cmd/ingress/ingress.go
@@ -15,12 +15,12 @@
 package ingress
 
 import (
+	"context"
 	"encoding/json"
 	"fmt"
 	"os"
 	"os/signal"
 	"strings"
-	"sync"
 	"syscall"
 	"time"
 
@@ -42,13 +42,19 @@ func dief(template string, args ...interface{}) {
 	os.Exit(1)
 }
 
-func waitForSignal(stopCh chan struct{}) {
-	sigCh := make(chan os.Signal, 1)
-	signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
-
-	sig := <-sigCh
-	log.Infof("signal %d (%s) received", sig, sig.String())
-	close(stopCh)
+func contextWithSignalCancel(ctx context.Context, signals ...os.Signal) context.Context {
+	newCtx, cancel := context.WithCancel(ctx)
+	go func() {
+		sigCh := make(chan os.Signal, 1)
+		signal.Notify(sigCh, signals...)
+
+		sig := <-sigCh
+		log.Infof("signal %d (%s) received", sig, sig.String())
+		signal.Stop(sigCh)
+		close(sigCh)
+		cancel()
+	}()
+	return newCtx
 }
 
 // NewIngressCommand creates the ingress sub command for apisix-ingress-controller.
@@ -118,8 +124,8 @@ the apisix cluster and others are created`,
 				dief("failed to initialize logging: %s", err)
 			}
 			log.DefaultLogger = logger
-			log.Info("init apisix ingress controller")
 
+			log.Info("init apisix ingress controller")
 			log.Info("version:\n", version.Long())
 
 			// We should make sure that the cfg that's logged out is sanitized.
@@ -132,25 +138,17 @@ the apisix cluster and others are created`,
 			}
 			log.Info("use configuration\n", string(data))
 
-			stop := make(chan struct{})
+			ctx := contextWithSignalCancel(context.Background(), syscall.SIGINT, syscall.SIGTERM)
+
 			ingress, err := controller.NewController(cfg)
 			if err != nil {
 				dief("failed to create ingress controller: %s", err)
 			}
-			wg := sync.WaitGroup{}
-			wg.Add(1)
-			go func() {
-				defer wg.Done()
 
-				log.Info("start ingress controller")
-
-				if err := ingress.Run(stop); err != nil {
-					dief("failed to run ingress controller: %s", err)
-				}
-			}()
+			if err := ingress.Run(ctx); err != nil {
+				dief("failed to run ingress controller: %s", err)
+			}
 
-			waitForSignal(stop)
-			wg.Wait()
 			log.Info("apisix ingress controller exited")
 		},
 	}
diff --git a/pkg/providers/controller.go b/pkg/providers/controller.go
index a2ebc253..d8693221 100644
--- a/pkg/providers/controller.go
+++ b/pkg/providers/controller.go
@@ -144,13 +144,10 @@ func (c *Controller) Eventf(_ runtime.Object, eventType string, reason string, m
 }
 
 // Run launches the controller.
-func (c *Controller) Run(stop chan struct{}) error {
-	rootCtx, rootCancel := context.WithCancel(context.Background())
+func (c *Controller) Run(ctx context.Context) error {
+	rootCtx, rootCancel := context.WithCancel(ctx)
 	defer rootCancel()
-	go func() {
-		<-stop
-		rootCancel()
-	}()
+
 	c.MetricsCollector.ResetLeader(false)
 
 	go func() {