Skip to content

Commit bc22a7a

Browse files
authored
Disable connection check at every query (#525)
* testing ping call * creating toggle * release notes * [Gradle Release Plugin] - new version commit: '3.25.3-snapshot'. * testing ping on specified port * testing ping api
1 parent c2a39b9 commit bc22a7a

File tree

10 files changed

+131
-12
lines changed

10 files changed

+131
-12
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.3
2+
* Resources utilization optimization by disabling connection check at every query #524
3+
14
## 3.25.2
25
* Migrating cache to caffeine #522
36

gradle.properties

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

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

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,15 +83,25 @@ Request buildRequest(Message query, int resolverIndex, StopWatch stopWatch, Reso
8383

8484
Result safeQueryResult(Request req) {
8585
req.splitStopWatch();
86-
return this.circuitBreakerService.safeHandle(req.getResolverAddress(), () -> this.queryResultWhilePingingResolver(req));
86+
return this.circuitBreakerService.safeHandle(req.getResolverAddress(), () -> this.queryResult(req));
8787
}
8888

89-
Result queryResultWhilePingingResolver(Request req) {
89+
Result queryResult(Request req) {
9090
final var resFuture = req.sendQueryAsyncToResolver(this.delegate.getExecutor());
91-
this.netWatchdog.watch(req.getResolverAddr(), resFuture, PING_TIMEOUT_IN_MS);
91+
if (this.isPingWhileGettingQueryResponseActive()) {
92+
this.pingWhileGettingQueryResponse(req, resFuture);
93+
}
9294
return this.transformToResult(resFuture, req);
9395
}
9496

97+
void pingWhileGettingQueryResponse(Request req, CompletableFuture<Message> resFuture) {
98+
this.netWatchdog.watch(req.getResolverAddr(), resFuture, PING_TIMEOUT_IN_MS);
99+
}
100+
101+
boolean isPingWhileGettingQueryResponseActive() {
102+
return Boolean.getBoolean("mg.solverRemote.pingWhileGettingQueryResponse");
103+
}
104+
95105
Result transformToResult(CompletableFuture<Message> resFuture, Request request) {
96106
final var res = this.findFutureRes(resFuture, request);
97107
if (res == null) {

src/main/java/com/mageddo/net/IpAddr.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@ public static IpAddr of(String addr) {
4444
return IpUtils.toIpAddr(addr);
4545
}
4646

47+
48+
public static IpAddr of(String ip, int port) {
49+
return IpAddr.of(IP.of(ip), port);
50+
}
51+
4752
public static IpAddr of(IP ip) {
4853
return of(ip, null);
4954
}

src/main/java/com/mageddo/net/IpAddrs.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,15 @@
55
import java.net.InetSocketAddress;
66

77
public class IpAddrs {
8-
public static IpAddr from(InetSocketAddress inetSocketAddress){
8+
public static IpAddr from(InetSocketAddress inetSocketAddress) {
99
return IpAddr.of(
1010
Ips.from(inetSocketAddress.getAddress()),
1111
inetSocketAddress.getPort()
1212
);
1313
}
14+
15+
public static InetSocketAddress toInetSocketAddress(IpAddr ipAddr) {
16+
return new InetSocketAddress(ipAddr.getIp().toInetAddr(), ipAddr.getPort());
17+
}
18+
1419
}

src/main/java/com/mageddo/net/Networks.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ public static String findIP(ContainerNetwork network, IP.Version version) {
105105
};
106106
}
107107

108-
public static boolean ping(String ip, int port, int timeout){
108+
public static boolean ping(String ip, int port, int timeout) {
109109
try {
110110
final InetAddress addr = InetAddress.getByAddress(Ips.toBytes(ip));
111111
return ping(addr, port, timeout);

src/main/java/com/mageddo/net/SocketUtils.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,9 @@ public static int findRandomFreePort() {
1313
return server.getLocalPort();
1414
}
1515
}
16+
17+
@SneakyThrows
18+
public static ServerSocket createServerOnRandomPort(){
19+
return new ServerSocket(0);
20+
}
1621
}

src/test/java/com/mageddo/dnsproxyserver/solver/SolverRemoteTest.java

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
import java.util.concurrent.Executor;
2020

2121
import static org.junit.jupiter.api.Assertions.assertEquals;
22+
import static org.junit.jupiter.api.Assertions.assertFalse;
23+
import static org.junit.jupiter.api.Assertions.assertNotNull;
2224
import static org.junit.jupiter.api.Assertions.assertNull;
2325
import static org.junit.jupiter.api.Assertions.assertTrue;
2426
import static org.mockito.ArgumentMatchers.any;
2527
import static org.mockito.Mockito.doReturn;
28+
import static org.mockito.Mockito.lenient;
29+
import static org.mockito.Mockito.verify;
2630

2731
@ExtendWith(MockitoExtension.class)
2832
class SolverRemoteTest {
@@ -45,7 +49,8 @@ class SolverRemoteTest {
4549

4650
@BeforeEach
4751
void beforeEach (){
48-
doReturn(Executors.newThreadExecutor())
52+
lenient()
53+
.doReturn(Executors.newThreadExecutor())
4954
.when(this.resolvers)
5055
.getExecutor();
5156
}
@@ -162,4 +167,48 @@ void mustReturnRaEvenWhenRemoteServerDoesntReturnsRA() throws Exception {
162167
assertEquals(Response.DEFAULT_SUCCESS_TTL, result.getDpsTtl());
163168
}
164169

170+
@Test
171+
void mustPingRemoteServerWhileQueryingWhenFeatureIsActive(){
172+
173+
// arrange
174+
final var query = MessageTemplates.acmeAQuery();
175+
final var answer = MessageTemplates.buildAAnswer(query);
176+
177+
doReturn(true).when(this.solverRemote).isPingWhileGettingQueryResponseActive();
178+
179+
doReturn(InetSocketAddressTemplates._8_8_8_8())
180+
.when(this.resolver)
181+
.getAddress()
182+
;
183+
184+
doReturn(CompletableFuture.completedFuture(answer))
185+
.when(this.resolver)
186+
.sendAsync(any(), any(Executor.class));
187+
188+
doReturn(List.of(this.resolver))
189+
.when(this.resolvers)
190+
.resolvers()
191+
;
192+
193+
// act
194+
final var res = this.solverRemote.handle(query);
195+
196+
// assert
197+
assertNotNull(res);
198+
verify(this.solverRemote).pingWhileGettingQueryResponse(any(), any());
199+
200+
}
201+
202+
@Test
203+
void pingRemoteServerWhileQueryingDisabledByDefault(){
204+
205+
// act
206+
final var active = this.solverRemote.isPingWhileGettingQueryResponseActive();
207+
208+
// assert
209+
assertFalse(active);
210+
211+
}
212+
213+
165214
}

src/test/java/com/mageddo/dnsproxyserver/solver/remote/application/CircuitBreakerCheckerServiceTest.java

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

3+
import com.mageddo.dnsproxyserver.solver.remote.Result;
4+
import com.mageddo.net.SocketUtils;
5+
import dev.failsafe.CircuitBreaker;
36
import org.junit.jupiter.api.Test;
47
import org.junit.jupiter.api.extension.ExtendWith;
58
import org.mockito.InjectMocks;
@@ -8,6 +11,8 @@
811
import testing.templates.InetSocketAddressTemplates;
912
import testing.templates.solver.remote.FailSafeCircuitBreakerTemplates;
1013

14+
import java.net.InetSocketAddress;
15+
1116
import static org.junit.jupiter.api.Assertions.assertFalse;
1217
import static org.junit.jupiter.api.Assertions.assertTrue;
1318
import static org.mockito.ArgumentMatchers.any;
@@ -63,4 +68,22 @@ void mustReturnFalseWhenThereIsAFatalException() {
6368
assertFalse(ok);
6469
}
6570

71+
@Test
72+
void mustPingSpecifiedPort() throws Exception {
73+
74+
// arrange
75+
final var server = SocketUtils.createServerOnRandomPort();
76+
final var address = (InetSocketAddress) server.getLocalSocketAddress();
77+
final var circuitBreaker = CircuitBreaker.<Result>builder().build();
78+
79+
try (server) {
80+
// act
81+
final var success = this.service.safeCheck(address, circuitBreaker);
82+
83+
// assert
84+
assertTrue(success);
85+
}
86+
87+
}
88+
6689
}

src/test/java/com/mageddo/net/NetworksTest.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
package com.mageddo.net;
22

3-
import testing.templates.IpTemplates;
4-
import testing.templates.NetworkInterfaceTemplates;
53
import org.junit.jupiter.api.AfterAll;
64
import org.junit.jupiter.api.BeforeAll;
75
import org.junit.jupiter.api.BeforeEach;
86
import org.junit.jupiter.api.Test;
97
import org.junit.jupiter.api.extension.ExtendWith;
108
import org.mockito.Spy;
119
import org.mockito.junit.jupiter.MockitoExtension;
10+
import testing.templates.IpTemplates;
11+
import testing.templates.NetworkInterfaceTemplates;
12+
13+
import java.net.InetSocketAddress;
1214

1315
import static org.junit.jupiter.api.Assertions.assertEquals;
1416
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -25,17 +27,17 @@ class NetworksTest {
2527
Network network;
2628

2729
@BeforeAll
28-
static void beforeAll(){
30+
static void beforeAll() {
2931
realNetwork = Networks.network;
3032
}
3133

3234
@AfterAll
33-
static void afterAll(){
35+
static void afterAll() {
3436
Networks.network = realNetwork;
3537
}
3638

3739
@BeforeEach
38-
void before(){
40+
void before() {
3941
Networks.network = this.network;
4042
}
4143

@@ -77,4 +79,21 @@ void mustPreferNonLoopbackAddresses() {
7779
assertEquals(IpTemplates.LOCAL_192, ip.toText());
7880
}
7981

82+
@Test
83+
void mustPingSpecifiedPort() throws Exception {
84+
85+
// arrange
86+
final var server = SocketUtils.createServerOnRandomPort();
87+
final var address = (InetSocketAddress) server.getLocalSocketAddress();
88+
89+
try (server) {
90+
// act
91+
final var success = Networks.ping(address, 1000);
92+
93+
// assert
94+
assertTrue(success);
95+
}
96+
97+
}
98+
8099
}

0 commit comments

Comments
 (0)