77
88package org .elasticsearch .compute .lucene .read ;
99
10+ import org .apache .lucene .util .RamUsageEstimator ;
1011import org .elasticsearch .compute .data .Block ;
1112import org .elasticsearch .compute .data .BlockFactory ;
1213import 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