Skip to content

Commit 09bc4d4

Browse files
committed
Avoid excessive memory requests in singleton builders
1 parent 4a745b5 commit 09bc4d4

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/SingletonDoubleBuilder.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.compute.lucene.read;
99

10+
import org.apache.lucene.util.RamUsageEstimator;
1011
import org.elasticsearch.compute.data.Block;
1112
import org.elasticsearch.compute.data.BlockFactory;
1213
import org.elasticsearch.core.Releasable;
@@ -23,10 +24,13 @@ public final class SingletonDoubleBuilder implements BlockLoader.SingletonDouble
2324
private final BlockFactory blockFactory;
2425

2526
private int count;
27+
private long memoryUsed;
2628

2729
public SingletonDoubleBuilder(int expectedCount, BlockFactory blockFactory) {
2830
this.blockFactory = blockFactory;
29-
blockFactory.adjustBreaker(valuesSize(expectedCount));
31+
long memory = valuesSize(expectedCount);
32+
blockFactory.adjustBreaker(memory);
33+
memoryUsed += memory;
3034
this.values = new double[expectedCount];
3135
}
3236

@@ -69,7 +73,9 @@ public Block build() {
6973
if (values.length != count) {
7074
throw new IllegalStateException("expected " + values.length + " values but got " + count);
7175
}
72-
return blockFactory.newDoubleArrayVector(values, count).asBlock();
76+
var result = blockFactory.newDoubleArrayVector(values, count, memoryUsed).asBlock();
77+
memoryUsed = 0;
78+
return result;
7379
}
7480

7581
@Override
@@ -83,10 +89,11 @@ public BlockLoader.SingletonDoubleBuilder appendLongs(BlockDocValuesReader.ToDou
8389

8490
@Override
8591
public void close() {
86-
blockFactory.adjustBreaker(-valuesSize(values.length));
92+
blockFactory.adjustBreaker(-memoryUsed);
8793
}
8894

8995
static long valuesSize(int count) {
90-
return (long) count * Double.BYTES;
96+
return RamUsageEstimator.alignObjectSize((long) RamUsageEstimator.NUM_BYTES_ARRAY_HEADER + (long) Double.BYTES * count)
97+
+ Block.PAGE_MEM_OVERHEAD_PER_BLOCK;
9198
}
9299
}

x-pack/plugin/esql/compute/src/main/java/org/elasticsearch/compute/lucene/read/SingletonLongBuilder.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.compute.lucene.read;
99

10+
import org.apache.lucene.util.RamUsageEstimator;
1011
import org.elasticsearch.compute.data.Block;
1112
import org.elasticsearch.compute.data.BlockFactory;
1213
import org.elasticsearch.core.Releasable;
@@ -20,12 +21,15 @@ public final class SingletonLongBuilder implements BlockLoader.SingletonLongBuil
2021

2122
private final long[] values;
2223
private final BlockFactory blockFactory;
24+
private long memoryUsed;
2325

2426
private int count;
2527

2628
public SingletonLongBuilder(int expectedCount, BlockFactory blockFactory) {
2729
this.blockFactory = blockFactory;
28-
blockFactory.adjustBreaker(valuesSize(expectedCount));
30+
final long memory = valuesSize(expectedCount);
31+
blockFactory.adjustBreaker(memory);
32+
memoryUsed += memory;
2933
this.values = new long[expectedCount];
3034
}
3135

@@ -68,7 +72,9 @@ public Block build() {
6872
if (values.length != count) {
6973
throw new IllegalStateException("expected [" + values.length + "] values but got [" + count + "]");
7074
}
71-
return blockFactory.newLongArrayVector(values, count).asBlock();
75+
var result = blockFactory.newLongArrayVector(values, count, memoryUsed).asBlock();
76+
memoryUsed = 0;
77+
return result;
7278
}
7379

7480
@Override
@@ -86,10 +92,11 @@ public BlockLoader.SingletonLongBuilder appendLongs(long[] values, int from, int
8692

8793
@Override
8894
public void close() {
89-
blockFactory.adjustBreaker(-valuesSize(values.length));
95+
blockFactory.adjustBreaker(-memoryUsed);
9096
}
9197

9298
static long valuesSize(int count) {
93-
return (long) count * Long.BYTES;
99+
return RamUsageEstimator.alignObjectSize((long) RamUsageEstimator.NUM_BYTES_ARRAY_HEADER + (long) Long.BYTES * count)
100+
+ Block.PAGE_MEM_OVERHEAD_PER_BLOCK;
94101
}
95102
}

0 commit comments

Comments
 (0)