aboutsummaryrefslogtreecommitdiffstats
path: root/config-model/src
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2024-06-05 18:55:14 +0200
committerjonmv <venstad@gmail.com>2024-06-05 18:55:14 +0200
commit7aab86389175e7af4b5769863c4f06652cb28398 (patch)
tree54a3a4358d136a993965ed5531bc3a11f1dc3712 /config-model/src
parent31b51c7a2057d8dce70c7185b84bc379be336c68 (diff)
Truncate app container heap size to 4 significant bits (when hosted)
Diffstat (limited to 'config-model/src')
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java15
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java25
2 files changed, 37 insertions, 3 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
index 531dc8f0fcf..cc570d47907 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ApplicationContainerCluster.java
@@ -315,16 +315,25 @@ public final class ApplicationContainerCluster extends ContainerCluster<Applicat
public void getConfig(QrStartConfig.Builder builder) {
super.getConfig(builder);
var memoryPct = getMemoryPercentage().orElse(null);
- int heapsize = memoryPct != null && memoryPct.asAbsoluteGb().isPresent()
- ? (int) (memoryPct.asAbsoluteGb().getAsDouble() * 1024) : 1536;
+ int heapsize = truncateTo4SignificantBits(memoryPct != null && memoryPct.asAbsoluteGb().isPresent()
+ ? (int) (memoryPct.asAbsoluteGb().getAsDouble() * 1024) : 1536);
builder.jvm.verbosegc(true)
.availableProcessors(0)
.compressedClassSpaceSize(0)
- .minHeapsize(heapsize)
+ .minHeapsize(heapsize) // These cause restarts when changed, so we try to keep them stable.
.heapsize(heapsize);
if (memoryPct != null) builder.jvm.heapSizeAsPercentageOfPhysicalMemory(memoryPct.ofContainerAvailable());
}
+ static int truncateTo4SignificantBits(int i) {
+ if (i == Integer.MIN_VALUE) return i;
+ if (i < 0) return -truncateTo4SignificantBits(-i);
+ if (i <= 16) return i;
+ int mask = Integer.highestOneBit(i);
+ mask += mask - (mask >> 3);
+ return i & mask;
+ }
+
@Override
public void getConfig(ZookeeperServerConfig.Builder builder) {
if (getParent() instanceof ConfigserverCluster) return; // Produces its own config
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
index 9cf34b55ebf..93362e144a6 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
@@ -49,6 +49,7 @@ import static com.yahoo.config.model.api.ApplicationClusterEndpoint.Scope.zone;
import static com.yahoo.config.provision.SystemName.main;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
@@ -498,4 +499,28 @@ public class ContainerClusterTest {
(extra.isEmpty() ? "" : " " + extra);
}
+ @Test
+ void testTruncationTo4Bits() {
+ assertEquals(0, ApplicationContainerCluster.truncateTo4SignificantBits(0));
+ assertEquals(1, ApplicationContainerCluster.truncateTo4SignificantBits(1));
+ assertEquals(15, ApplicationContainerCluster.truncateTo4SignificantBits(15));
+ assertEquals(16, ApplicationContainerCluster.truncateTo4SignificantBits(16));
+ assertEquals(16, ApplicationContainerCluster.truncateTo4SignificantBits(17));
+ assertEquals(18, ApplicationContainerCluster.truncateTo4SignificantBits(18));
+ assertEquals(18, ApplicationContainerCluster.truncateTo4SignificantBits(19));
+ assertEquals(30, ApplicationContainerCluster.truncateTo4SignificantBits(30));
+ assertEquals(30, ApplicationContainerCluster.truncateTo4SignificantBits(31));
+ assertEquals(32, ApplicationContainerCluster.truncateTo4SignificantBits(32));
+ assertEquals(32, ApplicationContainerCluster.truncateTo4SignificantBits(33));
+ assertEquals(32, ApplicationContainerCluster.truncateTo4SignificantBits(34));
+ assertEquals(32, ApplicationContainerCluster.truncateTo4SignificantBits(35));
+ assertEquals(36, ApplicationContainerCluster.truncateTo4SignificantBits(36));
+ assertEquals(0x78000000, ApplicationContainerCluster.truncateTo4SignificantBits(0x78000000));
+ assertEquals(0x78000000, ApplicationContainerCluster.truncateTo4SignificantBits(0x7fffffff));
+ assertEquals(0x80000000, ApplicationContainerCluster.truncateTo4SignificantBits(0x80000000));
+ assertEquals(0b10001000000000000000000000000000, ApplicationContainerCluster.truncateTo4SignificantBits(0b10000000000000000000000000000001));
+ assertEquals(0b11000100000000000000000000000000, ApplicationContainerCluster.truncateTo4SignificantBits(0b11000000000000000000000000000001));
+ assertEquals(0b11111111111111111111111111100010, ApplicationContainerCluster.truncateTo4SignificantBits(0b11111111111111111111111111100001));
+ }
+
}