Skip to content

Commit 0407044

Browse files
authored
Issue ReactiveX#357: Fixed a bug in ResilienceBaseSubscriber. If a subscriber is is not permitted to subscribe, the subscription must be canceled and the ResilienceBaseSubscriber must call onSubscribe on the target Subscriber with an EmptySubscription followed by a call to onError with the supplied error. (ReactiveX#452)
Issue ReactiveX#357: Fixed a bug in ResilienceBaseSubscriber. If a subscriber is is not permitted to subscribe, the subscription must be canceled and the ResilienceBaseSubscriber must call onSubscribe on the target Subscriber with an EmptySubscription followed by a call to onError with the supplied error. The bug was that the ResilienceBaseSubscriber cancelled it's own subscription as well.
1 parent 3bc6137 commit 0407044

File tree

5 files changed

+18
-21
lines changed

5 files changed

+18
-21
lines changed

resilience4j-circuitbreaker/src/main/java/io/github/resilience4j/circuitbreaker/CircuitBreakerConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public class CircuitBreakerConfig {
3434
public static final int DEFAULT_WAIT_DURATION_IN_OPEN_STATE = 60; // Seconds
3535
public static final int DEFAULT_RING_BUFFER_SIZE_IN_HALF_OPEN_STATE = 10;
3636
public static final int DEFAULT_RING_BUFFER_SIZE_IN_CLOSED_STATE = 100;
37-
private static final Predicate<Throwable> DEFAULT_RECORD_FAILURE_PREDICATE = (throwable) -> true;
37+
private static final Predicate<Throwable> DEFAULT_RECORD_FAILURE_PREDICATE = throwable -> true;
3838

3939
@SuppressWarnings("unchecked")
4040
private Class<? extends Throwable>[] recordExceptions = new Class[0];

resilience4j-reactor/src/main/java/io/github/resilience4j/reactor/ResilienceBaseSubscriber.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,7 @@ public final void onSubscribe(Subscription s) {
183183
if (acquireCallPermit()) {
184184
actual.onSubscribe(this);
185185
} else {
186-
cancel();
187-
actual.onSubscribe(this);
188-
actual.onError(getThrowable());
186+
Operators.error(actual, Operators.onOperatorError(s, getThrowable(), actual.currentContext()));
189187
}
190188
}
191189
catch (Throwable throwable) {

resilience4j-reactor/src/test/java/io/github/resilience4j/reactor/CombinedOperatorsTest.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
package io.github.resilience4j.reactor;
22

3-
import java.io.IOException;
4-
import java.time.Duration;
5-
import java.time.temporal.ChronoUnit;
6-
7-
import org.junit.Test;
8-
93
import io.github.resilience4j.bulkhead.Bulkhead;
104
import io.github.resilience4j.bulkhead.BulkheadConfig;
5+
import io.github.resilience4j.circuitbreaker.CallNotPermittedException;
116
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
127
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
13-
import io.github.resilience4j.circuitbreaker.CircuitBreakerOpenException;
148
import io.github.resilience4j.ratelimiter.RateLimiter;
159
import io.github.resilience4j.ratelimiter.RateLimiterConfig;
1610
import io.github.resilience4j.reactor.bulkhead.operator.BulkheadOperator;
@@ -19,11 +13,16 @@
1913
import io.github.resilience4j.reactor.retry.RetryOperator;
2014
import io.github.resilience4j.retry.Retry;
2115
import io.github.resilience4j.retry.RetryConfig;
16+
import org.junit.Test;
2217
import reactor.core.publisher.Flux;
2318
import reactor.core.publisher.Mono;
2419
import reactor.core.scheduler.Schedulers;
2520
import reactor.test.StepVerifier;
2621

22+
import java.io.IOException;
23+
import java.time.Duration;
24+
import java.time.temporal.ChronoUnit;
25+
2726
public class CombinedOperatorsTest {
2827

2928
private final RateLimiter rateLimiter = RateLimiter.of("test",
@@ -110,7 +109,7 @@ public void shouldEmitErrorWithCircuitBreakerOpenExceptionEvenWhenErrorDuringSub
110109
.transform(CircuitBreakerOperator.of(circuitBreaker))
111110
.transform(BulkheadOperator.of(bulkhead, Schedulers.immediate()))
112111
.transform(RateLimiterOperator.of(rateLimiter, Schedulers.immediate()))
113-
).expectError(CircuitBreakerOpenException.class)
112+
).expectError(CallNotPermittedException.class)
114113
.verify(Duration.ofSeconds(1));
115114
}
116115

@@ -122,7 +121,7 @@ public void shouldEmitErrorWithCircuitBreakerOpenExceptionEvenWhenErrorNotOnSubs
122121
.transform(CircuitBreakerOperator.of(circuitBreaker))
123122
.transform(BulkheadOperator.of(bulkhead, Schedulers.immediate()))
124123
.transform(RateLimiterOperator.of(rateLimiter, Schedulers.immediate()))
125-
).expectError(CircuitBreakerOpenException.class)
124+
).expectError(CallNotPermittedException.class)
126125
.verify(Duration.ofSeconds(1));
127126
}
128127
}

