From 026bb0ec396744e93f870b624b6871de85de0ff9 Mon Sep 17 00:00:00 2001 From: Brad Davidson Date: Wed, 30 Aug 2023 02:34:32 +0000 Subject: [PATCH] Add RWMutex to address controller Fixes race condition when address map is updated by multiple goroutines Signed-off-by: Brad Davidson (cherry picked from commit 0d23cfe038ef22d7ca899764e9aaeea8a39d4874) Signed-off-by: Brad Davidson --- pkg/cluster/address_controller.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/cluster/address_controller.go b/pkg/cluster/address_controller.go index 6b80d39e28..8b9b23503a 100644 --- a/pkg/cluster/address_controller.go +++ b/pkg/cluster/address_controller.go @@ -2,6 +2,7 @@ package cluster import ( "context" + "sync" "github.com/k3s-io/k3s/pkg/util" controllerv1 "github.com/rancher/wrangler/pkg/generated/controllers/core/v1" @@ -26,6 +27,8 @@ func registerAddressHandlers(ctx context.Context, c *Cluster) { } type addressesHandler struct { + sync.RWMutex + nodeController controllerv1.NodeController allowed map[string]bool } @@ -37,6 +40,9 @@ func (a *addressesHandler) filterCN(cns ...string) []string { return cns } + a.RLock() + defer a.RUnlock() + filteredCNs := make([]string, 0, len(cns)) for _, cn := range cns { if a.allowed[cn] { @@ -52,6 +58,9 @@ func (a *addressesHandler) filterCN(cns ...string) []string { func (a *addressesHandler) sync(key string, node *v1.Node) (*v1.Node, error) { if node != nil { if node.Labels[util.ControlPlaneRoleLabelKey] != "" || node.Labels[util.ETCDRoleLabelKey] != "" { + a.Lock() + defer a.Unlock() + for _, address := range node.Status.Addresses { a.allowed[address.String()] = true }