mirror of
				https://github.com/ClusterCockpit/cc-metric-collector.git
				synced 2025-10-31 17:05:07 +01:00 
			
		
		
		
	Handle shutdown sequentially
This commit is contained in:
		| @@ -151,11 +151,8 @@ func (cm *collectorManager) AddOutput(output chan lp.CCMetric) { | ||||
|  | ||||
| // Close finishes / stops the metric collector manager | ||||
| func (cm *collectorManager) Close() { | ||||
| 	select { | ||||
| 	case cm.done <- true: | ||||
| 	default: | ||||
| 	} | ||||
| 	cclog.ComponentDebug("CollectorManager", "CLOSE") | ||||
| 	cm.done <- true | ||||
| } | ||||
|  | ||||
| // New creates a new initialized metric collector manager | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import ( | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 	"time" | ||||
|  | ||||
| 	lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric" | ||||
| 	"golang.org/x/sys/unix" | ||||
| ) | ||||
|   | ||||
| @@ -225,18 +225,12 @@ func (r *metricRouter) AddOutput(output chan lp.CCMetric) { | ||||
|  | ||||
| // Close finishes / stops the metric router | ||||
| func (r *metricRouter) Close() { | ||||
| 	select { | ||||
| 	case r.done <- true: | ||||
| 	default: | ||||
| 	} | ||||
| 	cclog.ComponentDebug("MetricRouter", "CLOSE") | ||||
| 	r.done <- true | ||||
| 	if r.config.IntervalStamp { | ||||
| 		cclog.ComponentDebug("MetricRouter", "TIMER CLOSE") | ||||
| 		select { | ||||
| 		case r.timerdone <- true: | ||||
| 		default: | ||||
| 		r.timerdone <- true | ||||
| 	} | ||||
| 	} | ||||
| 	cclog.ComponentDebug("MetricRouter", "CLOSE") | ||||
| } | ||||
|  | ||||
| // New creates a new initialized metric router | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| package multiChanTicker | ||||
|  | ||||
| import ( | ||||
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger" | ||||
| 	"time" | ||||
|  | ||||
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger" | ||||
| ) | ||||
|  | ||||
| type multiChanTicker struct { | ||||
| @@ -49,8 +50,8 @@ func (t *multiChanTicker) AddChannel(channel chan time.Time) { | ||||
| } | ||||
|  | ||||
| func (t *multiChanTicker) Close() { | ||||
| 	t.done <- true | ||||
| 	cclog.ComponentDebug("MultiChanTicker", "CLOSE") | ||||
| 	t.done <- true | ||||
| } | ||||
|  | ||||
| func NewTicker(duration time.Duration) MultiChanTicker { | ||||
|   | ||||
| @@ -6,6 +6,7 @@ import ( | ||||
| 	"os" | ||||
| 	"os/signal" | ||||
| 	"strings" | ||||
| 	"syscall" | ||||
|  | ||||
| 	"github.com/ClusterCockpit/cc-metric-collector/collectors" | ||||
| 	"github.com/ClusterCockpit/cc-metric-collector/receivers" | ||||
| @@ -154,10 +155,19 @@ func ReadCli() map[string]string { | ||||
| //	return nil | ||||
| //} | ||||
|  | ||||
| // General shutdown function that gets executed in case of interrupt or graceful shutdown | ||||
| func shutdown(config *RuntimeConfig) { | ||||
| // General shutdownHandler function that gets executed in case of interrupt or graceful shutdownHandler | ||||
| func shutdownHandler(config *RuntimeConfig, shutdownSignal chan os.Signal) { | ||||
| 	<-shutdownSignal | ||||
|  | ||||
| 	// Remove shutdown handler | ||||
| 	// every additional interrupt signal will stop without cleaning up | ||||
| 	signal.Stop(shutdownSignal) | ||||
|  | ||||
| 	cclog.Info("Shutdown...") | ||||
|  | ||||
| 	cclog.Debug("Shutdown Ticker...") | ||||
| 	config.Ticker.Close() | ||||
|  | ||||
| 	if config.CollectManager != nil { | ||||
| 		cclog.Debug("Shutdown CollectManager...") | ||||
| 		config.CollectManager.Close() | ||||
| @@ -182,18 +192,6 @@ func shutdown(config *RuntimeConfig) { | ||||
| 	config.Sync.Done() | ||||
| } | ||||
|  | ||||
| // Register an interrupt handler for Ctrl+C and similar. At signal, | ||||
| // all collectors are closed | ||||
| func prepare_shutdown(config *RuntimeConfig) { | ||||
| 	sigs := make(chan os.Signal, 1) | ||||
| 	signal.Notify(sigs, os.Interrupt) | ||||
|  | ||||
| 	go func(config *RuntimeConfig) { | ||||
| 		<-sigs | ||||
| 		shutdown(config) | ||||
| 	}(config) | ||||
| } | ||||
|  | ||||
| func mainFunc() int { | ||||
| 	var err error | ||||
| 	use_recv := false | ||||
| @@ -249,7 +247,7 @@ func mainFunc() int { | ||||
| 			cclog.Error(err.Error()) | ||||
| 			return 1 | ||||
| 		} | ||||
| 		RouterToSinksChannel := make(chan lp.CCMetric) | ||||
| 		RouterToSinksChannel := make(chan lp.CCMetric, 200) | ||||
| 		rcfg.SinkManager.AddInput(RouterToSinksChannel) | ||||
| 		rcfg.Router.AddOutput(RouterToSinksChannel) | ||||
| 	} | ||||
| @@ -259,7 +257,7 @@ func mainFunc() int { | ||||
| 			cclog.Error(err.Error()) | ||||
| 			return 1 | ||||
| 		} | ||||
| 		CollectToRouterChannel := make(chan lp.CCMetric) | ||||
| 		CollectToRouterChannel := make(chan lp.CCMetric, 200) | ||||
| 		rcfg.CollectManager.AddOutput(CollectToRouterChannel) | ||||
| 		rcfg.Router.AddCollectorInput(CollectToRouterChannel) | ||||
| 	} | ||||
| @@ -269,12 +267,17 @@ func mainFunc() int { | ||||
| 			cclog.Error(err.Error()) | ||||
| 			return 1 | ||||
| 		} | ||||
| 		ReceiveToRouterChannel := make(chan lp.CCMetric) | ||||
| 		ReceiveToRouterChannel := make(chan lp.CCMetric, 200) | ||||
| 		rcfg.ReceiveManager.AddOutput(ReceiveToRouterChannel) | ||||
| 		rcfg.Router.AddReceiverInput(ReceiveToRouterChannel) | ||||
| 		use_recv = true | ||||
| 	} | ||||
| 	prepare_shutdown(&rcfg) | ||||
|  | ||||
| 	shutdownSignal := make(chan os.Signal, 1) | ||||
| 	signal.Notify(shutdownSignal, os.Interrupt) | ||||
| 	signal.Notify(shutdownSignal, syscall.SIGTERM) | ||||
| 	go shutdownHandler(&rcfg, shutdownSignal) | ||||
|  | ||||
| 	rcfg.Sync.Add(1) | ||||
| 	rcfg.Router.Start() | ||||
| 	rcfg.SinkManager.Start() | ||||
| @@ -288,10 +291,10 @@ func mainFunc() int { | ||||
| 	if rcfg.CliArgs["once"] == "true" { | ||||
| 		x := 1.2 * float64(rcfg.ConfigFile.Interval) | ||||
| 		time.Sleep(time.Duration(int(x)) * time.Second) | ||||
| 		shutdown(&rcfg) | ||||
| 		shutdownSignal <- os.Interrupt | ||||
| 	} | ||||
|  | ||||
| 	// Wait until receiving an interrupt | ||||
| 	// Wait until shutdownHandler is executed | ||||
| 	rcfg.Sync.Wait() | ||||
| 	return 0 | ||||
| } | ||||
|   | ||||
| @@ -2,10 +2,11 @@ package receivers | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric" | ||||
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger" | ||||
| 	"os" | ||||
| 	"sync" | ||||
|  | ||||
| 	cclog "github.com/ClusterCockpit/cc-metric-collector/internal/ccLogger" | ||||
| 	lp "github.com/ClusterCockpit/cc-metric-collector/internal/ccMetric" | ||||
| ) | ||||
|  | ||||
| var AvailableReceivers = map[string]Receiver{ | ||||
|   | ||||
| @@ -68,10 +68,11 @@ func (sm *sinkManager) Start() { | ||||
| 	go func() { | ||||
| 		done := func() { | ||||
| 			for _, s := range sm.outputs { | ||||
| 				s.Flush() | ||||
| 				s.Close() | ||||
| 			} | ||||
| 			cclog.ComponentDebug("SinkManager", "DONE") | ||||
| 			sm.wg.Done() | ||||
| 			cclog.ComponentDebug("SinkManager", "DONE") | ||||
| 		} | ||||
| 		for { | ||||
| 			select { | ||||
| @@ -128,11 +129,8 @@ func (sm *sinkManager) AddOutput(rawConfig json.RawMessage) error { | ||||
| } | ||||
|  | ||||
| func (sm *sinkManager) Close() { | ||||
| 	select { | ||||
| 	case sm.done <- true: | ||||
| 	default: | ||||
| 	} | ||||
| 	cclog.ComponentDebug("SinkManager", "CLOSE") | ||||
| 	sm.done <- true | ||||
| } | ||||
|  | ||||
| func New(wg *sync.WaitGroup, sinkConfigFile string) (SinkManager, error) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user