Commit Graph

3445 Commits

Author SHA1 Message Date
Jihun Cho d50c8d4ec1
stub: improve error message for Client/ServerCalls (#5656) 2019-05-01 17:13:07 -07:00
Eric Anderson 97cb0554e4 travis.yml: Choose dist trusty to fix Java 8
The upgrade to Xenial broke Java 8, as Trusty contained Java 8 whereas
Xenial uses Java 11. So this "flipped" which version was necessary to be
downloaded from Java 11 to Java 8. And Java 8 is not supported by
install-jdk.sh.

Workaround as seen at:
https://travis-ci.community/t/oracle-jdk-11-and-10-are-pre-installed-not-the-openjdk-builds/785/16

I hope this is temporary.
2019-05-01 16:22:36 -07:00
Carl Mastrangelo e8be55e56f
alts: moved from containsAllOf to containsAtLeast 2019-05-01 13:50:50 -07:00
Jihun Cho f4fb7b40c5
netty: set NettyServer default socket options for all Channels (#5651) 2019-05-01 11:29:03 -07:00
Eric Anderson ab2e048f13 Lint fixes for unused and Truth and Queue 2019-04-30 22:44:00 -07:00
Kun Zhang 973885457f
core: change ClientStreamTracer.StreamInfo to a final class with a builder (#5648)
As we are now endorsing the wrapping of ClientStreamTracers by
providing ForwardingClientStreamTracer, there is a need for altering
StreamInfo, especially CallOptions before it's passed onto the
delegate.  A Builder class and a toBuilder() provides a robust way
to copy the rest of the fields.

This is a breaking change for anybody who creates StreamInfo, which is
unlikely in non-test code, because StreamInfo was added as late as
1.20.0.
2019-04-30 09:10:56 -07:00
Chengyuan Zhang 44840fe813
api: fix bugs of missing to copy customOptions when converting to a new builder, also trash hashCode/equals (#5647)
* api: fix bugs of missing out customOptions in CreateSubchannelArgs toBuider, hashCode, equals

* trash equals/hashCode for CreateSubchannelArgs as they are problematic
2019-04-29 18:40:11 -07:00
Chengyuan Zhang 405d8c3865
api: patch CreateSubchannelArgs toString() with customOptions (#5646) 2019-04-29 14:54:59 -07:00
Jihun Cho 6a32c508b8
netty: fix TCP_USER_TIMEOUT to use keepAliveTimeout instead of keepAliveTime (#5645) 2019-04-26 16:02:58 -07:00
Chengyuan Zhang dc218b6d4d
api: augment CreateSubchannelArgs with custom options (#5640)
* api: augment CreateSubchannelArgs with custom options

* added unit tests

* added ExperimentalApi anntation with tracking issue
2019-04-26 13:59:37 -07:00
Kun Zhang d530641097
core: annotate experimental API's inner classes. (#5643)
Annotations on outer class don't show on the javadoc of inner classes.
2019-04-26 11:28:48 -07:00
Eric Anderson 0604e14154 Revert "stub: Wait for onClose when blocking stub is interrupted"
This reverts commit 6d44f46f18.

This is causing a test to hang internally. I am currently expecting that
the shutdown logic of the test is broken, but it will take time to
diagnose. Thus, revert this for the moment.
2019-04-26 08:59:45 -07:00
Vladimir Gordiychuk f631b3d249 stub: release server-streaming reference on request after method call 2019-04-26 08:58:42 -07:00
Carl Mastrangelo 53a3f12666
api: expose if waitForReady has been set on CallOptions 2019-04-25 10:56:40 -07:00
Carl Mastrangelo ce6358e57f
core: add getService to MethodDescriptor 2019-04-24 17:45:41 -07:00
Carl Mastrangelo 0c304b1863
interop-testing: remove Truth method named() 2019-04-24 16:05:08 -07:00
Carl Mastrangelo 4b2e60a06b
core: remove scopeid overloads of perfmark 2019-04-24 15:07:43 -07:00
Chengyuan Zhang ea70de601c
xds: xds LRS client implementation with client load stats (#5588)
* Implement LRS client with backoff. No load data is invovled yet, only for load reporting interval updates. Unit test with load report interval update and streamClosed retry.

* use a separate stopwatch to manage actual load report interval

* refactor XdsLrsClientTest

* LRS response will only receive exactly one cluster name for grpc use case

* add more XdsLrsClientTest

* change class modifier

* fixed class comment

* renamed TRAFFICDIRECTOR_HOSTNAME_FIELD

* removed self-implemented Duration util methods, instead use methods in com.google.protobuf.util.Durations

* starting LrsStream's stopwatch inside LrsStream's start method

* fixed bug of using the wrong stopwatch for XdsLrsClient retrying

* removed try-catch around request StreamObserver

* polished code by eliminating unnecessary operations

* log an error instead of crash the thread when receiving LRS response for different cluster name

* created a XdsLoadStatsManager interface, XdsLrsClient implements it

* added XdsLoadStatsStore component in XdsLrsClient

* specify thread safety in XdsLoadStatsManager

* fixed style and convention issues

* added test case for verifying recorded load data by manually crafting load data

* added thread-safety in interface specification

* minor polish with adding debug logs to LRS client
2019-04-24 13:58:51 -07:00
Eric Anderson 2936242160 xds: Add missing RunWith annotation to test 2019-04-23 17:36:46 -07:00
Jihun Cho 67ef8c3466
netty: not using reflection to create NioEventLoopGroup (#5630) 2019-04-23 16:45:19 -07:00
Eric Anderson 187fe9e146 Lint fixes 2019-04-23 14:51:34 -07:00
Eric Anderson 1214781995 java_grpc_library.bzl: Fix docstring to match Bazel style
https://github.com/bazelbuild/buildtools/blob/master/WARNINGS.md#function-docstring-header

Made some additional changes to make the doc more clear.
2019-04-23 14:50:23 -07:00
Carl Mastrangelo 04e07034f3
all: update to truth 0.44 2019-04-23 10:50:49 -07:00
Eric Anderson 745aa0a2f5 java_grpc_library: Use toolchain to enable DexArchiveAspect
This removes the "java_import to work around error with android_binary"
hack; see the b/78647825 references to see the really important parts.
But in general using a toolchain cleans up the code considerably and
allows us to reduce the visibility of our protoc plugin. It also is
useful to enable using aspects in the future to avoid using
make_non_strict() which would improve compilation speed avoid avoid many
unnecessary rebuilds.

This is an export of cl/229763103 and brings external up-to-sync with
internal.
2019-04-23 09:13:20 -07:00
Eric Anderson 6d44f46f18
stub: Wait for onClose when blocking stub is interrupted
Interceptors need to see the onClose to clean up properly.

This also changes an isInterrupted() to interrupted(), since previously
the interrupted flag was still set when InterruptedException was thrown.
This caused an infinite loop with the new code. Previously, all callers
immediately re-set the interrupted flag, so there was no issue.

Fixes #5576
2019-04-22 16:32:06 -07:00
Eric Anderson f4d48fec62
core: Add NameResolverRegistry
NameResolverRegistry takes on all the logic previously in
NameResolverProvider. But it also allows manual registration of
NameResolvers, which is useful when the providers have complex
construction or need objects injected into them.

This also avoids a circular dependency during class loading since
previously loading any Provider searched for all Providers via
ClassLoader since ClassLoader handling was static within the parent
class.

Fixes #5562
2019-04-22 10:22:46 -07:00
Chengyuan Zhang 43e4bce1c3
xds/third_party: import proto from envoy repo, added udpa orca protos (#5614) 2019-04-19 17:31:29 -07:00
Jean de Klerk b363f80764 docs: add note about retrying UNAVAILABLE 2019-04-19 14:29:13 -07:00
Chengyuan Zhang 07f9efe95e
xds: xds load report store implementation (#5587)
* Implemented XdsCliendLoadRecorder which is a ClientStreamTracer.Factory that takes a counter and produces ClientStreamTracer aggregating the counter in callback.

* WIP: add tests for XdsLoadReportStore

* fix query count logic, use an atomic in-progress call counter instead of callsStarted with manual computation at snapshot

* make XdsLoadReportStore threadsafe

* fix class and field modifiers

* make iterating concurrentMap threadsafe

* fixed forgetting to call delegated streamClosed

* add a method to discard ClientLoadCounter for a given locality

* add test to guard interceptPickResult does not destroy original ClientStreamTracer

* added cluster wide dropCounters and method to be called to record dropped requests, tests to be added later.

* add methods for add/discard ClientLoadCounters for localities manually instead of implicitly added by interceptPickResult call. Unit tested.

* make a static noop ClientStreamTracer and ClientStreamTracer.Factory instead of creating one each every time need it

* refractor interceptPickResult

* modified ClientLoadCounter to allow continuing recording loads for localities no longer exposed by balancer while having ongoing loads

* refractor tests

* reworded method comment for calling in syncContext

* fixed issue of no setting dropCount to 0 after load reporting

* polish test

* added test coverage for recording dropped requests (not concurrent)

* added class comment for XdsClientLoadRecorder
2019-04-19 12:08:05 -07:00
Eric Anderson 7c0e14318e api: Stabilize MethodDescriptor.Marshaller
Fixes #1777
2019-04-19 10:32:42 -07:00
Chengyuan Zhang affce636dd
xds/third_party: fixed compatibility issue of regex in BSD for import.sh sed command (#5613)
* fixed issue import.sh sed expr with non-extended regex does not support \| in BSD

* fixed sed -i issue for cross platform
2019-04-18 14:20:57 -07:00
Eric Anderson 7e219c349e alts: Use normal defaults in Alts{Channel,Server}Builder
The ALTS builders are supposed to act like ChannelCreds, as done in
other languages. ChannelCreds don't have the opportunity to change
settings like this. In addition, the options here weren't set in
GoogleDefaultChannelBuilder and ComputeEngineChannelBuilder.
2019-04-18 14:09:10 -07:00
Jihun Cho dc0171839a
netty: add internal API to fall back to NIO transport (#5611) 2019-04-18 13:49:55 -07:00
Jihun Cho 2cdaac2adc
netty: maybe set TCP_USER_TIMEOUT when epoll and keepalive is enabled (#5599) 2019-04-18 10:12:36 -07:00
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