mirror of https://github.com/grpc/grpc-java.git
cronet: Update Cronet to latest release + Move to Stable Cronet APIs.
This commit is contained in:
parent
9de8e44384
commit
5a8da19f32
|
@ -20,7 +20,6 @@ import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
|
import static io.grpc.internal.GrpcUtil.DEFAULT_MAX_MESSAGE_SIZE;
|
||||||
|
|
||||||
import android.util.Log;
|
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Preconditions;
|
import com.google.common.base.Preconditions;
|
||||||
import com.google.common.util.concurrent.MoreExecutors;
|
import com.google.common.util.concurrent.MoreExecutors;
|
||||||
|
@ -38,8 +37,6 @@ import io.grpc.internal.ManagedChannelImplBuilder;
|
||||||
import io.grpc.internal.ManagedChannelImplBuilder.ClientTransportFactoryBuilder;
|
import io.grpc.internal.ManagedChannelImplBuilder.ClientTransportFactoryBuilder;
|
||||||
import io.grpc.internal.SharedResourceHolder;
|
import io.grpc.internal.SharedResourceHolder;
|
||||||
import io.grpc.internal.TransportTracer;
|
import io.grpc.internal.TransportTracer;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.net.SocketAddress;
|
import java.net.SocketAddress;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
@ -49,15 +46,11 @@ import java.util.concurrent.ScheduledExecutorService;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import org.chromium.net.BidirectionalStream;
|
import org.chromium.net.BidirectionalStream;
|
||||||
import org.chromium.net.CronetEngine;
|
import org.chromium.net.CronetEngine;
|
||||||
import org.chromium.net.ExperimentalBidirectionalStream;
|
|
||||||
import org.chromium.net.ExperimentalCronetEngine;
|
|
||||||
|
|
||||||
/** Convenience class for building channels with the cronet transport. */
|
/** Convenience class for building channels with the cronet transport. */
|
||||||
@ExperimentalApi("There is no plan to make this API stable, given transport API instability")
|
@ExperimentalApi("There is no plan to make this API stable, given transport API instability")
|
||||||
public final class CronetChannelBuilder extends ForwardingChannelBuilder2<CronetChannelBuilder> {
|
public final class CronetChannelBuilder extends ForwardingChannelBuilder2<CronetChannelBuilder> {
|
||||||
|
|
||||||
private static final String LOG_TAG = "CronetChannelBuilder";
|
|
||||||
|
|
||||||
/** BidirectionalStream.Builder factory used for getting the gRPC BidirectionalStream. */
|
/** BidirectionalStream.Builder factory used for getting the gRPC BidirectionalStream. */
|
||||||
public static abstract class StreamBuilderFactory {
|
public static abstract class StreamBuilderFactory {
|
||||||
public abstract BidirectionalStream.Builder newBidirectionalStreamBuilder(
|
public abstract BidirectionalStream.Builder newBidirectionalStreamBuilder(
|
||||||
|
@ -296,11 +289,6 @@ public final class CronetChannelBuilder extends ForwardingChannelBuilder2<Cronet
|
||||||
* StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced.
|
* StreamBuilderFactory impl that applies TrafficStats tags to stream builders that are produced.
|
||||||
*/
|
*/
|
||||||
private static class TaggingStreamFactory extends StreamBuilderFactory {
|
private static class TaggingStreamFactory extends StreamBuilderFactory {
|
||||||
private static volatile boolean loadSetTrafficStatsTagAttempted;
|
|
||||||
private static volatile boolean loadSetTrafficStatsUidAttempted;
|
|
||||||
private static volatile Method setTrafficStatsTagMethod;
|
|
||||||
private static volatile Method setTrafficStatsUidMethod;
|
|
||||||
|
|
||||||
private final CronetEngine cronetEngine;
|
private final CronetEngine cronetEngine;
|
||||||
private final boolean trafficStatsTagSet;
|
private final boolean trafficStatsTagSet;
|
||||||
private final int trafficStatsTag;
|
private final int trafficStatsTag;
|
||||||
|
@ -323,74 +311,16 @@ public final class CronetChannelBuilder extends ForwardingChannelBuilder2<Cronet
|
||||||
@Override
|
@Override
|
||||||
public BidirectionalStream.Builder newBidirectionalStreamBuilder(
|
public BidirectionalStream.Builder newBidirectionalStreamBuilder(
|
||||||
String url, BidirectionalStream.Callback callback, Executor executor) {
|
String url, BidirectionalStream.Callback callback, Executor executor) {
|
||||||
ExperimentalBidirectionalStream.Builder builder =
|
BidirectionalStream.Builder builder =
|
||||||
((ExperimentalCronetEngine) cronetEngine)
|
cronetEngine
|
||||||
.newBidirectionalStreamBuilder(url, callback, executor);
|
.newBidirectionalStreamBuilder(url, callback, executor);
|
||||||
if (trafficStatsTagSet) {
|
if (trafficStatsTagSet) {
|
||||||
setTrafficStatsTag(builder, trafficStatsTag);
|
builder.setTrafficStatsTag(trafficStatsTag);
|
||||||
}
|
}
|
||||||
if (trafficStatsUidSet) {
|
if (trafficStatsUidSet) {
|
||||||
setTrafficStatsUid(builder, trafficStatsUid);
|
builder.setTrafficStatsUid(trafficStatsUid);
|
||||||
}
|
}
|
||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setTrafficStatsTag(ExperimentalBidirectionalStream.Builder builder,
|
|
||||||
int tag) {
|
|
||||||
if (!loadSetTrafficStatsTagAttempted) {
|
|
||||||
synchronized (TaggingStreamFactory.class) {
|
|
||||||
if (!loadSetTrafficStatsTagAttempted) {
|
|
||||||
try {
|
|
||||||
setTrafficStatsTagMethod = ExperimentalBidirectionalStream.Builder.class
|
|
||||||
.getMethod("setTrafficStatsTag", int.class);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
Log.w(LOG_TAG,
|
|
||||||
"Failed to load method ExperimentalBidirectionalStream.Builder.setTrafficStatsTag",
|
|
||||||
e);
|
|
||||||
} finally {
|
|
||||||
loadSetTrafficStatsTagAttempted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (setTrafficStatsTagMethod != null) {
|
|
||||||
try {
|
|
||||||
setTrafficStatsTagMethod.invoke(builder, tag);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
Log.w(LOG_TAG, "Failed to set traffic stats tag: " + tag, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void setTrafficStatsUid(ExperimentalBidirectionalStream.Builder builder,
|
|
||||||
int uid) {
|
|
||||||
if (!loadSetTrafficStatsUidAttempted) {
|
|
||||||
synchronized (TaggingStreamFactory.class) {
|
|
||||||
if (!loadSetTrafficStatsUidAttempted) {
|
|
||||||
try {
|
|
||||||
setTrafficStatsUidMethod = ExperimentalBidirectionalStream.Builder.class
|
|
||||||
.getMethod("setTrafficStatsUid", int.class);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
Log.w(LOG_TAG,
|
|
||||||
"Failed to load method ExperimentalBidirectionalStream.Builder.setTrafficStatsUid",
|
|
||||||
e);
|
|
||||||
} finally {
|
|
||||||
loadSetTrafficStatsUidAttempted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (setTrafficStatsUidMethod != null) {
|
|
||||||
try {
|
|
||||||
setTrafficStatsUidMethod.invoke(builder, uid);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
Log.w(LOG_TAG, "Failed to set traffic stats uid: " + uid, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,8 +40,6 @@ import io.grpc.internal.StatsTraceContext;
|
||||||
import io.grpc.internal.TransportFrameUtil;
|
import io.grpc.internal.TransportFrameUtil;
|
||||||
import io.grpc.internal.TransportTracer;
|
import io.grpc.internal.TransportTracer;
|
||||||
import io.grpc.internal.WritableBuffer;
|
import io.grpc.internal.WritableBuffer;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.nio.Buffer;
|
import java.nio.Buffer;
|
||||||
import java.nio.ByteBuffer;
|
import java.nio.ByteBuffer;
|
||||||
import java.nio.charset.Charset;
|
import java.nio.charset.Charset;
|
||||||
|
@ -55,7 +53,6 @@ import javax.annotation.Nullable;
|
||||||
import javax.annotation.concurrent.GuardedBy;
|
import javax.annotation.concurrent.GuardedBy;
|
||||||
import org.chromium.net.BidirectionalStream;
|
import org.chromium.net.BidirectionalStream;
|
||||||
import org.chromium.net.CronetException;
|
import org.chromium.net.CronetException;
|
||||||
import org.chromium.net.ExperimentalBidirectionalStream;
|
|
||||||
import org.chromium.net.UrlResponseInfo;
|
import org.chromium.net.UrlResponseInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -66,9 +63,6 @@ class CronetClientStream extends AbstractClientStream {
|
||||||
private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0);
|
private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0);
|
||||||
private static final String LOG_TAG = "grpc-java-cronet";
|
private static final String LOG_TAG = "grpc-java-cronet";
|
||||||
|
|
||||||
private static volatile boolean loadAddRequestAnnotationAttempted;
|
|
||||||
private static volatile Method addRequestAnnotationMethod;
|
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
static final CallOptions.Key<Object> CRONET_ANNOTATION_KEY =
|
static final CallOptions.Key<Object> CRONET_ANNOTATION_KEY =
|
||||||
CallOptions.Key.create("cronet-annotation");
|
CallOptions.Key.create("cronet-annotation");
|
||||||
|
@ -194,14 +188,12 @@ class CronetClientStream extends AbstractClientStream {
|
||||||
builder.delayRequestHeadersUntilFirstFlush(true);
|
builder.delayRequestHeadersUntilFirstFlush(true);
|
||||||
}
|
}
|
||||||
if (annotation != null || annotations != null) {
|
if (annotation != null || annotations != null) {
|
||||||
ExperimentalBidirectionalStream.Builder expBidiStreamBuilder =
|
|
||||||
(ExperimentalBidirectionalStream.Builder) builder;
|
|
||||||
if (annotation != null) {
|
if (annotation != null) {
|
||||||
addRequestAnnotation(expBidiStreamBuilder, annotation);
|
builder.addRequestAnnotation(annotation);
|
||||||
}
|
}
|
||||||
if (annotations != null) {
|
if (annotations != null) {
|
||||||
for (Object o : annotations) {
|
for (Object o : annotations) {
|
||||||
addRequestAnnotation(expBidiStreamBuilder, o);
|
builder.addRequestAnnotation(o);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -367,35 +359,6 @@ class CronetClientStream extends AbstractClientStream {
|
||||||
&& !TE_HEADER.name().equalsIgnoreCase(key);
|
&& !TE_HEADER.name().equalsIgnoreCase(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void addRequestAnnotation(ExperimentalBidirectionalStream.Builder builder,
|
|
||||||
Object annotation) {
|
|
||||||
if (!loadAddRequestAnnotationAttempted) {
|
|
||||||
synchronized (CronetClientStream.class) {
|
|
||||||
if (!loadAddRequestAnnotationAttempted) {
|
|
||||||
try {
|
|
||||||
addRequestAnnotationMethod = ExperimentalBidirectionalStream.Builder.class
|
|
||||||
.getMethod("addRequestAnnotation", Object.class);
|
|
||||||
} catch (NoSuchMethodException e) {
|
|
||||||
Log.w(LOG_TAG,
|
|
||||||
"Failed to load method ExperimentalBidirectionalStream.Builder.addRequestAnnotation",
|
|
||||||
e);
|
|
||||||
} finally {
|
|
||||||
loadAddRequestAnnotationAttempted = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (addRequestAnnotationMethod != null) {
|
|
||||||
try {
|
|
||||||
addRequestAnnotationMethod.invoke(builder, annotation);
|
|
||||||
} catch (InvocationTargetException e) {
|
|
||||||
throw new RuntimeException(e.getCause() == null ? e.getTargetException() : e.getCause());
|
|
||||||
} catch (IllegalAccessException e) {
|
|
||||||
Log.w(LOG_TAG, "Failed to add request annotation: " + annotation, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setGrpcHeaders(BidirectionalStream.Builder builder) {
|
private void setGrpcHeaders(BidirectionalStream.Builder builder) {
|
||||||
// Psuedo-headers are set by cronet.
|
// Psuedo-headers are set by cronet.
|
||||||
// All non-pseudo headers must come after pseudo headers.
|
// All non-pseudo headers must come after pseudo headers.
|
||||||
|
|
|
@ -35,7 +35,7 @@ import io.grpc.internal.SharedResourceHolder;
|
||||||
import io.grpc.testing.TestMethodDescriptors;
|
import io.grpc.testing.TestMethodDescriptors;
|
||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
import org.chromium.net.ExperimentalCronetEngine;
|
import org.chromium.net.CronetEngine;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
@ -50,7 +50,7 @@ import org.robolectric.annotation.Config;
|
||||||
public final class CronetChannelBuilderTest {
|
public final class CronetChannelBuilderTest {
|
||||||
@Rule public final MockitoRule mocks = MockitoJUnit.rule();
|
@Rule public final MockitoRule mocks = MockitoJUnit.rule();
|
||||||
|
|
||||||
@Mock private ExperimentalCronetEngine mockEngine;
|
@Mock private CronetEngine mockEngine;
|
||||||
@Mock private ChannelLogger channelLogger;
|
@Mock private ChannelLogger channelLogger;
|
||||||
|
|
||||||
private final ClientStreamTracer[] tracers =
|
private final ClientStreamTracer[] tracers =
|
||||||
|
|
|
@ -54,7 +54,6 @@ import java.util.Map;
|
||||||
import java.util.concurrent.Executor;
|
import java.util.concurrent.Executor;
|
||||||
import org.chromium.net.BidirectionalStream;
|
import org.chromium.net.BidirectionalStream;
|
||||||
import org.chromium.net.CronetException;
|
import org.chromium.net.CronetException;
|
||||||
import org.chromium.net.ExperimentalBidirectionalStream;
|
|
||||||
import org.chromium.net.UrlResponseInfo;
|
import org.chromium.net.UrlResponseInfo;
|
||||||
import org.chromium.net.impl.UrlResponseInfoImpl;
|
import org.chromium.net.impl.UrlResponseInfoImpl;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
@ -76,9 +75,9 @@ public final class CronetClientStreamTest {
|
||||||
@Mock private CronetClientTransport transport;
|
@Mock private CronetClientTransport transport;
|
||||||
private Metadata metadata = new Metadata();
|
private Metadata metadata = new Metadata();
|
||||||
@Mock private StreamBuilderFactory factory;
|
@Mock private StreamBuilderFactory factory;
|
||||||
@Mock private ExperimentalBidirectionalStream cronetStream;
|
@Mock private BidirectionalStream cronetStream;
|
||||||
@Mock private ClientStreamListener clientListener;
|
@Mock private ClientStreamListener clientListener;
|
||||||
@Mock private ExperimentalBidirectionalStream.Builder builder;
|
@Mock private BidirectionalStream.Builder builder;
|
||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
private final TransportTracer transportTracer = TransportTracer.getDefaultFactory().create();
|
private final TransportTracer transportTracer = TransportTracer.getDefaultFactory().create();
|
||||||
private final Executor executor = new Executor() {
|
private final Executor executor = new Executor() {
|
||||||
|
@ -681,8 +680,8 @@ public final class CronetClientStreamTest {
|
||||||
true,
|
true,
|
||||||
false);
|
false);
|
||||||
callback.setStream(stream);
|
callback.setStream(stream);
|
||||||
ExperimentalBidirectionalStream.Builder getBuilder =
|
BidirectionalStream.Builder getBuilder =
|
||||||
mock(ExperimentalBidirectionalStream.Builder.class);
|
mock(BidirectionalStream.Builder.class);
|
||||||
when(getFactory.newBidirectionalStreamBuilder(
|
when(getFactory.newBidirectionalStreamBuilder(
|
||||||
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
||||||
.thenReturn(getBuilder);
|
.thenReturn(getBuilder);
|
||||||
|
@ -738,8 +737,8 @@ public final class CronetClientStreamTest {
|
||||||
true,
|
true,
|
||||||
true);
|
true);
|
||||||
callback.setStream(stream);
|
callback.setStream(stream);
|
||||||
ExperimentalBidirectionalStream.Builder builder =
|
BidirectionalStream.Builder builder =
|
||||||
mock(ExperimentalBidirectionalStream.Builder.class);
|
mock(BidirectionalStream.Builder.class);
|
||||||
when(factory.newBidirectionalStreamBuilder(
|
when(factory.newBidirectionalStreamBuilder(
|
||||||
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
||||||
.thenReturn(builder);
|
.thenReturn(builder);
|
||||||
|
@ -770,8 +769,8 @@ public final class CronetClientStreamTest {
|
||||||
true,
|
true,
|
||||||
true);
|
true);
|
||||||
callback.setStream(stream);
|
callback.setStream(stream);
|
||||||
ExperimentalBidirectionalStream.Builder builder =
|
BidirectionalStream.Builder builder =
|
||||||
mock(ExperimentalBidirectionalStream.Builder.class);
|
mock(BidirectionalStream.Builder.class);
|
||||||
when(factory.newBidirectionalStreamBuilder(
|
when(factory.newBidirectionalStreamBuilder(
|
||||||
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
||||||
.thenReturn(builder);
|
.thenReturn(builder);
|
||||||
|
@ -810,8 +809,8 @@ public final class CronetClientStreamTest {
|
||||||
false,
|
false,
|
||||||
false);
|
false);
|
||||||
callback.setStream(stream);
|
callback.setStream(stream);
|
||||||
ExperimentalBidirectionalStream.Builder builder =
|
BidirectionalStream.Builder builder =
|
||||||
mock(ExperimentalBidirectionalStream.Builder.class);
|
mock(BidirectionalStream.Builder.class);
|
||||||
when(factory.newBidirectionalStreamBuilder(
|
when(factory.newBidirectionalStreamBuilder(
|
||||||
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
any(String.class), any(BidirectionalStream.Callback.class), any(Executor.class)))
|
||||||
.thenReturn(builder);
|
.thenReturn(builder);
|
||||||
|
|
|
@ -23,10 +23,8 @@ auto-value-annotations = "com.google.auto.value:auto-value-annotations:1.10.4"
|
||||||
checkstyle = "com.puppycrawl.tools:checkstyle:10.12.5"
|
checkstyle = "com.puppycrawl.tools:checkstyle:10.12.5"
|
||||||
commons-math3 = "org.apache.commons:commons-math3:3.6.1"
|
commons-math3 = "org.apache.commons:commons-math3:3.6.1"
|
||||||
conscrypt = "org.conscrypt:conscrypt-openjdk-uber:2.5.2"
|
conscrypt = "org.conscrypt:conscrypt-openjdk-uber:2.5.2"
|
||||||
# Update notes / 2023-07-19 sergiitk:
|
cronet-api = "org.chromium.net:cronet-api:119.6045.31"
|
||||||
# Cronet (API and Embedded) upgrade is blocked by https://github.com/grpc/grpc-java/issues/10396.
|
cronet-embedded = "org.chromium.net:cronet-embedded:119.6045.31"
|
||||||
cronet-api = "org.chromium.net:cronet-api:108.5359.79"
|
|
||||||
cronet-embedded = "org.chromium.net:cronet-embedded:108.5359.79"
|
|
||||||
errorprone-annotations = "com.google.errorprone:error_prone_annotations:2.23.0"
|
errorprone-annotations = "com.google.errorprone:error_prone_annotations:2.23.0"
|
||||||
errorprone-core = "com.google.errorprone:error_prone_core:2.23.0"
|
errorprone-core = "com.google.errorprone:error_prone_core:2.23.0"
|
||||||
google-api-protos = "com.google.api.grpc:proto-google-common-protos:2.29.0"
|
google-api-protos = "com.google.api.grpc:proto-google-common-protos:2.29.0"
|
||||||
|
|
Loading…
Reference in New Issue