mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-17 10:25:15 +00:00
Adjust size of BigArrays in circuit breaker test
With this commit we restore the previous behavior in `BigArraysTests#testMaxSizeExceededOnResize` but lower the sizes that are tested to the range between 256 bytes to 16 kB so the test does not produce a whole lot of garbage. The previous attempt to reduce the amount of garbage produced by that test was to properly size the array initially but it failed to account for object alignment which lead to test failures in some cases. While it would be possible to account for object alignment, we would need to open up BigArrays or directly use the underlying Lucene API which would require us to allocate an array upfront only to find its size (incl. object alignment). Instead we have fixed this issue by conservatively sizing the array initially (so the initial allocation will never trip the circuit breaker) and reduce garbage by reducing the circuit breaker's upper bound as described previously. Closes #33750 Relates #34325
This commit is contained in:
parent
5c7b52e930
commit
7d826916b9
@ -351,7 +351,7 @@ public class BigArraysTests extends ESTestCase {
|
|||||||
|
|
||||||
public void testMaxSizeExceededOnResize() throws Exception {
|
public void testMaxSizeExceededOnResize() throws Exception {
|
||||||
for (String type : Arrays.asList("Byte", "Int", "Long", "Float", "Double", "Object")) {
|
for (String type : Arrays.asList("Byte", "Int", "Long", "Float", "Double", "Object")) {
|
||||||
final int maxSize = randomIntBetween(1 << 10, 1 << 22);
|
final int maxSize = randomIntBetween(1 << 8, 1 << 14);
|
||||||
HierarchyCircuitBreakerService hcbs = new HierarchyCircuitBreakerService(
|
HierarchyCircuitBreakerService hcbs = new HierarchyCircuitBreakerService(
|
||||||
Settings.builder()
|
Settings.builder()
|
||||||
.put(REQUEST_CIRCUIT_BREAKER_LIMIT_SETTING.getKey(), maxSize, ByteSizeUnit.BYTES)
|
.put(REQUEST_CIRCUIT_BREAKER_LIMIT_SETTING.getKey(), maxSize, ByteSizeUnit.BYTES)
|
||||||
@ -360,12 +360,18 @@ public class BigArraysTests extends ESTestCase {
|
|||||||
new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS));
|
new ClusterSettings(Settings.EMPTY, ClusterSettings.BUILT_IN_CLUSTER_SETTINGS));
|
||||||
BigArrays bigArrays = new BigArrays(null, hcbs, false).withCircuitBreaking();
|
BigArrays bigArrays = new BigArrays(null, hcbs, false).withCircuitBreaking();
|
||||||
Method create = BigArrays.class.getMethod("new" + type + "Array", long.class);
|
Method create = BigArrays.class.getMethod("new" + type + "Array", long.class);
|
||||||
final int size = scaledRandomIntBetween(10, maxSize / 8);
|
final int size = scaledRandomIntBetween(10, maxSize / 16);
|
||||||
BigArray array = (BigArray) create.invoke(bigArrays, size);
|
BigArray array = (BigArray) create.invoke(bigArrays, size);
|
||||||
Method resize = BigArrays.class.getMethod("resize", array.getClass().getInterfaces()[0], long.class);
|
Method resize = BigArrays.class.getMethod("resize", array.getClass().getInterfaces()[0], long.class);
|
||||||
final long newSize = maxSize + 1;
|
while (true) {
|
||||||
InvocationTargetException e = expectThrows(InvocationTargetException.class, () -> resize.invoke(bigArrays, array, newSize));
|
long newSize = array.size() * 2;
|
||||||
assertTrue(e.getCause() instanceof CircuitBreakingException);
|
try {
|
||||||
|
array = (BigArray) resize.invoke(bigArrays, array, newSize);
|
||||||
|
} catch (InvocationTargetException e) {
|
||||||
|
assertTrue(e.getCause() instanceof CircuitBreakingException);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
assertEquals(array.ramBytesUsed(), hcbs.getBreaker(CircuitBreaker.REQUEST).getUsed());
|
assertEquals(array.ramBytesUsed(), hcbs.getBreaker(CircuitBreaker.REQUEST).getUsed());
|
||||||
array.close();
|
array.close();
|
||||||
assertEquals(0, hcbs.getBreaker(CircuitBreaker.REQUEST).getUsed());
|
assertEquals(0, hcbs.getBreaker(CircuitBreaker.REQUEST).getUsed());
|
||||||
|
Loading…
x
Reference in New Issue
Block a user