Skip to content

Commit 39c7bc7

Browse files
authored
Refactoring SolverRemote module to implement circuit optimization #526 (#530)
* release notes * refactoring and creating test for the use case * refactoring * clean code * refactoring packages * release notes * refactoring * creating temp test * release notes * [Gradle Release Plugin] - new version commit: '3.25.6-snapshot'.
1 parent 658211e commit 39c7bc7

21 files changed

+175
-39
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.25.6
2+
* Refactoring SolverRemote module to implement circuit optimization #526
3+
14
## 3.25.5
25
* Change the caching strategy to minimize the locks and prevent deadlocks #522
36

gradle.properties

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

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public SimpleResolver(String hostname) throws UnknownHostException {
1313
super(hostname);
1414
}
1515

16-
public SimpleResolver(InetSocketAddress host) {
17-
super(host);
16+
public SimpleResolver(InetSocketAddress addr) {
17+
super(addr);
1818
}
1919

2020
public SimpleResolver(InetAddress host) {

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import com.mageddo.commons.circuitbreaker.CircuitCheckException;
44
import com.mageddo.dns.utils.Messages;
5+
import com.mageddo.dnsproxyserver.solver.remote.application.CircuitBreakerService;
56
import com.mageddo.dnsproxyserver.solver.remote.Request;
67
import com.mageddo.dnsproxyserver.solver.remote.Result;
7-
import com.mageddo.dnsproxyserver.solver.remote.CircuitBreakerService;
88
import com.mageddo.net.NetExecutorWatchdog;
99
import lombok.RequiredArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
@@ -16,6 +16,7 @@
1616
import javax.inject.Inject;
1717
import javax.inject.Singleton;
1818
import java.io.IOException;
19+
import java.util.List;
1920
import java.util.Objects;
2021
import java.util.concurrent.CompletableFuture;
2122
import java.util.concurrent.ExecutionException;
@@ -39,7 +40,6 @@ public class SolverRemote implements Solver, AutoCloseable {
3940
@Override
4041
public Response handle(Message query) {
4142
final var stopWatch = StopWatch.createStarted();
42-
4343
final var result = this.queryResultFromAvailableResolvers(query, stopWatch);
4444
log.debug(
4545
"status=finally, time={}, success={}, error={}",
@@ -55,12 +55,14 @@ public Response handle(Message query) {
5555
Result queryResultFromAvailableResolvers(Message query, StopWatch stopWatch) {
5656
final var lastErrorMsg = new AtomicReference<Message>();
5757
// fixme #526 better to exclude open circuits.
58-
for (int i = 0; i < this.delegate.resolvers().size(); i++) {
58+
final var resolvers = this.findResolversWithNonOpenCircuit();
59+
for (int i = 0; i < resolvers.size(); i++) {
5960

60-
final var resolver = this.delegate.resolvers().get(i);
61+
final var resolver = resolvers.get(i);
6162
final var request = this.buildRequest(query, i, stopWatch, resolver);
6263

6364
final var result = this.safeQueryResult(request);
65+
6466
if (result.hasSuccessMessage()) {
6567
return result;
6668
} else if (result.hasErrorMessage()) {
@@ -71,6 +73,10 @@ Result queryResultFromAvailableResolvers(Message query, StopWatch stopWatch) {
7173
return Result.fromErrorMessage(lastErrorMsg.get());
7274
}
7375

76+
List<Resolver> findResolversWithNonOpenCircuit() {
77+
return this.delegate.resolvers();
78+
}
79+
7480
Request buildRequest(Message query, int resolverIndex, StopWatch stopWatch, Resolver resolver) {
7581
return Request
7682
.builder()

src/main/java/com/mageddo/dnsproxyserver/solver/remote/CircuitBreakerService.java

Lines changed: 0 additions & 10 deletions
This file was deleted.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.mageddo.dnsproxyserver.solver.remote;
2+
3+
public enum CircuitStatus {
4+
OPEN,
5+
CLOSED,
6+
HALF_OPEN
7+
}

src/main/java/com/mageddo/dnsproxyserver/solver/remote/application/CircuitBreakerNonResilientService.java

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

3-
import com.mageddo.dnsproxyserver.solver.remote.CircuitBreakerService;
3+
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
44
import com.mageddo.dnsproxyserver.solver.remote.Result;
55

66
import java.net.InetSocketAddress;
@@ -11,4 +11,9 @@ public class CircuitBreakerNonResilientService implements CircuitBreakerService
1111
public Result safeHandle(final InetSocketAddress resolverAddress, Supplier<Result> sup) {
1212
return sup.get();
1313
}
14+
15+
@Override
16+
public CircuitStatus getCircuitStatus(InetSocketAddress resolverAddress) {
17+
return null;
18+
}
1419
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package com.mageddo.dnsproxyserver.solver.remote.application;
2+
3+
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
4+
import com.mageddo.dnsproxyserver.solver.remote.Result;
5+
6+
import java.net.InetSocketAddress;
7+
import java.util.function.Supplier;
8+
9+
public interface CircuitBreakerService {
10+
11+
Result safeHandle(final InetSocketAddress resolverAddress, Supplier<Result> sup);
12+
13+
CircuitStatus getCircuitStatus(InetSocketAddress resolverAddress);
14+
}

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

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

33
import com.mageddo.commons.circuitbreaker.CircuitCheckException;
44
import com.mageddo.commons.lang.tuple.Pair;
55
import com.mageddo.dnsproxyserver.config.application.ConfigService;
6+
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
67
import com.mageddo.dnsproxyserver.solver.remote.Result;
78
import com.mageddo.dnsproxyserver.solver.remote.dataprovider.SolverConsistencyGuaranteeDAO;
89
import com.mageddo.dnsproxyserver.solver.remote.mapper.CircuitBreakerStateMapper;
@@ -30,7 +31,7 @@ public class CircuitBreakerFactory {
3031

3132
private final Map<InetSocketAddress, CircuitBreaker<Result>> circuitBreakerMap = new ConcurrentHashMap<>();
3233
private final ConfigService configService;
33-
private final CircuitBreakerCheckerService circuitBreakerCheckerService;
34+
private final CircuitBreakerPingCheckerService circuitBreakerCheckerService;
3435
private final SolverConsistencyGuaranteeDAO solverConsistencyGuaranteeDAO;
3536

3637
public Result check(InetSocketAddress remoteAddress, Supplier<Result> sup) {
@@ -53,12 +54,12 @@ CircuitBreaker<Result> buildCircuitBreaker(
5354
.withFailureThreshold(config.getFailureThreshold(), config.getFailureThresholdCapacity())
5455
.withSuccessThreshold(config.getSuccessThreshold())
5556
.withDelay(config.getTestDelay())
56-
.onClose(build("CLOSED", address))
57-
.onOpen(build("OPEN", address))
57+
.onClose(build(CircuitStatus.CLOSED, address))
58+
.onOpen(build(CircuitStatus.OPEN, address))
5859
.build();
5960
}
6061

61-
EventListener<CircuitBreakerStateChangedEvent> build(String actualStateName, InetSocketAddress address) {
62+
EventListener<CircuitBreakerStateChangedEvent> build(CircuitStatus actualStateName, InetSocketAddress address) {
6263
return event -> {
6364
final var previousStateName = CircuitBreakerStateMapper.toStateNameFrom(event);
6465
if (isHalfOpenToOpen(previousStateName, actualStateName)) {
@@ -75,8 +76,8 @@ EventListener<CircuitBreakerStateChangedEvent> build(String actualStateName, Ine
7576
};
7677
}
7778

78-
private static boolean isHalfOpenToOpen(String previousStateName, String actualStateName) {
79-
return "HALF_OPEN".equals(previousStateName) && "OPEN".equals(actualStateName);
79+
private static boolean isHalfOpenToOpen(CircuitStatus previousStateName, CircuitStatus actualStateName) {
80+
return CircuitStatus.HALF_OPEN.equals(previousStateName) && CircuitStatus.OPEN.equals(actualStateName);
8081
}
8182

8283
void flushCache() {
@@ -122,6 +123,10 @@ public List<Stats> stats() {
122123
.toList();
123124
}
124125

126+
public CircuitStatus getStatus(InetSocketAddress remoteAddress) {
127+
return CircuitBreakerStateMapper.fromFailSafeCircuitBreaker(this.circuitBreakerMap.get(remoteAddress));
128+
}
129+
125130
private Stats toStats(InetSocketAddress remoteAddr) {
126131
final var circuitBreaker = this.circuitBreakerMap.get(remoteAddr);
127132
final var state = circuitBreaker.getState().name();

src/main/java/com/mageddo/dnsproxyserver/solver/remote/application/CircuitBreakerFailSafeService.java renamed to src/main/java/com/mageddo/dnsproxyserver/solver/remote/application/failsafe/CircuitBreakerFailSafeService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
package com.mageddo.dnsproxyserver.solver.remote.application;
1+
package com.mageddo.dnsproxyserver.solver.remote.application.failsafe;
22

33
import com.mageddo.commons.circuitbreaker.CircuitCheckException;
4-
import com.mageddo.dnsproxyserver.solver.remote.CircuitBreakerService;
4+
import com.mageddo.dnsproxyserver.solver.remote.CircuitStatus;
55
import com.mageddo.dnsproxyserver.solver.remote.Result;
6+
import com.mageddo.dnsproxyserver.solver.remote.application.CircuitBreakerService;
67
import dev.failsafe.CircuitBreakerOpenException;
78
import lombok.RequiredArgsConstructor;
89
import lombok.extern.slf4j.Slf4j;
@@ -45,4 +46,9 @@ public String getStatus() {
4546
public void resetCircuitBreakerFactory() {
4647
this.circuitBreakerFactory.reset();
4748
}
49+
50+
@Override
51+
public CircuitStatus getCircuitStatus(InetSocketAddress resolverAddress) {
52+
return this.circuitBreakerFactory.getStatus(resolverAddress);
53+
}
4854
}

0 commit comments

Comments
 (0)