Skip to content

Commit

Permalink
Merge pull request #3026 from mjudeikis/memory.leak.fix
Browse files Browse the repository at this point in the history
🐛 Memory leak fix in mutating & validating webhooks
  • Loading branch information
kcp-ci-bot committed Oct 16, 2023
2 parents 5fcd442 + 758db95 commit f1a70e6
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 8 deletions.
20 changes: 16 additions & 4 deletions pkg/admission/mutatingwebhook/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"errors"
"fmt"
"io"
"sync"

kcpkubernetesinformers "github.com/kcp-dev/client-go/informers"
kcpkubernetesclientset "github.com/kcp-dev/client-go/kubernetes"
Expand Down Expand Up @@ -54,6 +55,9 @@ type Plugin struct {
globalKubeSharedInformerFactory kcpkubernetesinformers.SharedInformerFactory

getAPIBindings func(clusterName logicalcluster.Name) ([]*apisv1alpha1.APIBinding, error)

managerLock sync.Mutex
managersCache map[logicalcluster.Name]generic.Source
}

var (
Expand All @@ -66,7 +70,9 @@ var (

func NewMutatingAdmissionWebhook(configFile io.Reader) (*Plugin, error) {
p := &Plugin{
Handler: admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update),
managerLock: sync.Mutex{},
managersCache: make(map[logicalcluster.Name]generic.Source),
Handler: admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update),
}
if configFile != nil {
config, err := io.ReadAll(configFile)
Expand Down Expand Up @@ -125,9 +131,15 @@ func (p *Plugin) getHookSource(clusterName logicalcluster.Name, groupResource sc
return nil, err
}

return configuration.NewMutatingWebhookConfigurationManagerForInformer(
p.globalKubeSharedInformerFactory.Admissionregistration().V1().MutatingWebhookConfigurations().Cluster(clusterNameForGroupResource),
), nil
p.managerLock.Lock()
defer p.managerLock.Unlock()
if _, ok := p.managersCache[clusterNameForGroupResource]; !ok {
p.managersCache[clusterNameForGroupResource] = configuration.NewMutatingWebhookConfigurationManagerForInformer(
p.globalKubeSharedInformerFactory.Admissionregistration().V1().MutatingWebhookConfigurations().Cluster(clusterNameForGroupResource),
)
}

return p.managersCache[clusterNameForGroupResource], nil
}

func (p *Plugin) getSourceClusterForGroupResource(clusterName logicalcluster.Name, groupResource schema.GroupResource) (logicalcluster.Name, error) {
Expand Down
20 changes: 16 additions & 4 deletions pkg/admission/validatingwebhook/plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
"errors"
"fmt"
"io"
"sync"

kcpkubernetesinformers "github.com/kcp-dev/client-go/informers"
kcpkubernetesclientset "github.com/kcp-dev/client-go/kubernetes"
Expand Down Expand Up @@ -54,6 +55,9 @@ type Plugin struct {
globalKubeSharedInformerFactory kcpkubernetesinformers.SharedInformerFactory

getAPIBindings func(clusterName logicalcluster.Name) ([]*apisv1alpha1.APIBinding, error)

managerLock sync.Mutex
managersCache map[logicalcluster.Name]generic.Source
}

var (
Expand All @@ -66,7 +70,9 @@ var (

func NewValidatingAdmissionWebhook(configFile io.Reader) (*Plugin, error) {
p := &Plugin{
Handler: admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update),
managerLock: sync.Mutex{},
managersCache: make(map[logicalcluster.Name]generic.Source),
Handler: admission.NewHandler(admission.Connect, admission.Create, admission.Delete, admission.Update),
}
if configFile != nil {
config, err := io.ReadAll(configFile)
Expand Down Expand Up @@ -125,9 +131,15 @@ func (p *Plugin) getHookSource(clusterName logicalcluster.Name, groupResource sc
return nil, err
}

return configuration.NewValidatingWebhookConfigurationManagerForInformer(
p.globalKubeSharedInformerFactory.Admissionregistration().V1().ValidatingWebhookConfigurations().Cluster(clusterNameForGroupResource),
), nil
p.managerLock.Lock()
defer p.managerLock.Unlock()
if _, ok := p.managersCache[clusterNameForGroupResource]; !ok {
p.managersCache[clusterNameForGroupResource] = configuration.NewValidatingWebhookConfigurationManagerForInformer(
p.globalKubeSharedInformerFactory.Admissionregistration().V1().ValidatingWebhookConfigurations().Cluster(clusterNameForGroupResource),
)
}

return p.managersCache[clusterNameForGroupResource], nil
}

func (p *Plugin) getSourceClusterForGroupResource(clusterName logicalcluster.Name, groupResource schema.GroupResource) (logicalcluster.Name, error) {
Expand Down

0 comments on commit f1a70e6

Please sign in to comment.