1616
1717package com .alibaba .fluss .rpc .netty .server ;
1818
19- import com .alibaba .fluss .record .send .Send ;
2019import com .alibaba .fluss .rpc .RpcGatewayService ;
2120import com .alibaba .fluss .rpc .messages .ApiMessage ;
22- import com .alibaba .fluss .rpc .messages .FetchLogRequest ;
23- import com .alibaba .fluss .rpc .protocol .ApiError ;
24- import com .alibaba .fluss .rpc .protocol .ApiKeys ;
2521import com .alibaba .fluss .rpc .protocol .ApiMethod ;
2622import com .alibaba .fluss .rpc .protocol .RequestType ;
27- import com .alibaba .fluss .shaded .netty4 .io .netty .buffer .ByteBuf ;
28- import com .alibaba .fluss .shaded .netty4 .io .netty .buffer .ByteBufAllocator ;
29- import com .alibaba .fluss .shaded .netty4 .io .netty .channel .ChannelHandlerContext ;
3023
3124import org .slf4j .Logger ;
3225import org .slf4j .LoggerFactory ;
3326
3427import java .lang .reflect .InvocationTargetException ;
35- import java .util .Optional ;
3628import java .util .concurrent .CompletableFuture ;
3729
38- import static com .alibaba .fluss .rpc .protocol .MessageCodec .encodeErrorResponse ;
39- import static com .alibaba .fluss .rpc .protocol .MessageCodec .encodeSuccessResponse ;
4030import static com .alibaba .fluss .utils .ExceptionUtils .stripException ;
4131
4232/** A handler that processes and answers incoming {@link FlussRequest}. */
4333public class FlussRequestHandler implements RequestHandler <FlussRequest > {
4434 private static final Logger LOG = LoggerFactory .getLogger (FlussRequestHandler .class );
4535
4636 private final RpcGatewayService service ;
47- private final RequestsMetrics requestsMetrics ;
4837
49- public FlussRequestHandler (RpcGatewayService service , RequestsMetrics requestsMetrics ) {
38+ public FlussRequestHandler (RpcGatewayService service ) {
5039 this .service = service ;
51- this .requestsMetrics = requestsMetrics ;
5240 }
5341
5442 @ Override
@@ -58,7 +46,7 @@ public RequestType requestType() {
5846
5947 @ Override
6048 public void processRequest (FlussRequest request ) {
61- long requestDequeTimeMs = System .currentTimeMillis ();
49+ request . setRequestDequeTimeMs ( System .currentTimeMillis () );
6250 ApiMethod api = request .getApiMethod ();
6351 ApiMessage message = request .getMessage ();
6452 try {
@@ -69,14 +57,14 @@ public void processRequest(FlussRequest request) {
6957 (CompletableFuture <?>) api .getMethod ().invoke (service , message );
7058 responseFuture .whenComplete (
7159 (response , throwable ) -> {
60+ request .setRequestCompletedTimeMs (System .currentTimeMillis ());
7261 if (throwable != null ) {
73- sendError ( request , throwable );
62+ request . fail ( throwable );
7463 } else {
7564 if (response instanceof ApiMessage ) {
76- sendResponse ( request , requestDequeTimeMs , (ApiMessage ) response );
65+ request . complete ( (ApiMessage ) response );
7766 } else {
78- sendError (
79- request ,
67+ request .fail (
8068 new ClassCastException (
8169 "The response "
8270 + response .getClass ().getName ()
@@ -86,72 +74,7 @@ public void processRequest(FlussRequest request) {
8674 });
8775 } catch (Throwable t ) {
8876 LOG .debug ("Error while executing RPC {}" , api , t );
89- sendError ( request , stripException (t , InvocationTargetException .class ));
77+ request . fail ( stripException (t , InvocationTargetException .class ));
9078 }
9179 }
92-
93- private void sendResponse (
94- FlussRequest request , long requestDequeTimeMs , ApiMessage responseMessage ) {
95- long requestCompletedTimeMs = System .currentTimeMillis ();
96- // TODO: use a memory managed allocator
97- ChannelHandlerContext channelContext = request .getChannelContext ();
98- ByteBufAllocator alloc = channelContext .alloc ();
99- try {
100- Send send = encodeSuccessResponse (alloc , request .getRequestId (), responseMessage );
101- send .writeTo (channelContext );
102- channelContext .flush ();
103- long requestEndTimeMs = System .currentTimeMillis ();
104- updateRequestMetrics (
105- request , requestDequeTimeMs , requestCompletedTimeMs , requestEndTimeMs );
106- } catch (Throwable t ) {
107- LOG .error ("Failed to send response to client." , t );
108- sendError (request , t );
109- }
110- }
111-
112- private void updateRequestMetrics (
113- FlussRequest request ,
114- long requestDequeTimeMs ,
115- long requestCompletedTimeMs ,
116- long requestEndTimeMs ) {
117- // get the metrics to be updated for this kind of request
118- Optional <RequestsMetrics .Metrics > optMetrics = getMetrics (request );
119- // no any metrics registered for the kind of request
120- if (!optMetrics .isPresent ()) {
121- return ;
122- }
123-
124- // now, we need to update metrics
125- RequestsMetrics .Metrics metrics = optMetrics .get ();
126-
127- metrics .getRequestsCount ().inc ();
128- metrics .getRequestBytes ().update (request .getMessage ().totalSize ());
129-
130- // update metrics related to time
131- metrics .getRequestQueueTimeMs ().update (requestDequeTimeMs - request .getStartTimeMs ());
132- metrics .getRequestProcessTimeMs ().update (requestCompletedTimeMs - requestDequeTimeMs );
133- metrics .getResponseSendTimeMs ().update (requestEndTimeMs - requestCompletedTimeMs );
134- metrics .getTotalTimeMs ().update (requestEndTimeMs - request .getStartTimeMs ());
135- }
136-
137- private void sendError (FlussRequest request , Throwable t ) {
138- ApiError error = ApiError .fromThrowable (t );
139- // TODO: use a memory managed allocator
140- ByteBufAllocator alloc = request .getChannelContext ().alloc ();
141- ByteBuf byteBuf = encodeErrorResponse (alloc , request .getRequestId (), error );
142- request .getChannelContext ().writeAndFlush (byteBuf );
143-
144- getMetrics (request ).ifPresent (metrics -> metrics .getErrorsCount ().inc ());
145- }
146-
147- private Optional <RequestsMetrics .Metrics > getMetrics (FlussRequest request ) {
148- boolean isFromFollower = false ;
149- ApiMessage requestMessage = request .getMessage ();
150- if (request .getApiKey () == ApiKeys .FETCH_LOG .id ) {
151- // for fetch, we need to identify it's from client or follower
152- FetchLogRequest fetchLogRequest = (FetchLogRequest ) requestMessage ;
153- isFromFollower = fetchLogRequest .getFollowerServerId () >= 0 ;
154- }
155- return requestsMetrics .getMetrics (request .getApiKey (), isFromFollower );
156- }
15780}
0 commit comments