resilience4j-reactor/src/test/java/io/github/resilience4j/reactor/circuitbreaker/operator/FluxCircuitBreakerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package io.github.resilience4j.reactor.circuitbreaker.operator;
1717

18-
import io.github.resilience4j.circuitbreaker.CircuitBreakerOpenException;
18+
import io.github.resilience4j.circuitbreaker.CallNotPermittedException;
1919
import org.junit.Test;
2020
import reactor.core.publisher.Flux;
2121
import reactor.test.StepVerifier;
@@ -65,7 +65,7 @@ public void shouldEmitErrorWithCircuitBreakerOpenException() {
6565
StepVerifier.create(
6666
Flux.just("Event 1", "Event 2")
6767
.transform(CircuitBreakerOperator.of(circuitBreaker)))
68-
.expectError(CircuitBreakerOpenException.class)
68+
.expectError(CallNotPermittedException.class)
6969
.verify(Duration.ofSeconds(1));
7070

7171
assertNoRegisteredCall();
@@ -77,7 +77,7 @@ public void shouldEmitCircuitBreakerOpenExceptionEvenWhenErrorNotOnSubscribe() {
7777
StepVerifier.create(
7878
Flux.error(new IOException("BAM!"), true)
7979
.transform(CircuitBreakerOperator.of(circuitBreaker)))
80-
.expectError(CircuitBreakerOpenException.class)
80+
.expectError(CallNotPermittedException.class)
8181
.verify(Duration.ofSeconds(1));
8282

8383
assertNoRegisteredCall();
@@ -89,7 +89,7 @@ public void shouldEmitCircuitBreakerOpenExceptionEvenWhenErrorDuringSubscribe()
8989
StepVerifier.create(
9090
Flux.error(new IOException("BAM!"))
9191
.transform(CircuitBreakerOperator.of(circuitBreaker)))
92-
.expectError(CircuitBreakerOpenException.class)
92+
.expectError(CallNotPermittedException.class)
9393
.verify(Duration.ofSeconds(1));
9494

9595
assertNoRegisteredCall();

resilience4j-reactor/src/test/java/io/github/resilience4j/reactor/circuitbreaker/operator/MonoCircuitBreakerTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package io.github.resilience4j.reactor.circuitbreaker.operator;
1717

18-
import io.github.resilience4j.circuitbreaker.CircuitBreakerOpenException;
18+
import io.github.resilience4j.circuitbreaker.CallNotPermittedException;
1919
import org.junit.Test;
2020
import reactor.core.publisher.Mono;
2121
import reactor.test.StepVerifier;
@@ -66,7 +66,7 @@ public void shouldEmitCircuitBreakerOpenExceptionEvenWhenErrorNotOnSubscribe() {
6666
StepVerifier.create(
6767
Mono.error(new IOException("BAM!")).delayElement(Duration.ofMillis(1))
6868
.transform(CircuitBreakerOperator.of(circuitBreaker)))
69-
.expectError(CircuitBreakerOpenException.class)
69+
.expectError(CallNotPermittedException.class)
7070
.verify(Duration.ofSeconds(1));
7171

7272
assertNoRegisteredCall();
@@ -78,7 +78,7 @@ public void shouldEmitCircuitBreakerOpenExceptionEvenWhenErrorDuringSubscribe()
7878
StepVerifier.create(
7979
Mono.error(new IOException("BAM!"))
8080
.transform(CircuitBreakerOperator.of(circuitBreaker)))
81-
.expectError(CircuitBreakerOpenException.class)
81+
.expectError(CallNotPermittedException.class)
8282
.verify(Duration.ofSeconds(1));
8383

8484
assertNoRegisteredCall();
@@ -90,7 +90,7 @@ public void shouldEmitErrorWithCircuitBreakerOpenException() {
9090
StepVerifier.create(
9191
Mono.just("Event")
9292
.transform(CircuitBreakerOperator.of(circuitBreaker)))
93-
.expectError(CircuitBreakerOpenException.class)
93+
.expectError(CallNotPermittedException.class)
9494
.verify(Duration.ofSeconds(1));
9595

9696
assertNoRegisteredCall();

0 commit comments

Comments
 (0)