Skip to content

Commit 45af261

Browse files
authored
Canary Rate Threshold Circuit Breaker Strategy: All circuits open at start (mageddo#588)
* implementing circuit breaker factory * fixmes * testing * testing * setup strategy mapping * fixing validation * must call hotload method once * adjusting logs * add server address as circuit breaker name * fixing compiling errors * refactoring * refactoring * fixing test * fixing test * fixing test * fixing test * fixing test * fixing test * fixing test * messages formatting and refactoring * refactoring * disabling metrics * heating circuit breakers at app startup * todos * adjusts * adjusts * fixing tests * fixing tests * fixing tests * testing * item tick * clearing todos * [Gradle Release Plugin] - new version commit: '3.31.1-snapshot'. * release notes
1 parent 0717f64 commit 45af261

28 files changed

+346
-145
lines changed

RELEASE-NOTES.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## 3.31.1
2+
* Adjusting Canary Rate Threshold Circuit Breaker to mark all circuits as open at the start. #533
3+
14
## 3.31.0
25
* Canary Rate Threshold Circuit Breaker. #533
36

TODO.md

Whitespace-only changes.

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
version=3.31.0-snapshot
1+
version=3.31.1-snapshot

src/main/java/com/mageddo/dns/utils/Messages.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,24 +38,24 @@ public static String simplePrint(Response res) {
3838
return simplePrint(res.getMessage());
3939
}
4040

41-
public static String simplePrint(Message message) {
42-
if (message == null) {
41+
public static String simplePrint(Message reqOrRes) {
42+
if (reqOrRes == null) {
4343
return null;
4444
}
4545
try {
46-
final var answer = findFirstAnswerRecord(message);
47-
final var rcode = message.getRcode();
46+
final var answer = findFirstAnswerRecord(reqOrRes);
47+
final var rcode = reqOrRes.getRcode();
4848
if (answer != null) {
4949
return String.format("rc=%d, res=%s", rcode, simplePrint(answer));
5050
}
51-
final var question = message.getQuestion();
51+
final var question = reqOrRes.getQuestion();
5252
final var type = Objects.useItOrDefault(
5353
Objects.toString(Entry.Type.of(question.getType())),
5454
() -> String.valueOf(question.getType())
5555
);
5656
final var hostname = question.getName().toString(true);
5757
final var sb = new StringBuilder();
58-
if (Messages.hasFlag(message, Flags.QR)) {
58+
if (Messages.hasFlag(reqOrRes, Flags.QR)) {
5959
sb.append("rc=")
6060
.append(rcode)
6161
.append(", ")
@@ -64,8 +64,8 @@ public static String simplePrint(Message message) {
6464
sb.append(String.format("query=%s:%s", type, hostname));
6565
return sb.toString();
6666
} catch (Throwable e) {
67-
log.warn("status=failedToSimplePrint, msg={}", message, e);
68-
return String.valueOf(message);
67+
log.warn("status=failedToSimplePrint, msg={}", reqOrRes, e);
68+
return String.valueOf(reqOrRes);
6969
}
7070
}
7171

src/main/java/com/mageddo/dnsproxyserver/di/module/ModuleEager.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.mageddo.dnsproxyserver.di.module;
22

33
import com.mageddo.di.Eager;
4+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.entrypoint.CircuitBreakerHeater;
45
import dagger.Module;
56
import dagger.Provides;
67
import dagger.multibindings.ElementsIntoSet;
@@ -13,7 +14,9 @@ public class ModuleEager {
1314
@Provides
1415
@Singleton
1516
@ElementsIntoSet
16-
Set<Eager> beans() {
17-
return Set.of();
17+
Set<Eager> beans(CircuitBreakerHeater a) {
18+
return Set.of(
19+
a
20+
);
1821
}
1922
}

src/main/java/com/mageddo/dnsproxyserver/solver/SimpleResolver.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.mageddo.dnsproxyserver.solver;
22

3+
import com.mageddo.net.IpAddr;
4+
import com.mageddo.net.IpAddrs;
5+
36
import java.net.InetAddress;
47
import java.net.InetSocketAddress;
58
import java.net.UnknownHostException;
@@ -20,4 +23,8 @@ public SimpleResolver(InetSocketAddress addr) {
2023
public SimpleResolver(InetAddress host) {
2124
super(host);
2225
}
26+
27+
public SimpleResolver(IpAddr addr) {
28+
super(IpAddrs.toInetSocketAddress(addr));
29+
}
2330
}

src/main/java/com/mageddo/dnsproxyserver/solver/remote/application/failsafe/CircuitBreakerFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.mageddo.dnsproxyserver.solver.remote.application.failsafe;
22

33
import com.mageddo.commons.lang.tuple.Pair;
4-
import com.mageddo.dnsproxyserver.config.CanaryRateThresholdCircuitBreakerStrategyConfig;
54
import com.mageddo.dnsproxyserver.config.CircuitBreakerStrategyConfig;
65
import com.mageddo.dnsproxyserver.config.StaticThresholdCircuitBreakerStrategyConfig;
76
import com.mageddo.dnsproxyserver.config.application.ConfigService;
@@ -14,6 +13,7 @@
1413
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.application.CircuitBreakerDelegateStaticThresholdFailsafe;
1514
import com.mageddo.dnsproxyserver.solver.remote.mapper.ResolverMapper;
1615
import com.mageddo.net.IpAddr;
16+
import com.mageddo.net.IpAddrs;
1717
import lombok.RequiredArgsConstructor;
1818
import lombok.Value;
1919
import lombok.extern.slf4j.Slf4j;
@@ -25,6 +25,7 @@
2525
import java.util.List;
2626
import java.util.Map;
2727
import java.util.concurrent.ConcurrentHashMap;
28+
import java.util.function.Supplier;
2829

2930
@Slf4j
3031
@Singleton
@@ -67,8 +68,7 @@ CircuitBreakerDelegate findCircuitBreakerHotLoad(InetSocketAddress address) {
6768
}
6869

6970
CircuitBreakerDelegate buildCanaryRateThreshold(CircuitBreakerStrategyConfig config, InetSocketAddress address) {
70-
// return this.canaryThresholdFactory.build(config, IpAddrs.from(address));
71-
return this.canaryThresholdFactory.build((CanaryRateThresholdCircuitBreakerStrategyConfig) config);
71+
return this.canaryThresholdFactory.build(config, IpAddrs.from(address));
7272
}
7373

7474
private CircuitBreakerDelegateStaticThresholdFailsafe buildStaticThresholdFailSafeCircuitBreaker(

src/main/java/com/mageddo/dnsproxyserver/solver/remote/circuitbreaker/application/CircuitBreakerDelegate.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
44
import com.mageddo.dnsproxyserver.solver.remote.Result;
5+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.statetransitor.StateTransitor;
56

67
import java.util.function.Supplier;
78

@@ -11,5 +12,13 @@ public interface CircuitBreakerDelegate {
1112

1213
CircuitStatus findStatus();
1314

14-
void transitionToHalfOpenState();
15+
StateTransitor stateTransitor();
16+
17+
default void transitionToHalfOpenState(){
18+
this.stateTransitor().halfOpen();
19+
}
20+
21+
default void transitionToClosedState(){
22+
this.stateTransitor().closed();
23+
}
1524
}

src/main/java/com/mageddo/dnsproxyserver/solver/remote/circuitbreaker/application/CircuitBreakerDelegateNonResilient.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
44
import com.mageddo.dnsproxyserver.solver.remote.Result;
5+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.statetransitor.NopStateTransitor;
6+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.statetransitor.StateTransitor;
57

68
import java.util.function.Supplier;
79

@@ -18,7 +20,8 @@ public CircuitStatus findStatus() {
1820
}
1921

2022
@Override
21-
public void transitionToHalfOpenState() {
22-
23+
public StateTransitor stateTransitor() {
24+
return new NopStateTransitor();
2325
}
26+
2427
}

src/main/java/com/mageddo/dnsproxyserver/solver/remote/circuitbreaker/application/CircuitBreakerDelegateStaticThresholdFailsafe.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.application;
22

33
import com.mageddo.circuitbreaker.failsafe.CircuitStatusRefresh;
4+
import com.mageddo.commons.circuitbreaker.CircuitIsOpenException;
45
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
56
import com.mageddo.dnsproxyserver.solver.remote.Result;
6-
import com.mageddo.commons.circuitbreaker.CircuitIsOpenException;
7+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.statetransitor.FailSafeStateTransitor;
8+
import com.mageddo.dnsproxyserver.solver.remote.circuitbreaker.statetransitor.StateTransitor;
79
import com.mageddo.dnsproxyserver.solver.remote.mapper.CircuitBreakerStateMapper;
810
import dev.failsafe.CircuitBreaker;
911
import dev.failsafe.CircuitBreakerOpenException;
@@ -25,7 +27,7 @@ public Result execute(Supplier<Result> sup) {
2527
return Failsafe
2628
.with(this.circuitBreaker)
2729
.get((ctx) -> sup.get());
28-
} catch (CircuitBreakerOpenException e){
30+
} catch (CircuitBreakerOpenException e) {
2931
throw new CircuitIsOpenException(e);
3032
}
3133
}
@@ -37,7 +39,8 @@ public CircuitStatus findStatus() {
3739
}
3840

3941
@Override
40-
public void transitionToHalfOpenState() {
41-
this.circuitBreaker.halfOpen();
42+
public StateTransitor stateTransitor() {
43+
return new FailSafeStateTransitor(circuitBreaker);
4244
}
45+
4346
}

0 commit comments

Comments
 (0)