Skip to content

Commit 6ed500f

Browse files
authored
fix(operator): memory leak from opening large files (#2218)
* fix(operator): memory leak from opening large files
1 parent 16a878d commit 6ed500f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1138
-519
lines changed

cmd/installer/cli/enable_ha.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ func runEnableHA(ctx context.Context) error {
5454
return fmt.Errorf("unable to get kube client: %w", err)
5555
}
5656

57+
mcli, err := kubeutils.MetadataClient()
58+
if err != nil {
59+
return fmt.Errorf("unable to create metadata client: %w", err)
60+
}
61+
5762
canEnableHA, reason, err := addons.CanEnableHA(ctx, kcli)
5863
if err != nil {
5964
return fmt.Errorf("unable to check if HA can be enabled: %w", err)
@@ -91,5 +96,5 @@ func runEnableHA(ctx context.Context) error {
9196
loading := spinner.Start()
9297
defer loading.Close()
9398

94-
return addons.EnableHA(ctx, logrus.Debugf, kcli, kclient, hcli, in.Spec.Network.ServiceCIDR, in.Spec, loading)
99+
return addons.EnableHA(ctx, logrus.Debugf, kcli, mcli, kclient, hcli, in.Spec.Network.ServiceCIDR, in.Spec, loading)
95100
}

cmd/installer/cli/join.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
"github.com/sirupsen/logrus"
3535
"github.com/spf13/cobra"
3636
"gopkg.in/yaml.v2"
37+
"k8s.io/client-go/metadata"
3738
"sigs.k8s.io/controller-runtime/pkg/client"
3839
k8syaml "sigs.k8s.io/yaml"
3940
)
@@ -186,6 +187,12 @@ func runJoin(ctx context.Context, name string, flags JoinCmdFlags, jcmd *join.Jo
186187
return fmt.Errorf("unable to get kube client: %w", err)
187188
}
188189

190+
mcli, err := kubeutils.MetadataClient()
191+
if err != nil {
192+
loading.ErrorClosef("Failed to install node")
193+
return fmt.Errorf("unable to get metadata client: %w", err)
194+
}
195+
189196
hostname, err := os.Hostname()
190197
if err != nil {
191198
loading.ErrorClosef("Failed to install node")
@@ -207,7 +214,7 @@ func runJoin(ctx context.Context, name string, flags JoinCmdFlags, jcmd *join.Jo
207214
return nil
208215
}
209216

210-
if err := maybeEnableHA(ctx, kcli, flags, cidrCfg.ServiceCIDR, jcmd); err != nil {
217+
if err := maybeEnableHA(ctx, kcli, mcli, flags, cidrCfg.ServiceCIDR, jcmd); err != nil {
211218
return fmt.Errorf("unable to enable high availability: %w", err)
212219
}
213220

@@ -565,7 +572,7 @@ func waitForNodeToJoin(ctx context.Context, kcli client.Client, hostname string,
565572
return nil
566573
}
567574

568-
func maybeEnableHA(ctx context.Context, kcli client.Client, flags JoinCmdFlags, serviceCIDR string, jcmd *join.JoinCommandResponse) error {
575+
func maybeEnableHA(ctx context.Context, kcli client.Client, mcli metadata.Interface, flags JoinCmdFlags, serviceCIDR string, jcmd *join.JoinCommandResponse) error {
569576
if flags.noHA {
570577
logrus.Debug("--no-ha flag provided, skipping high availability")
571578
return nil
@@ -627,6 +634,7 @@ func maybeEnableHA(ctx context.Context, kcli client.Client, flags JoinCmdFlags,
627634
ctx,
628635
logrus.Debugf,
629636
kcli,
637+
mcli,
630638
kclient,
631639
hcli,
632640
serviceCIDR,

cmd/installer/cli/restore.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,6 +559,11 @@ func runRestoreEnableAdminConsoleHA(ctx context.Context, flags InstallCmdFlags,
559559
return fmt.Errorf("unable to create kube client: %w", err)
560560
}
561561

562+
mcli, err := kubeutils.MetadataClient()
563+
if err != nil {
564+
return fmt.Errorf("unable to create metadata client: %w", err)
565+
}
566+
562567
in, err := kubeutils.GetLatestInstallation(ctx, kcli)
563568
if err != nil {
564569
return fmt.Errorf("get latest installation: %w", err)
@@ -579,7 +584,7 @@ func runRestoreEnableAdminConsoleHA(ctx context.Context, flags InstallCmdFlags,
579584
}
580585
defer hcli.Close()
581586

582-
err = addons.EnableAdminConsoleHA(ctx, logrus.Debugf, kcli, hcli, flags.isAirgap, flags.cidrCfg.ServiceCIDR, flags.proxy, in.Spec.Config, in.Spec.LicenseInfo)
587+
err = addons.EnableAdminConsoleHA(ctx, logrus.Debugf, kcli, mcli, hcli, flags.isAirgap, flags.cidrCfg.ServiceCIDR, flags.proxy, in.Spec.Config, in.Spec.LicenseInfo)
583588
if err != nil {
584589
return err
585590
}

e2e/cluster/cmx/cluster.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ func (c *Cluster) waitForClockSync(node int) {
265265
select {
266266
case <-timeout:
267267
stdout, stderr, err := c.RunCommandOnNode(node, []string{"timedatectl show -p NTP -p NTPSynchronized"})
268-
c.t.Fatalf("timeout waiting for clock sync: %v: %s: %s", err, stdout, stderr)
268+
c.t.Fatalf("timeout waiting for clock sync on node %d: %v: %s: %s", node, err, stdout, stderr)
269269
case <-tick:
270270
status, _, _ := c.RunCommandOnNode(node, []string{"timedatectl show -p NTP -p NTPSynchronized"})
271271
if strings.Contains(status, "NTP=yes") && strings.Contains(status, "NTPSynchronized=yes") {

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ require (
370370
golang.org/x/net v0.40.0 // indirect
371371
golang.org/x/oauth2 v0.28.0 // indirect
372372
golang.org/x/sys v0.33.0 // indirect
373-
golang.org/x/text v0.25.0 // indirect
373+
golang.org/x/text v0.25.0
374374
golang.org/x/time v0.9.0 // indirect
375375
google.golang.org/protobuf v1.36.5 // indirect
376376
gopkg.in/inf.v0 v0.9.1 // indirect

operator/controllers/installation_controller.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ import (
4141
"k8s.io/apimachinery/pkg/runtime"
4242
"k8s.io/apimachinery/pkg/types"
4343
"k8s.io/client-go/discovery"
44+
"k8s.io/client-go/metadata"
4445
"k8s.io/client-go/tools/record"
4546
"k8s.io/utils/ptr"
4647
ctrl "sigs.k8s.io/controller-runtime"
@@ -128,9 +129,10 @@ type NodeEventsBatch struct {
128129
// InstallationReconciler reconciles a Installation object
129130
type InstallationReconciler struct {
130131
client.Client
131-
Discovery discovery.DiscoveryInterface
132-
Scheme *runtime.Scheme
133-
Recorder record.EventRecorder
132+
MetadataClient metadata.Interface
133+
Discovery discovery.DiscoveryInterface
134+
Scheme *runtime.Scheme
135+
Recorder record.EventRecorder
134136
}
135137

136138
// NodeHasChanged returns true if the node configuration has changed when compared to
@@ -446,8 +448,19 @@ func (r *InstallationReconciler) reconcileHostCABundle(ctx context.Context) erro
446448
return nil
447449
}
448450

451+
err := r.Get(ctx, types.NamespacedName{Name: "kotsadm"}, &corev1.Namespace{})
452+
if k8serrors.IsNotFound(err) {
453+
// if the namespace has not been created yet, we don't need to reconcile the CA configmap
454+
return nil
455+
} else if err != nil {
456+
return fmt.Errorf("failed to get kotsadm namespace: %w", err)
457+
}
458+
449459
logger := ctrl.LoggerFrom(ctx)
450-
err := adminconsole.EnsureCAConfigmap(ctx, logger.Info, r.Client, caPathInContainer)
460+
logf := func(format string, args ...interface{}) {
461+
logger.Info(fmt.Sprintf(format, args...))
462+
}
463+
err = adminconsole.EnsureCAConfigmap(ctx, logf, r.Client, r.MetadataClient, caPathInContainer)
451464
if k8serrors.IsRequestEntityTooLargeError(err) || errors.Is(err, fs.ErrNotExist) {
452465
logger.Error(err, "Failed to reconcile host ca bundle")
453466
return nil

0 commit comments

Comments
 (0)