Skip to content

Commit de1949e

Browse files
committed
[#9932] Replace DefaultFuture with CompletableFuture
1 parent d9ef155 commit de1949e

File tree

48 files changed

+470
-1057
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+470
-1057
lines changed

collector/src/main/java/com/navercorp/pinpoint/collector/cluster/ClusterPoint.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,17 @@
1717
package com.navercorp.pinpoint.collector.cluster;
1818

1919
import com.navercorp.pinpoint.common.server.cluster.ClusterKey;
20-
import com.navercorp.pinpoint.rpc.Future;
21-
2220
import com.navercorp.pinpoint.rpc.ResponseMessage;
2321
import org.apache.thrift.TBase;
2422

23+
import java.util.concurrent.CompletableFuture;
24+
2525
/**
2626
* Connection with agent module
2727
*/
2828
public interface ClusterPoint<M> {
2929

30-
Future<ResponseMessage> request(M request);
30+
CompletableFuture<ResponseMessage> request(M request);
3131

3232
ClusterKey getDestClusterKey();
3333

collector/src/main/java/com/navercorp/pinpoint/collector/cluster/GrpcAgentConnection.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@
2020
import com.navercorp.pinpoint.collector.receiver.grpc.PinpointGrpcServer;
2121
import com.navercorp.pinpoint.common.server.cluster.ClusterKey;
2222
import com.navercorp.pinpoint.profiler.context.grpc.CommandThriftToGrpcMessageConverter;
23-
import com.navercorp.pinpoint.rpc.DefaultFuture;
24-
import com.navercorp.pinpoint.rpc.Future;
2523
import com.navercorp.pinpoint.rpc.PinpointSocketException;
2624
import com.navercorp.pinpoint.rpc.ResponseMessage;
2725
import com.navercorp.pinpoint.rpc.packet.stream.StreamCode;
@@ -34,6 +32,7 @@
3432

3533
import java.util.List;
3634
import java.util.Objects;
35+
import java.util.concurrent.CompletableFuture;
3736

3837
/**
3938
* @author Taejin Koo
@@ -54,11 +53,11 @@ public GrpcAgentConnection(PinpointGrpcServer pinpointGrpcServer, List<Integer>
5453
}
5554

5655
@Override
57-
public Future<ResponseMessage> request(TBase<?, ?> request) {
56+
public CompletableFuture<ResponseMessage> request(TBase<?, ?> request) {
5857
GeneratedMessageV3 message = messageConverter.toMessage(request);
5958
if (message == null) {
60-
DefaultFuture<ResponseMessage> failedFuture = new DefaultFuture<>();
61-
failedFuture.setFailure(new PinpointSocketException(TRouteResult.NOT_SUPPORTED_REQUEST.name()));
59+
CompletableFuture<ResponseMessage> failedFuture = new CompletableFuture<>();
60+
failedFuture.completeExceptionally(new PinpointSocketException(TRouteResult.NOT_SUPPORTED_REQUEST.name()));
6261
return failedFuture;
6362
}
6463
return pinpointGrpcServer.request(message);

collector/src/main/java/com/navercorp/pinpoint/collector/cluster/ThriftAgentConnection.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.navercorp.pinpoint.collector.cluster;
1818

1919
import com.navercorp.pinpoint.common.server.cluster.ClusterKey;
20-
import com.navercorp.pinpoint.rpc.Future;
2120
import com.navercorp.pinpoint.rpc.ResponseMessage;
2221
import com.navercorp.pinpoint.rpc.server.ChannelProperties;
2322
import com.navercorp.pinpoint.rpc.server.PinpointServer;
@@ -27,6 +26,7 @@
2726

2827
import java.util.List;
2928
import java.util.Objects;
29+
import java.util.concurrent.CompletableFuture;
3030

3131
/**
3232
* @author koo.taejin
@@ -61,7 +61,7 @@ private static ClusterKey newClusterKey(ChannelProperties channelProperties) {
6161
}
6262

6363
@Override
64-
public Future<ResponseMessage> request(byte[] payload) {
64+
public CompletableFuture<ResponseMessage> request(byte[] payload) {
6565
return pinpointServer.request(payload);
6666
}
6767

collector/src/main/java/com/navercorp/pinpoint/collector/cluster/route/DefaultRouteHandler.java

+24-21
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@
2121
import com.navercorp.pinpoint.collector.cluster.GrpcAgentConnection;
2222
import com.navercorp.pinpoint.collector.cluster.ThriftAgentConnection;
2323
import com.navercorp.pinpoint.collector.cluster.route.filter.RouteFilter;
24-
import com.navercorp.pinpoint.rpc.Future;
2524
import com.navercorp.pinpoint.rpc.ResponseMessage;
2625
import com.navercorp.pinpoint.thrift.dto.command.TCommandTransferResponse;
2726
import com.navercorp.pinpoint.thrift.dto.command.TRouteResult;
28-
2927
import org.apache.commons.lang3.ArrayUtils;
3028
import org.apache.thrift.TBase;
3129

30+
import java.util.concurrent.CompletableFuture;
31+
import java.util.concurrent.ExecutionException;
32+
import java.util.concurrent.TimeUnit;
33+
import java.util.concurrent.TimeoutException;
34+
3235
/**
3336
* @author koo.taejin
3437
* @author HyunGil Jeong
@@ -83,7 +86,7 @@ private TCommandTransferResponse onRoute0(RequestEvent event) {
8386
return createResponse(TRouteResult.NOT_SUPPORTED_REQUEST);
8487
}
8588

86-
Future<ResponseMessage> future;
89+
CompletableFuture<ResponseMessage> future;
8790
if (clusterPoint instanceof ThriftAgentConnection) {
8891
ThriftAgentConnection thriftAgentConnection = (ThriftAgentConnection) clusterPoint;
8992
future = thriftAgentConnection.request(event.getDeliveryCommand().getPayload());
@@ -94,26 +97,26 @@ private TCommandTransferResponse onRoute0(RequestEvent event) {
9497
return createResponse(TRouteResult.NOT_ACCEPTABLE);
9598
}
9699

97-
boolean isCompleted = future.await();
98-
if (!isCompleted) {
100+
try {
101+
ResponseMessage responseMessage = future.get(3000, TimeUnit.MILLISECONDS);
102+
if (responseMessage == null) {
103+
return createResponse(TRouteResult.EMPTY_RESPONSE);
104+
}
105+
106+
final byte[] responsePayload = responseMessage.getMessage();
107+
if (ArrayUtils.isEmpty(responsePayload)) {
108+
return createResponse(TRouteResult.EMPTY_RESPONSE, new byte[0]);
109+
}
110+
111+
return createResponse(TRouteResult.OK, responsePayload);
112+
} catch (InterruptedException e) {
113+
Thread.currentThread().interrupt();
114+
return createResponse(TRouteResult.UNKNOWN, e.getMessage());
115+
} catch (ExecutionException e) {
116+
return createResponse(TRouteResult.UNKNOWN, e.getCause().getMessage());
117+
} catch (TimeoutException e) {
99118
return createResponse(TRouteResult.TIMEOUT);
100119
}
101-
102-
if (future.getCause() != null) {
103-
return createResponse(TRouteResult.UNKNOWN, future.getCause().getMessage());
104-
}
105-
106-
ResponseMessage responseMessage = future.getResult();
107-
if (responseMessage == null) {
108-
return createResponse(TRouteResult.EMPTY_RESPONSE);
109-
}
110-
111-
final byte[] responsePayload = responseMessage.getMessage();
112-
if (ArrayUtils.isEmpty(responsePayload)) {
113-
return createResponse(TRouteResult.EMPTY_RESPONSE, new byte[0]);
114-
}
115-
116-
return createResponse(TRouteResult.OK, responsePayload);
117120
}
118121

119122
}

collector/src/main/java/com/navercorp/pinpoint/collector/controller/ClusterPointController.java

+23-18
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import com.navercorp.pinpoint.common.util.Assert;
2727
import com.navercorp.pinpoint.common.util.StringUtils;
2828
import com.navercorp.pinpoint.io.request.Message;
29-
import com.navercorp.pinpoint.rpc.Future;
3029
import com.navercorp.pinpoint.rpc.PinpointSocketException;
3130
import com.navercorp.pinpoint.rpc.ResponseMessage;
3231
import com.navercorp.pinpoint.rpc.common.SocketStateCode;
@@ -35,9 +34,9 @@
3534
import com.navercorp.pinpoint.thrift.io.HeaderTBaseDeserializer;
3635
import io.grpc.Status;
3736
import io.grpc.StatusRuntimeException;
38-
import org.apache.thrift.TBase;
39-
import org.apache.logging.log4j.Logger;
4037
import org.apache.logging.log4j.LogManager;
38+
import org.apache.logging.log4j.Logger;
39+
import org.apache.thrift.TBase;
4140
import org.springframework.web.bind.annotation.GetMapping;
4241
import org.springframework.web.bind.annotation.RequestMapping;
4342
import org.springframework.web.bind.annotation.RequestParam;
@@ -47,6 +46,10 @@
4746
import java.util.ArrayList;
4847
import java.util.List;
4948
import java.util.Objects;
49+
import java.util.concurrent.CompletableFuture;
50+
import java.util.concurrent.ExecutionException;
51+
import java.util.concurrent.TimeUnit;
52+
import java.util.concurrent.TimeoutException;
5053

5154
/**
5255
* @author Taejin Koo
@@ -158,7 +161,7 @@ private List<GrpcAgentConnection> getGrpcAgentConnectionList(final String applic
158161
private CheckConnectionStatusResult request(GrpcAgentConnection grpcAgentConnection, int checkCount) {
159162
logger.info("Ping message will be sent. collector => {}.", grpcAgentConnection.getDestClusterKey());
160163

161-
Future<ResponseMessage> response = null;
164+
CompletableFuture<ResponseMessage> response = null;
162165
try {
163166
response = request0(grpcAgentConnection, checkCount);
164167
} catch (StatusRuntimeException e) {
@@ -173,15 +176,8 @@ private CheckConnectionStatusResult request(GrpcAgentConnection grpcAgentConnect
173176
clearConnection(grpcAgentConnection);
174177
return CheckConnectionStatusResult.FAIL_AND_CLEAR_CONNECTION;
175178
}
176-
177-
if (!response.isSuccess()) {
178-
Throwable cause = response.getCause();
179-
logger.warn("Failed while request message. message:{}", cause.getMessage(), cause);
180-
return CheckConnectionStatusResult.FAIL;
181-
}
182-
183179
try {
184-
ResponseMessage result = response.getResult();
180+
ResponseMessage result = response.get(3000, TimeUnit.MILLISECONDS);
185181
Message<TBase<?, ?>> deserialize = tBaseDeserializer.deserialize(result.getMessage());
186182

187183
TBase<?, ?> data = deserialize.getData();
@@ -191,9 +187,11 @@ private CheckConnectionStatusResult request(GrpcAgentConnection grpcAgentConnect
191187
}
192188
}
193189
logger.warn("Receive unexpected response data. data:{}", data);
194-
} catch (Exception e) {
195-
logger.warn("Exception occurred while handles response message. message:{}", e.getMessage(), e);
190+
} catch (Exception cause) {
191+
logger.warn("Failed while request message. message:{}", cause.getMessage(), cause);
192+
return CheckConnectionStatusResult.FAIL;
196193
}
194+
197195
return CheckConnectionStatusResult.FAIL;
198196
}
199197

@@ -204,12 +202,19 @@ private void clearConnection(GrpcAgentConnection grpcAgentConnection) {
204202

205203
// If the occur excption in connection, do not retry
206204
// Multiple attempts only at timeout
207-
private Future<ResponseMessage> request0(GrpcAgentConnection grpcAgentConnection, int maxCount) {
205+
private CompletableFuture<ResponseMessage> request0(GrpcAgentConnection grpcAgentConnection, int maxCount) {
208206
for (int i = 0; i < maxCount; i++) {
209-
Future<ResponseMessage> responseFuture = grpcAgentConnection.request(CONNECTION_CHECK_COMMAND);
210-
boolean await = responseFuture.await();
211-
if (await) {
207+
CompletableFuture<ResponseMessage> responseFuture = grpcAgentConnection.request(CONNECTION_CHECK_COMMAND);
208+
try {
209+
responseFuture.get(3000, TimeUnit.MILLISECONDS);
212210
return responseFuture;
211+
} catch (InterruptedException e) {
212+
Thread.currentThread().interrupt();
213+
throw new PinpointSocketException(e);
214+
} catch (ExecutionException e) {
215+
throw new PinpointSocketException(e.getCause());
216+
} catch (TimeoutException e) {
217+
throw new PinpointSocketException(e);
213218
}
214219
}
215220

collector/src/main/java/com/navercorp/pinpoint/collector/receiver/grpc/PinpointGrpcServer.java

+12-14
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package com.navercorp.pinpoint.collector.receiver.grpc;
1818

19+
import com.google.protobuf.Empty;
20+
import com.google.protobuf.GeneratedMessageV3;
1921
import com.navercorp.pinpoint.collector.cluster.GrpcAgentConnection;
2022
import com.navercorp.pinpoint.collector.cluster.ProfilerClusterManager;
2123
import com.navercorp.pinpoint.common.server.cluster.ClusterKey;
@@ -27,8 +29,6 @@
2729
import com.navercorp.pinpoint.grpc.trace.PCmdRequest;
2830
import com.navercorp.pinpoint.grpc.trace.PCmdResponse;
2931
import com.navercorp.pinpoint.profiler.context.thrift.CommandGrpcToThriftMessageConverter;
30-
import com.navercorp.pinpoint.rpc.DefaultFuture;
31-
import com.navercorp.pinpoint.rpc.Future;
3232
import com.navercorp.pinpoint.rpc.PinpointSocketException;
3333
import com.navercorp.pinpoint.rpc.ResponseMessage;
3434
import com.navercorp.pinpoint.rpc.client.RequestManager;
@@ -46,21 +46,19 @@
4646
import com.navercorp.pinpoint.thrift.dto.command.TRouteResult;
4747
import com.navercorp.pinpoint.thrift.io.CommandHeaderTBaseSerializerFactory;
4848
import com.navercorp.pinpoint.thrift.util.SerializationUtils;
49-
50-
import com.google.protobuf.Empty;
51-
import com.google.protobuf.GeneratedMessageV3;
5249
import io.grpc.Status;
5350
import io.grpc.StatusException;
5451
import io.grpc.stub.StreamObserver;
52+
import org.apache.logging.log4j.LogManager;
53+
import org.apache.logging.log4j.Logger;
5554
import org.apache.thrift.TBase;
5655
import org.apache.thrift.TException;
57-
import org.apache.logging.log4j.Logger;
58-
import org.apache.logging.log4j.LogManager;
5956

6057
import java.net.InetSocketAddress;
6158
import java.util.Collections;
6259
import java.util.List;
6360
import java.util.Objects;
61+
import java.util.concurrent.CompletableFuture;
6462
import java.util.concurrent.atomic.AtomicReference;
6563

6664
/**
@@ -135,7 +133,7 @@ private SocketStateChangeResult toState(SocketStateCode socketStateCode) {
135133
return result;
136134
}
137135

138-
public Future<ResponseMessage> request(GeneratedMessageV3 message) {
136+
public CompletableFuture<ResponseMessage> request(GeneratedMessageV3 message) {
139137
if (!state.checkState(SocketStateCode.RUN_DUPLEX)) {
140138
return createFailedFuture(new IllegalStateException("failed to request message. caused:illegal State"));
141139
}
@@ -145,7 +143,7 @@ public Future<ResponseMessage> request(GeneratedMessageV3 message) {
145143
return createFailedFuture(new PinpointSocketException(TRouteResult.NOT_SUPPORTED_REQUEST.name()));
146144
}
147145

148-
DefaultFuture<ResponseMessage> future = requestManager.register(request.getRequestId());
146+
CompletableFuture<ResponseMessage> future = requestManager.register(request.getRequestId());
149147
requestObserver.onNext(request);
150148
return future;
151149
}
@@ -346,9 +344,9 @@ public void close(SocketStateCode toState) {
346344
}
347345

348346
private void setFailMessageToFuture(int responseId, String message) {
349-
DefaultFuture<ResponseMessage> future = requestManager.removeMessageFuture(responseId);
347+
CompletableFuture<ResponseMessage> future = requestManager.removeMessageFuture(responseId);
350348
if (future != null) {
351-
future.setFailure(new PinpointSocketException(message));
349+
future.completeExceptionally(new PinpointSocketException(message));
352350
}
353351
}
354352

@@ -364,9 +362,9 @@ public ClusterKey getClusterKey() {
364362
return clusterKey;
365363
}
366364

367-
public Future<ResponseMessage> createFailedFuture(Exception failException) {
368-
DefaultFuture<ResponseMessage> failedFuture = new DefaultFuture<>();
369-
failedFuture.setFailure(failException);
365+
public CompletableFuture<ResponseMessage> createFailedFuture(Exception failException) {
366+
CompletableFuture<ResponseMessage> failedFuture = new CompletableFuture<>();
367+
failedFuture.completeExceptionally(failException);
370368
return failedFuture;
371369
}
372370
}

collector/src/test/java/com/navercorp/pinpoint/collector/cluster/route/GrpcAgentConnectionTest.java

+12-7
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,18 @@
1818

1919
import com.navercorp.pinpoint.collector.cluster.GrpcAgentConnection;
2020
import com.navercorp.pinpoint.collector.receiver.grpc.PinpointGrpcServer;
21-
import com.navercorp.pinpoint.rpc.Future;
2221
import com.navercorp.pinpoint.rpc.ResponseMessage;
2322
import com.navercorp.pinpoint.thrift.dto.TResult;
2423
import com.navercorp.pinpoint.thrift.dto.command.TCommandEcho;
2524
import com.navercorp.pinpoint.thrift.io.TCommandType;
2625
import org.junit.jupiter.api.Assertions;
2726
import org.junit.jupiter.api.Test;
27+
import org.junit.jupiter.api.function.Executable;
2828
import org.mockito.Mockito;
2929

3030
import java.util.List;
31+
import java.util.concurrent.CompletableFuture;
32+
import java.util.concurrent.TimeUnit;
3133

3234
/**
3335
* @author Taejin Koo
@@ -50,14 +52,18 @@ public void requestTest() {
5052
supportCommand = grpcAgentConnection.isSupportCommand(TCommandType.ECHO.getBodyFactory().getObject());
5153
Assertions.assertTrue(supportCommand);
5254

53-
Future<ResponseMessage> future = grpcAgentConnection.request(new TResult());
54-
Assertions.assertFalse(future.isSuccess());
55-
Assertions.assertNotNull(future.getCause());
55+
final CompletableFuture<ResponseMessage> future = grpcAgentConnection.request(new TResult());
5656

57+
Assertions.assertThrows(Exception.class, new Executable() {
58+
@Override
59+
public void execute() throws Throwable {
60+
future.get(3000, TimeUnit.MILLISECONDS);
61+
}
62+
});
5763
TCommandEcho commandEcho = new TCommandEcho("hello");
5864
// check to pass validation
59-
future = grpcAgentConnection.request(commandEcho);
60-
Assertions.assertNull(future);
65+
final CompletableFuture<ResponseMessage> future2 = grpcAgentConnection.request(commandEcho);
66+
Assertions.assertNull(future2);
6167
}
6268

6369
@Test
@@ -67,7 +73,6 @@ public void equalsTest() {
6773
List<Integer> supportCommandList = List.of(Short.toUnsignedInt(TCommandType.ECHO.getCode()));
6874
GrpcAgentConnection grpcAgentConnection = new GrpcAgentConnection(mockGrpcServer1, supportCommandList);
6975

70-
Assertions.assertEquals(grpcAgentConnection, grpcAgentConnection);
7176
Assertions.assertEquals(grpcAgentConnection, new GrpcAgentConnection(mockGrpcServer1, supportCommandList));
7277

7378
PinpointGrpcServer mockGrpcServer2 = Mockito.mock(PinpointGrpcServer.class);

0 commit comments

Comments
 (0)