mirror of https://github.com/grpc/grpc-java.git
Optimize for flow-control: only request for 2 responses in unary-response cases
This commit is contained in:
parent
d28535bb20
commit
b80abef13f
|
|
@ -117,7 +117,7 @@ public class ClientCalls {
|
||||||
public static <ReqT, RespT> Iterator<RespT> blockingServerStreamingCall(
|
public static <ReqT, RespT> Iterator<RespT> blockingServerStreamingCall(
|
||||||
ClientCall<ReqT, RespT> call, ReqT param) {
|
ClientCall<ReqT, RespT> call, ReqT param) {
|
||||||
BlockingResponseStream<RespT> result = new BlockingResponseStream<RespT>(call);
|
BlockingResponseStream<RespT> result = new BlockingResponseStream<RespT>(call);
|
||||||
asyncUnaryRequestCall(call, param, result.listener());
|
asyncUnaryRequestCall(call, param, result.listener(), true);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -130,7 +130,7 @@ public class ClientCalls {
|
||||||
ClientCall<ReqT, RespT> call,
|
ClientCall<ReqT, RespT> call,
|
||||||
ReqT param) {
|
ReqT param) {
|
||||||
GrpcFuture<RespT> responseFuture = new GrpcFuture<RespT>(call);
|
GrpcFuture<RespT> responseFuture = new GrpcFuture<RespT>(call);
|
||||||
asyncUnaryRequestCall(call, param, new UnaryStreamToFuture<RespT>(responseFuture));
|
asyncUnaryRequestCall(call, param, new UnaryStreamToFuture<RespT>(responseFuture), false);
|
||||||
return responseFuture;
|
return responseFuture;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -159,17 +159,16 @@ public class ClientCalls {
|
||||||
ClientCall<ReqT, RespT> call, ReqT param, StreamObserver<RespT> responseObserver,
|
ClientCall<ReqT, RespT> call, ReqT param, StreamObserver<RespT> responseObserver,
|
||||||
boolean streamingResponse) {
|
boolean streamingResponse) {
|
||||||
asyncUnaryRequestCall(call, param,
|
asyncUnaryRequestCall(call, param,
|
||||||
new StreamObserverToCallListenerAdapter<RespT>(call, responseObserver, streamingResponse));
|
new StreamObserverToCallListenerAdapter<RespT>(call, responseObserver, streamingResponse),
|
||||||
|
streamingResponse);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static <ReqT, RespT> void asyncUnaryRequestCall(
|
private static <ReqT, RespT> void asyncUnaryRequestCall(
|
||||||
ClientCall<ReqT, RespT> call,
|
ClientCall<ReqT, RespT> call,
|
||||||
ReqT param,
|
ReqT param,
|
||||||
ClientCall.Listener<RespT> responseListener) {
|
ClientCall.Listener<RespT> responseListener,
|
||||||
call.start(responseListener, new Metadata.Headers());
|
boolean streamingResponse) {
|
||||||
// Initially ask for two responses from flow-control so that if a misbehaving server sends more
|
startCall(call, responseListener, streamingResponse);
|
||||||
// than one responses, we can catch it.
|
|
||||||
call.request(2);
|
|
||||||
try {
|
try {
|
||||||
call.sendPayload(param);
|
call.sendPayload(param);
|
||||||
call.halfClose();
|
call.halfClose();
|
||||||
|
|
@ -182,14 +181,23 @@ public class ClientCalls {
|
||||||
private static <ReqT, RespT> StreamObserver<ReqT> asyncStreamingRequestCall(
|
private static <ReqT, RespT> StreamObserver<ReqT> asyncStreamingRequestCall(
|
||||||
ClientCall<ReqT, RespT> call, StreamObserver<RespT> responseObserver,
|
ClientCall<ReqT, RespT> call, StreamObserver<RespT> responseObserver,
|
||||||
boolean streamingResponse) {
|
boolean streamingResponse) {
|
||||||
call.start(new StreamObserverToCallListenerAdapter<RespT>(
|
startCall(call, new StreamObserverToCallListenerAdapter<RespT>(
|
||||||
call, responseObserver, streamingResponse), new Metadata.Headers());
|
call, responseObserver, streamingResponse), streamingResponse);
|
||||||
// Initially ask for two responses from flow-control so that if a misbehaving server sends more
|
|
||||||
// than one responses, we can catch it.
|
|
||||||
call.request(2);
|
|
||||||
return new CallToStreamObserverAdapter<ReqT>(call);
|
return new CallToStreamObserverAdapter<ReqT>(call);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static <ReqT, RespT> void startCall(ClientCall<ReqT, RespT> call,
|
||||||
|
ClientCall.Listener<RespT> responseListener, boolean streamingResponse) {
|
||||||
|
call.start(responseListener, new Metadata.Headers());
|
||||||
|
if (streamingResponse) {
|
||||||
|
call.request(1);
|
||||||
|
} else {
|
||||||
|
// Initially ask for two responses from flow-control so that if a misbehaving server sends
|
||||||
|
// more than one responses, we can catch it and fail it in the listener.
|
||||||
|
call.request(2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private static class CallToStreamObserverAdapter<T> implements StreamObserver<T> {
|
private static class CallToStreamObserverAdapter<T> implements StreamObserver<T> {
|
||||||
private final ClientCall<T, ?> call;
|
private final ClientCall<T, ?> call;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue