Skip to content

Commit cdcef6d

Browse files
Fix setting jvm heap size params
Signed-off-by: patelsmit32123 <[email protected]>
1 parent d6dce30 commit cdcef6d

File tree

4 files changed

+117
-34
lines changed

4 files changed

+117
-34
lines changed

opensearch-operator/pkg/builders/cluster.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,8 @@ func NewSTSForNodePool(
169169
// vendor ="elasticsearch"
170170
}
171171

172-
jvm := helpers.CalculateJvmHeapSize(&node)
172+
jvmHeapSizeSettings := helpers.CalculateJvmHeapSizeSettings(node.Resources.Requests.Memory())
173+
jvm := helpers.AppendJvmHeapSizeSettings(node.Jvm, jvmHeapSizeSettings)
173174

174175
// If node role `search` defined add required experimental flag if version less than 2.7
175176
if helpers.ContainsString(selectedRoles, "search") && helpers.CompareVersions(cr.Spec.General.Version, "2.7.0") {
@@ -788,12 +789,8 @@ func NewBootstrapPod(
788789
}
789790
resources := cr.Spec.Bootstrap.Resources
790791

791-
var jvm string
792-
if cr.Spec.Bootstrap.Jvm == "" {
793-
jvm = "-Xmx512M -Xms512M"
794-
} else {
795-
jvm = cr.Spec.Bootstrap.Jvm
796-
}
792+
jvmHeapSizeSettings := helpers.CalculateJvmHeapSizeSettings(cr.Spec.Bootstrap.Resources.Requests.Memory())
793+
jvm := helpers.AppendJvmHeapSizeSettings(cr.Spec.Bootstrap.Jvm, jvmHeapSizeSettings)
797794

798795
image := helpers.ResolveImage(cr, nil)
799796
initHelperImage := helpers.ResolveInitHelperImage(cr)

opensearch-operator/pkg/builders/cluster_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -279,7 +279,7 @@ var _ = Describe("Builders", func() {
279279

280280
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
281281
Name: "OPENSEARCH_JAVA_OPTS",
282-
Value: "-Xmx512M -Xms512M -Dopensearch.experimental.feature.searchable_snapshot.enabled=true -Dopensearch.transport.cname_in_publish_address=true",
282+
Value: "-Xms512M -Xmx512M -Dopensearch.experimental.feature.searchable_snapshot.enabled=true -Dopensearch.transport.cname_in_publish_address=true",
283283
}))
284284
})
285285

@@ -297,7 +297,7 @@ var _ = Describe("Builders", func() {
297297

298298
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
299299
Name: "OPENSEARCH_JAVA_OPTS",
300-
Value: "-Xmx512M -Xms512M -Dopensearch.transport.cname_in_publish_address=true",
300+
Value: "-Xms512M -Xmx512M -Dopensearch.transport.cname_in_publish_address=true",
301301
}))
302302
})
303303

@@ -355,7 +355,7 @@ var _ = Describe("Builders", func() {
355355
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
356356
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
357357
Name: "OPENSEARCH_JAVA_OPTS",
358-
Value: "-Xmx1024M -Xms1024M -Dopensearch.transport.cname_in_publish_address=true",
358+
Value: "-Xms1024M -Xmx1024M -Dopensearch.transport.cname_in_publish_address=true",
359359
}))
360360
})
361361
It("should set jvm to half of memory request when memory request is fraction and jvm are not provided", func() {
@@ -370,7 +370,7 @@ var _ = Describe("Builders", func() {
370370
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
371371
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
372372
Name: "OPENSEARCH_JAVA_OPTS",
373-
Value: "-Xmx768M -Xms768M -Dopensearch.transport.cname_in_publish_address=true",
373+
Value: "-Xms768M -Xmx768M -Dopensearch.transport.cname_in_publish_address=true",
374374
}))
375375
})
376376

@@ -386,7 +386,7 @@ var _ = Describe("Builders", func() {
386386
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
387387
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
388388
Name: "OPENSEARCH_JAVA_OPTS",
389-
Value: "-Xmx953M -Xms953M -Dopensearch.transport.cname_in_publish_address=true",
389+
Value: "-Xms953M -Xmx953M -Dopensearch.transport.cname_in_publish_address=true",
390390
}))
391391
})
392392
It("should set jvm to default when memory request and jvm are not provided", func() {
@@ -395,24 +395,24 @@ var _ = Describe("Builders", func() {
395395
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
396396
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
397397
Name: "OPENSEARCH_JAVA_OPTS",
398-
Value: "-Xmx512M -Xms512M -Dopensearch.transport.cname_in_publish_address=true",
398+
Value: "-Xms512M -Xmx512M -Dopensearch.transport.cname_in_publish_address=true",
399399
}))
400400
})
401401
It("should set NodePool.Jvm as jvm when it jvm is provided", func() {
402402
clusterObject := ClusterDescWithVersion("2.2.1")
403403
nodePool := opsterv1.NodePool{
404-
Jvm: "-Xmx1024M -Xms1024M",
404+
Jvm: "-Xms1024M -Xmx1024M",
405405
}
406406
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
407407
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
408408
Name: "OPENSEARCH_JAVA_OPTS",
409-
Value: "-Xmx1024M -Xms1024M -Dopensearch.transport.cname_in_publish_address=true",
409+
Value: "-Xms1024M -Xmx1024M -Dopensearch.transport.cname_in_publish_address=true",
410410
}))
411411
})
412412
It("should set NodePool.jvm as jvm when jvm and memory request are provided", func() {
413413
clusterObject := ClusterDescWithVersion("2.2.1")
414414
nodePool := opsterv1.NodePool{
415-
Jvm: "-Xmx1024M -Xms1024M",
415+
Jvm: "-Xms1024M -Xmx1024M",
416416
Resources: corev1.ResourceRequirements{
417417
Requests: corev1.ResourceList{
418418
corev1.ResourceMemory: resource.MustParse("4Gi"),
@@ -422,7 +422,7 @@ var _ = Describe("Builders", func() {
422422
result := NewSTSForNodePool("foobar", &clusterObject, nodePool, "foobar", nil, nil, nil)
423423
Expect(result.Spec.Template.Spec.Containers[0].Env).To(ContainElement(corev1.EnvVar{
424424
Name: "OPENSEARCH_JAVA_OPTS",
425-
Value: "-Xmx1024M -Xms1024M -Dopensearch.transport.cname_in_publish_address=true",
425+
Value: "-Xms1024M -Xmx1024M -Dopensearch.transport.cname_in_publish_address=true",
426426
}))
427427
})
428428
})

opensearch-operator/pkg/helpers/helpers.go

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import (
55
"errors"
66
"fmt"
77
"io"
8+
"k8s.io/apimachinery/pkg/api/resource"
89
"log"
910
"reflect"
1011
"sort"
12+
"strings"
1113
"time"
1214

1315
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
@@ -439,25 +441,23 @@ func ComposePDB(cr *opsterv1.OpenSearchCluster, nodepool *opsterv1.NodePool) pol
439441
return newpdb
440442
}
441443

442-
func CalculateJvmHeapSize(nodePool *opsterv1.NodePool) string {
443-
jvmHeapSizeTemplate := "-Xmx%s -Xms%s"
444-
445-
if nodePool.Jvm == "" {
446-
memoryLimit := nodePool.Resources.Requests.Memory()
447-
448-
// Memory request is not present
449-
if memoryLimit.IsZero() {
450-
return fmt.Sprintf(jvmHeapSizeTemplate, "512M", "512M")
451-
}
452-
453-
// Set Java Heap size to half of the node pool memory size
454-
megabytes := float64((memoryLimit.Value() / 2) / 1024.0 / 1024.0)
455-
456-
heapSize := fmt.Sprintf("%vM", megabytes)
457-
return fmt.Sprintf(jvmHeapSizeTemplate, heapSize, heapSize)
444+
func AppendJvmHeapSizeSettings(jvm string, heapSizeSettings string) string {
445+
if strings.Contains(jvm, "Xms") || strings.Contains(jvm, "Xmx") {
446+
return jvm
447+
}
448+
if jvm == "" {
449+
return heapSizeSettings
458450
}
451+
return fmt.Sprintf("%s %s", jvm, heapSizeSettings)
452+
}
459453

460-
return nodePool.Jvm
454+
func CalculateJvmHeapSizeSettings(memoryRequest *resource.Quantity) string {
455+
var memoryRequestMb int64 = 512
456+
if memoryRequest != nil && !memoryRequest.IsZero() {
457+
memoryRequestMb = ((memoryRequest.Value() / 2.0) / 1024.0) / 1024.0
458+
}
459+
// Set Java Heap size to half of the node pool memory request for both Xms and Xmx
460+
return fmt.Sprintf("-Xms%dM -Xmx%dM", memoryRequestMb, memoryRequestMb)
461461
}
462462

463463
func IsUpgradeInProgress(status opsterv1.ClusterStatus) bool {
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package helpers
2+
3+
import (
4+
. "github.com/onsi/ginkgo/v2"
5+
. "github.com/onsi/gomega"
6+
"k8s.io/apimachinery/pkg/api/resource"
7+
)
8+
9+
var _ = Describe("JVM Heap Size Functions", func() {
10+
Describe("AppendJvmHeapSizeSettings", func() {
11+
Context("when JVM string already contains Xmx", func() {
12+
It("should return the original JVM string unchanged", func() {
13+
jvm := "-XX:+UseG1GC -Xmx2g -XX:MaxDirectMemorySize=1g"
14+
heapSizeSettings := "-Xms1g -Xmx2g"
15+
16+
result := AppendJvmHeapSizeSettings(jvm, heapSizeSettings)
17+
18+
Expect(result).To(Equal(jvm))
19+
})
20+
})
21+
22+
Context("when JVM string already contains Xms", func() {
23+
It("should return the original JVM string unchanged", func() {
24+
jvm := "-XX:+UseG1GC -Xms1g -XX:MaxDirectMemorySize=1g"
25+
heapSizeSettings := "-Xms1g -Xmx2g"
26+
27+
result := AppendJvmHeapSizeSettings(jvm, heapSizeSettings)
28+
29+
Expect(result).To(Equal(jvm))
30+
})
31+
})
32+
33+
Context("when JVM string is empty", func() {
34+
It("should return only the heap size settings", func() {
35+
jvm := ""
36+
heapSizeSettings := "-Xmx1g -Xms1g"
37+
38+
result := AppendJvmHeapSizeSettings(jvm, heapSizeSettings)
39+
40+
Expect(result).To(Equal(heapSizeSettings))
41+
})
42+
})
43+
44+
Context("when JVM string does not contain Xmx or Xms", func() {
45+
It("should append the heap size settings", func() {
46+
jvm := "-XX:+UseG1GC -XX:MaxDirectMemorySize=1g"
47+
heapSizeSettings := "-Xmx1g -Xms1g"
48+
expected := "-XX:+UseG1GC -XX:MaxDirectMemorySize=1g -Xmx1g -Xms1g"
49+
50+
result := AppendJvmHeapSizeSettings(jvm, heapSizeSettings)
51+
52+
Expect(result).To(Equal(expected))
53+
})
54+
})
55+
})
56+
57+
Describe("CalculateJvmHeapSizeSettings", func() {
58+
Context("when memory request is nil", func() {
59+
It("should return default 512M for both Xms and Xmx", func() {
60+
result := CalculateJvmHeapSizeSettings(nil)
61+
62+
Expect(result).To(Equal("-Xms512M -Xmx512M"))
63+
})
64+
})
65+
66+
Context("when memory request is zero", func() {
67+
It("should return default 512M for both Xms and Xmx", func() {
68+
memoryRequest := resource.MustParse("0")
69+
70+
result := CalculateJvmHeapSizeSettings(&memoryRequest)
71+
72+
Expect(result).To(Equal("-Xms512M -Xmx512M"))
73+
})
74+
})
75+
76+
Context("when memory request is provided", func() {
77+
It("should calculate both Xms and Xmx from request", func() {
78+
memoryRequest := resource.MustParse("2Gi")
79+
80+
result := CalculateJvmHeapSizeSettings(&memoryRequest)
81+
82+
Expect(result).To(Equal("-Xms1024M -Xmx1024M"))
83+
})
84+
})
85+
})
86+
})

0 commit comments

Comments
 (0)