Skip to content

Commit 735b036

Browse files
committed
fixes
1 parent 36347d1 commit 735b036

2 files changed

Lines changed: 44 additions & 2 deletions

File tree

core/http/client/src/main/java/org/eclipse/rdf4j/http/client/QueryCircuitBreaker.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,8 @@ private QueryPressureState refreshState(String reason, Configuration configurati
260260
QueryPressureState previous = currentState;
261261
long now = clock.getAsLong();
262262

263-
if (next.ordinal() < previous.ordinal() && now - lastTransition.getTimestampMillis() < recoveryCooldownMs) {
263+
if (configuration.isEnabled() && next.ordinal() < previous.ordinal()
264+
&& now - lastTransition.getTimestampMillis() < recoveryCooldownMs) {
264265
next = previous;
265266
}
266267

@@ -270,7 +271,7 @@ private QueryPressureState refreshState(String reason, Configuration configurati
270271
LOGGER.info(
271272
"Query circuit breaker transition previous={} current={} freeMb={} rollingGcMs={} reason={}",
272273
previous, next, snapshot.getFreeMemoryMb(), snapshot.getRollingGcMs(), reason);
273-
if (!isCheckpointReason(reason) && !isMonitorReason(reason)
274+
if (!isCheckpointReason(reason) && !isMonitorReason(reason) && !isStatusReason(reason)
274275
&& shouldRequestTransitionGc(currentState, configuration, snapshot)) {
275276
maybeRunCheckpointGc();
276277
}
@@ -320,6 +321,10 @@ private boolean isMonitorReason(String reason) {
320321
return "monitor".equals(reason);
321322
}
322323

324+
private boolean isStatusReason(String reason) {
325+
return "status".equals(reason);
326+
}
327+
323328
private boolean shouldRequestTransitionGc(QueryPressureState state, Configuration configuration,
324329
QueryPressureMonitor.Snapshot snapshot) {
325330
return state == QueryPressureState.HIGH

core/http/client/src/test/java/org/eclipse/rdf4j/http/client/QueryCircuitBreakerTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import java.util.List;
2929
import java.util.Set;
3030
import java.util.concurrent.atomic.AtomicLong;
31+
import java.util.concurrent.atomic.AtomicReference;
3132

3233
import org.junit.jupiter.api.Test;
3334

@@ -117,6 +118,42 @@ void shouldDisableHeavyOperatorExecutionOnlyWhileCritical() throws Exception {
117118
assertTrue(readHeavyOperatorExecutionEnabled());
118119
}
119120

121+
@Test
122+
void shouldClearCriticalKillSwitchImmediatelyWhenBreakerIsDisabled() throws Exception {
123+
Fixture fixture = new Fixture();
124+
AtomicReference<QueryCircuitBreaker.Configuration> configuration = new AtomicReference<>(
125+
configuration(true, 100, 200, 300, 400, 300, 200, 25, 10, 1000, 7));
126+
QueryCircuitBreaker breaker = new QueryCircuitBreaker(fixture.monitor, configuration::get, fixture.clock::get,
127+
fixture.sleeps::add, () -> {
128+
}, 1000, 1, false);
129+
130+
try {
131+
fixture.freeMemoryMb.set(150);
132+
assertEquals("CRITICAL", breaker.snapshotStatus().getState());
133+
assertFalse(readHeavyOperatorExecutionEnabled());
134+
135+
configuration.set(configuration(false, 100, 200, 300, 400, 300, 200, 25, 10, 1000, 7));
136+
137+
assertEquals("NORMAL", breaker.snapshotStatus().getState());
138+
assertTrue(readHeavyOperatorExecutionEnabled());
139+
} finally {
140+
QueryExecutionContext.setHeavyOperatorExecutionEnabled(true);
141+
QueryExecutionContext.setIgnoreCheckpointStride(false);
142+
}
143+
}
144+
145+
@Test
146+
void shouldNotRunGcFromStatusSnapshotTransition() {
147+
Fixture fixture = new Fixture();
148+
QueryCircuitBreaker breaker = fixture.breaker(configuration(true, 100, 200, 300, 400, 300, 200, 25, 10, 1000,
149+
7), 1000, () -> fixture.gcInvocations.add(fixture.clock.get()));
150+
151+
fixture.freeMemoryMb.set(250);
152+
153+
assertEquals("HIGH", breaker.snapshotStatus().getState());
154+
assertEquals(List.of(), fixture.gcInvocations);
155+
}
156+
120157
@Test
121158
void shouldNotLeaveCurrentThreadInterruptedWhenSelfCancelling() {
122159
QueryCircuitBreakerHandle handle = new QueryCircuitBreakerHandle("self-cancel",

0 commit comments

Comments
 (0)