Commit Graph

3411 Commits

Author SHA1 Message Date
Kun Zhang 39e66fa22b
core: delete ManagedChannelBuilder.loadBalancerFactory() and all deprecated factories (#5480)
This has been deprecated since 1.18.0
2019-04-17 14:46:19 -07:00
Carl Mastrangelo a395eec4a3
core: update LB and NR API names
Updates #1770
2019-04-17 12:45:29 -07:00
Eric Anderson 80c3c992a6 core: Move io.grpc to grpc-api
io.grpc has fewer dependencies than io.grpc.internal. Moving it to a
separate artifact lets users use the API without bringing in the deps.
If the library has an optional dependency on grpc, that can be quite
convenient.

We now version-pin both grpc-api and grpc-core, since both contain
internal APIs.

I had to change a few tests in grpc-api to avoid FakeClock. Moving
FakeClock to grpc-api was difficult because it uses
io.grpc.internal.TimeProvider, which can't be moved since it is a
production class. Having grpc-api's tests depend on grpc-core's test
classes would be weird and cause a circular dependincy. Having
grpc-api's tests depend on grpc-core is likely possible, but weird and
fairly unnecessary at this point. So instead I rewrote the tests to
avoid FakeClock.

Fixes #1447
2019-04-16 21:45:40 -07:00
Carl Mastrangelo f3731eabb3
netty: deflake ping flow control logic 2019-04-16 13:17:59 -07:00
Carl Mastrangelo 8941a69480
context: avoid synthetic methods on Context 2019-04-16 09:02:05 -07:00
Jihun Cho a48ebb1616
netty: change default transport to Epoll if available, otherwise using Nio (#5581)
Motivation:
To support TCP_USER_TIMEOUT(proposal). Nio doesn't support TCP_USER_TIMEOUT while Epoll and KQueue supports TCP_USER_TIME. Since most users/servers are using linux based system, adding Epoll is necessary. KQueue maybe supported later, but not in this PR.

To make it backward compatible for cases where channelType and eventLoop is mixed in with default and user provided object(s), we will fallback to Nio (NioSocketChannel, NioEventLoop). This ensures not breaking existing code (same as existing behavior). Users not specified both channelType and EventLoops will be affect by this Epoll change if netty-epoll is available.
In later version (possibly 1.22.0), the backward compatible behavior will be removed and it will start to throw exception since this is error prone.
2019-04-15 17:53:14 -07:00
Jihun Cho 71f32bb700
core: fix typo in comment (#5597) 2019-04-15 17:29:45 -07:00
Eric Anderson 5b2187d6bd context: Remove unnecessary deps from Bazel target 2019-04-12 19:18:44 -07:00
Chengyuan Zhang 636161712d
core/util: create a ForwardingClientStreamTracer class for delegation use (#5589)
* core/util: create a ForwardingClientStreamTracer class for delegation use

* add ExperimentalApi annotation
2019-04-12 18:06:17 -07:00
Carl Mastrangelo 21141cc837
netty: make default number of event loops defer to netty 2019-04-12 12:42:18 -07:00
Kun Zhang 62b03fd7e6
core: pass Subchannel state updates to SubchannelStateListener rather than LoadBalancer (#5503)
Resolves #5497

## Motivation

In hierarchical `LoadBalancer`s (e.g., `XdsLoadBalancer`) or wrapped `LoadBalancer`s (e.g., `HealthCheckingLoadBalancerFactory`, the top-level `LoadBalancer` receives `Subchannel` state updates from the Channel impl, and they almost always pass it down to its children `LoadBalancer`s.

Sometimes the children `LoadBalancer`s are not directly created by the parent, thus requires whatever API in the middle to also pass Subchannel state updates, complicating that API. For example, the proposed [`RequestDirector`](https://github.com/grpc/grpc-java/issues/5496#issuecomment-476008051) includes `handleSubchannelState()` solely to plumb state updates to where they are used. We also see this pattern in `HealthCheckingLoadBalancerFactory`, `GrpclbState` and `SubchannelPool`.

Another minor issue is, the parent `LoadBalancer` would need to intercept the `Helper` passed to its children to map Subchannels to the children `LoadBalancer`s, so that it pass updates about relevant Subchannels to the children.  Otherwise, a child `LoadBalancer` may be surprised by seeing Subchannel not created by it, and it's not efficient to broadcast Subchannel updates to all children.

## API Proposal
We will pass a `SubchannelStateListener` when creating a `Subchannel` to accept state updates, those updates could be directly passed to where the `Subchannel` is created, skipping the explicit chaining in the middle.

Also define a first-class object `CreateSubchannelArgs` to pass arguments for the reasons below:
1. It may avoid breakages when we add new arguments to `createSubchannel()`.  For example, a `LoadBalancer` may wrap `Helper` and intercept `createSubchannel()` in a hierarchical case. It may not be interested in all arguments. Passing a single `CreateSubchannelArgs` will not break the parent `LoadBalancer` if we add new fields later.
2. This also reduces the eventual size of Helper interface, as the convenience `createSubchannel()` that accepts one EAG instead of a List is no longer necessary, since that convenience is moved into `CreateSubchannelArgs`.

```java
interface SubchannelStateListener {
  void onSubchannelState(Subchannel subchannel, ConnectivityStateInfo newState);
}

abstract class LoadBalancer.Helper {
  abstract Subchannel createSubchannel(CreateSubchannelArgs args);
}

final class CreateSubchannelArgs {
  final List<EquivalentAddressGroup> getAddresses();
  final Attributes getAttributes();
  final SubchannelStateListener getStateListener();
  final class Builder () {
    ...
  }
}
```

The new `createSubchannel()` must be called from synchronization context, as a step towards #5015.

## How the new API helps

Most hierarchical `LoadBalancer`s would just let the listener from the child `LoadBalancer`s directly pass through to gRPC core, which is less boilerplate than before.

Without any effort by the parent, each child will only see updates for the Subchannels it has created, which is clearer and more efficient.

If a parent `LoadBalancer` does want to look at or alter the Subchannel state updates for its delegate (like in `HealthCheckingLoadBalancerFactory`), it can still do so in the wrapping `LoadBalancer.Helper` passed to the delegate by intercepting the `SubchannelStateListener`.

## Migration implications
Existing `LoadBalancer` implementations will continue to work, while they will see deprecation warnings when compiled:
 - The old `LoadBalancer.Helper#createSubchannel` variants are now deprecated, but will work until they are deleted. They create a `SubchannelStateListener` that delegates to `LoadBalancer#handleSubchannelState`.
 - `LoadBalancer#handleSubchannelState` is now deprecated, and will throw if called and the implementation doesn't override it. It will be deleted in a future release.

The migration for most `LoadBalancer` implementation would be moving the logic from `LoadBalancer#handleSubchannelState` into a `SubchannelStateListener`.
2019-04-12 10:58:09 -07:00
Kun Zhang 0244418d2d
core: Move ConfigOrError up level up. (#5578)
This class is used in other places than just NameResolver.Helper.  It
should not be an inner class of Helper.

Strictly speaking this is an API-breaking change.  However, this is
part of the service config error handling API that hasn't been done
yet.  Nobody has a legitimate reason to use it.
2019-04-10 16:28:23 -07:00
Kun Zhang ba335f5e68
interop-test: add test case for "pick_first" picking behavior (#5554)
New fields are added to the test protos according to grpc/grpc-proto#51

This test needs to be run in an environment where "pick_first" or "grpclb" with child policy "pick_first" is configured.
2019-04-10 14:08:54 -07:00
Kun Zhang 79c286efe9
Update README to reference 1.20.0 (#5577) 2019-04-10 12:49:02 -07:00
Carl Mastrangelo 75bc066cab
context: try out static final storage 2019-04-09 20:33:40 -07:00
Eric Anderson bcb4515832 services: Remove dependency on re2j
re2j is a fairly unnecessary dependency. Our usage of Pattern is quite limited
and isn't all that hard to do manually. Our usage would be safe to use normal
java.util.regex, but it's sort of annoying to keep re-explaining to others who
are (rightly) concerned with java.util.regex's poor pathological behavior.
2019-04-09 15:19:46 -07:00
Jihun Cho 4887d99c2f
okhttp: wait until connection preface / settings during transport start to avoid deadlock (#5567) 2019-04-09 13:19:28 -07:00
Chengyuan Zhang 74527dcee9
okhttp: fix OkhttpFrameLogger mocking tests failure (#5565)
* use LogRecord to verify OkHttpFrameLogger in OkHttpClientTransportTest

* use LogRecord to test OkHttpFrameLogger in ExceptionHandlingFrameWriterTest
2019-04-08 18:06:25 -07:00
Kun Zhang 880cfd09cd
core: make the NameResolver.start() change backward compatible for forwarding callers. (#5561)
This will give time for pre-existing external callers (e.g.,
forwarding NameResolvers) to migrate to the new start().
2019-04-08 16:09:31 -07:00
Kun Zhang a157052117
core: make the LoadBalancer.handleResolvedAddressGroups() change backward compatible. (#5563)
This will give time for pre-existing external callers (e.g.,
forwarding LoadBalancers) to migrate to the new handleResolvedAddresses().
2019-04-08 15:34:52 -07:00
Kun Zhang 1e901d3b8c
core: make newNameResolver() change backward compatible for callers. (#5560)
We assumed that we were the only caller.  Turns out there are
forwarding NameResolver too.  Implementing the old override will give
them time to migrate to the new API.

Resolves #5556
2019-04-08 12:02:54 -07:00
Carl Mastrangelo 483697f754
core: change service config to ConfigOrError
Both the config and the error need to be passed to the managed channel so it can decide to keep or reject the config. Passing only the parsed object means the managed channel cannot implement the error handling gRFC.
2019-04-08 11:06:13 -07:00
ZHANG Dapeng c8a0af572c
xds: add InterLocalityPicker 2019-04-05 18:52:25 -07:00
Chengyuan Zhang 9a2ef07b71
core: use FakeClock.ScheduledExecutorService for KeepAliveManagerTest (#5501)
* core: use FakeClock.ScheduledExecutorService for KeepAliveManagerTest

* add annotation for accessing stopwatch in synchronized section only
2019-04-05 12:49:04 -07:00
Eric Anderson 52dff83717 Update Protobuf to 3.7.1
This mainly avoids protoc from 3.7.0 which has a dependency on libatomic. Most
of our systems have libatomic, so it mostly works, but the interop docker
container does not, so building fails. Version 3.7.1 was rebuilt to avoid
needing the libatomic shared library.

This has the added benefit that Bazel is now on the same version as Gradle, as
3.7.1 included fixes for Bazel.
2019-04-05 10:55:14 -07:00
ZHANG Dapeng 3f3532ae7e
examples: update copyright year to 2019 2019-04-05 10:53:06 -07:00
Jihun Cho 3b8088833c
netty, alts: expose ProtectedPromise, and writeBufferedAndRemove methods (#5542) 2019-04-04 19:01:54 -07:00
Solomon Duskis 09d9c4a919 auth: GoogleAuthLibraryCallCredentials uses Credentials Builder 2019-04-04 17:41:15 -07:00
Chengyuan Zhang f25fe1fe6a
examples/android: add example for grpc running under StrictMode (#5527)
* added android example running under strictmode to detect grpc clear text network transport

* renamed andriod strictmode example

* use OkHttpChannelBuilder's api to feed with user's own transport executor

* bump gradle and proto-plugin version to match that in master

* add README with a simple demo image

* Update README to use relative link to helloworld
2019-04-04 15:35:45 -07:00
Chengyuan Zhang 0db0c637a1
okhttp: add verbose logging for OkHttp HTTP/2 frame content (#5488)
* okhttp: add verbose logging for OkHttp HTTP/2 frames to include brief frame content.

* fix small details and typo issues

* fix branch condition (it's a typo) for logging the whole buffer

* remove redudent log level checking, always not log entire buffer

* convert ByteString to String to avoid printing 'hex=' prefix

* add test for OkHttpFrameLogger for inbound http frames

* refactor OkHttpFrameLogger's help method

* add Constructor for testing and missing logHeaders

* add http/2 framelogger test for outbound side

* use ArgumentMatchers instead of Matchers

* replace assertTrue with Truth.assertThat

* assert buffer log with exact length match instead of <=
2019-04-04 15:35:19 -07:00
Eric Anderson 73bade418b netty: ALPN negotiation failure should be UNAVAILABLE, not UNKNOWN 2019-04-04 15:33:06 -07:00
Akim239 a67fa8a87b Improved formatting for advantages list.
Some markdown parsers require an empty line before lists to parse them as such.
2019-04-04 15:11:41 -07:00
ZHANG Dapeng 1c276a823b
core: refactor lookUpServiceConfig(boolean) to disableServiceConfigLookUp()
Refactor as discussed in #5189. Will backport to v1.20.0 to reduce a cycle of deprecation process.
2019-04-04 14:01:19 -07:00
Carl Mastrangelo faf6ff9f98
core: add client and server call perfmark annotations
This code is highly experimental, so we can change it at will later. This PR is to go ahead and try it out.

Perfmark task calls are added to the client and server calls public APIs, recording when the calls begin and end. They use separate scope IDs (roughly these are Thread IDs) for the listener and the call due to no synchronization between them. However, they both use the same PerfTags, which allows them to be associated.

In the future, we can plumb the tag down into the stream to include deeper information about whats going on in a call.
2019-04-03 18:16:22 -07:00
ZHANG Dapeng a17f8ab62c
buildscripts: add android-interop-test build (without runing test) in kokoro android 2019-04-03 14:22:39 -07:00
ZHANG Dapeng 40526086eb
interopt-testing: move mockito from compile to testCompile (#5541)
Resolves #5540
2019-04-03 14:09:03 -07:00
ZHANG Dapeng 63d512ecb4
android-interop-test: add mockito dependency
android-interop-test now needs explicit mockito dependency because of #5535
2019-04-03 10:07:18 -07:00
ZHANG Dapeng 3325881eae
testing: move mockito from compile to testCompile 2019-04-03 08:55:31 -07:00
ZHANG Dapeng 755a22790b
android/android-interop-testing/examples: upgrade android plugin
This resolves #5523

While bumping `com.android.tools.build:gradle:3.1.2` to `3.3.0`, some other plugins/artifacts/maven repo/buildscripts have to be updated:

- gradle (wrapper) need to upgrade to 4.10.x
- protobuf gradle plugin need to bump a version compatible with gradle version.
- need add `google()` and `jcenter()` repos for android (otherwise `com.android.tools.build:aapt2:3.3.0x` and `trove4j` will not be found resp.)
- need to accept license for Android "build-tools;28.0.3" in kokoro env.
2019-04-02 14:52:27 -07:00
ZHANG Dapeng 30038fd0be
xds: remove unused code in test 2019-04-02 13:52:55 -07:00
Carl Mastrangelo d8b5d84ce7
perfmark: add a perf annotation package 2019-03-29 11:29:36 -07:00
Nick Hill 5f88bc42bf stub: optimize ThreadlessExecutor used for blocking calls
The `ThreadlessExecutor` currently used for blocking calls uses `LinkedBlockingQueue` which is relatively heavy both in terms of allocations and synchronization overhead (e.g. when compared to `ConcurrentLinkedQueue`). It accounts for ~10% of allocations and ~5% of allocated bytes per-call in the `TransportBenchmark` when using in-process transport with [stats and tracing disabled](https://github.com/grpc/grpc-java/issues/5510).

Changing to use a `ConcurrentLinkedQueue` results in a ~5% speedup of that benchmark.

Before:
```
Benchmark                         (direct)  (transport)  Mode  Cnt      Score     Error  Units
TransportBenchmark.unaryCall1024      true    INPROCESS  avgt   60   1877.339 ±  46.309  ns/op
TransportBenchmark.unaryCall1024     false    INPROCESS  avgt   60  12680.525 ± 208.684  ns/op
```

After:
```
Benchmark                         (direct)  (transport)  Mode  Cnt      Score     Error  Units
TransportBenchmark.unaryCall1024      true    INPROCESS  avgt   60   1779.188 ±  36.769  ns/op
TransportBenchmark.unaryCall1024     false    INPROCESS  avgt   60  12532.470 ± 238.271  ns/op
```
2019-03-29 10:45:23 -07:00
Carl Mastrangelo ecccdbb3b0
core: update since javadoc, and add toBuilder for NameResolver results 2019-03-29 10:43:08 -07:00
Carl Mastrangelo 17d67f17fa
all: add LoadBalancer overload for Resolution results 2019-03-29 09:31:24 -07:00
Kun Zhang 026e4c53bd
Start 1.21.0 development cycle (#5515) 2019-03-28 13:27:45 -07:00
Carl Mastrangelo 5ef8377efa
core: remove Type from ConfigOrError 2019-03-28 09:40:50 -07:00
Nick Hill a8c73811dd benchmarks: Ensure ELGs used by TransportBenchmark.NETTY_LOCAL are shutdown
This was an omission from #5492, sorry! Without it there are some ugly warnings in the log.
2019-03-26 16:29:07 -07:00
Chengyuan Zhang 759e7a7fec
examples/kotlin: fix typo in HelloWorld example (#5505) 2019-03-26 14:37:36 -07:00
Nick Hill 8e41f6e43b core: Avoid locks in SynchronizationContext (#5504)
Similar to what's done in SerializingExecutor, it's easy to make SynchronizationContext non-blocking.
2019-03-26 13:54:01 -07:00
Carl Mastrangelo 53f4ad21b4
core: fix DNS JNDI not working if there is an unavailability cause 2019-03-25 16:10:13 -07:00