From 09134c8c79b177dcbdcef16c30f72a7407b0c75b Mon Sep 17 00:00:00 2001 From: Sergey Yedrikov Date: Sat, 27 Apr 2019 12:56:54 -0400 Subject: [PATCH 1/2] compile-time assert numControllers == len(controllersArray) --- cmd/controller/main.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 348c4e6ecf2f..90759c011034 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -102,7 +102,7 @@ func main() { // Build all of our controllers, with the clients constructed above. // Add new controllers to this array. - controllers := []*controller.Impl{ + controllersArray := [...]*controller.Impl{ configuration.NewController( opt, configurationInformer, @@ -147,9 +147,9 @@ func main() { endpointsInformer, ), } - if len(controllers) != numControllers { - logger.Fatalf("Number of controllers and QPS settings mismatch: %d != %d", len(controllers), numControllers) - } + controllers := controllersArray[:] + // compile-time assert numControllers == len(controllersArray) + var _ [numControllers - len(controllersArray)][len(controllersArray) - numControllers]int // Watch the logging config map and dynamically update logging levels. opt.ConfigMapWatcher.Watch(logging.ConfigMapName(), logging.UpdateLevelFromConfigMap(logger, atomicLevel, component)) From 5925a8d162ea61ef40fbc649a47f27bcba3cbc94 Mon Sep 17 00:00:00 2001 From: Sergey Yedrikov Date: Mon, 29 Apr 2019 13:46:50 -0400 Subject: [PATCH 2/2] Incorporated review feedback from @grantr --- cmd/controller/main.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cmd/controller/main.go b/cmd/controller/main.go index 80a7f9fa5af5..d729db7bd2a5 100644 --- a/cmd/controller/main.go +++ b/cmd/controller/main.go @@ -102,7 +102,7 @@ func main() { // Build all of our controllers, with the clients constructed above. // Add new controllers to this array. - controllersArray := [...]*controller.Impl{ + controllers := [...]*controller.Impl{ configuration.NewController( opt, configurationInformer, @@ -147,9 +147,12 @@ func main() { endpointsInformer, ), } - controllers := controllersArray[:] - // compile-time assert numControllers == len(controllersArray) - var _ [numControllers - len(controllersArray)][len(controllersArray) - numControllers]int + // This line asserts at compile time that the length of controllers is equal to numControllers. + // It is based on https://go101.org/article/tips.html#assert-at-compile-time, which notes that + // var _ [N-M]int + // asserts at compile time that N >= M, which we can use to establish equality of N and M: + // (N >= M) && (M >= N) => (N == M) + var _ [numControllers - len(controllers)][len(controllers) - numControllers]int // Watch the logging config map and dynamically update logging levels. opt.ConfigMapWatcher.Watch(logging.ConfigMapName(), logging.UpdateLevelFromConfigMap(logger, atomicLevel, component)) @@ -181,7 +184,7 @@ func main() { // Start all of the controllers. logger.Info("Starting controllers.") - controller.StartAll(stopCh, controllers...) + controller.StartAll(stopCh, controllers[:]...) } func flush(logger *zap.SugaredLogger) {