Commit Graph

27 Commits

Author SHA1 Message Date
Vladimir Gordiychuk ca7685ef50 protobuf-lite: ProtoLiteUtils fix infinite loop
InputStream by contract can return zero if requested length equal to zero.

```
If len is zero, then no bytes are read and 0 is returned;
otherwise, there is an attempt to read at least one byte.
If no byte is available because the stream is at end of file,
the value -1 is returned; otherwise, at least one byte is read
and stored into b.
```

Close #3323
2017-08-15 16:04:24 -07:00
Paul Gross 72b9ee22b8 all: Fix mismatch in naming Bazel Maven jars
This commit aligns the naming of the Bazel Maven jars with the names
used by Bazel's migration-tooling project:

https://github.com/bazelbuild/migration-tooling

Unfortunately, we can't fix @com_google_protobuf_java because it's
required by Bazel itself.

Fixes #3328
2017-08-11 16:39:43 -07:00
Eric Anderson cbad906c0e Update to Error Prone 2.0.21 2017-07-07 10:30:14 -07:00
ZHANG Dapeng c2791496ca fix misuse of bazel repo @com_google_protobuf
resolves #3175
2017-07-05 16:15:33 -07:00
ZHANG Dapeng b23f35d3e5 protobuf-lite: restrict visibility of protobuf_lite 2017-07-05 14:22:32 -07:00
Eric Anderson c436561fc5 all: Use fixed version number for java 6/7 signatures
This is important for stable builds, as if the signature changes the old source
may no longer validate.
2017-06-30 15:25:34 -07:00
Simon Horlick 6d9e149dcb build: Add Bazel java_grpc_library rule
Bazel third party dependencies are specified in repositories.bzl which
gives the consumer the ability to opt-out of any dependencies they use
directly in their own project.

Fixes #2756
2017-06-22 13:06:49 -07:00
Carl Mastrangelo 166108a943 all: fix licence whitespace 2017-06-01 14:28:37 -07:00
Carl Mastrangelo 3bfd630bff all: update to Apache 2 licence
Also, update the authors.
2017-05-31 13:29:01 -07:00
Carl Mastrangelo 0fe2c5cca6 all: bump to proto 3.3.1 2017-05-23 17:04:51 -07:00
kenji yoshida 17b74c1452 protobuf-lite: fix typo. s/Marhsaller/Marshaller 2017-05-14 14:19:47 -07:00
ZHANG Dapeng bb978bac31 doc: initiate some package javadoc
Initated package javadoc for 
* `io.grpc.stub`, 
* `io.grpc.auth`, 
* `io.grpc.util`, 
* `io.grpc.protobuf`, 
* `io.grpc.protobuf.lite`,
* `io.grpc.protobuf.nano`
2017-05-10 11:29:07 -07:00
Carl Mastrangelo ee12cc2a34 all: update to latest version of errorprone 2017-03-22 22:09:04 -07:00
Eric Anderson 675080b208 all: Enable ErrorProne during compilation
ErrorProne provides static analysis for common issues, including
misused variables GuardedBy locks.

This increases build time by 60% for parallel builds and 30% for
non-parallel, so I've provided a way to disable the check. It is on by
default though and will be run in our CI environments.
2017-02-24 14:53:23 -08:00
Eric Anderson 42aa64c647 all: swap to newer animalsniffer plugin
The new plugin uses a newer version of animalsniffer, allows overriding
the animalsniffer version used, and has up-to-date handling. The
up-to-date handling cuts fully incremental parallel build times in half,
from 5.5s to 2.7s.

The previous plugin was supposed to be verifying tests. However, either
it wasn't verifying them or its verification was broken.
2017-02-07 12:49:01 -08:00
Carl Mastrangelo 89bc2cd3b2 all: update to latest import ordering 2017-01-26 13:43:06 -08:00
Eric Anderson b1d72e5c3e all: Bump protobuf to 3.0.2, to fix protoc in CI
protoc no longer builds in 3.0.0 because auto-download of the gmock zip
now fails. 3.0.2 has a fix to autogen:
bba446bbf2

All that was strictly necessary was to update .travis.yml and
buildscripts/, but it helps our sanity to keep the rest of the protobuf
versions in sync. Lite is left on its existing version, because it did
not see a bump of neither the java library nor the protoc plugin.
2016-09-29 10:25:31 -07:00
Carl Mastrangelo 017f5f8808 protobuf: make buffer cache even weaker 2016-09-21 10:58:59 -07:00
Carl Mastrangelo ef4e0f4522 protobuf: cache temp buffers
Before:
TransportBenchmark.unaryCall1024                                       true        NETTY  sample  4564   2188854.745 ±  71456.423   ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.00                   true        NETTY  sample         1875968.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.50                   true        NETTY  sample         2105344.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.90                   true        NETTY  sample         2396160.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.95                   true        NETTY  sample         2535424.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.99                   true        NETTY  sample         3011993.600                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.999                  true        NETTY  sample         7471595.520                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.9999                 true        NETTY  sample        99090432.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p1.00                   true        NETTY  sample        99090432.000                ns/op
TransportBenchmark.unaryCall1024:·gc.alloc.rate                        true        NETTY  sample    10      2787.784 ±    169.945  MB/sec
TransportBenchmark.unaryCall1024:·gc.alloc.rate.norm                   true        NETTY  sample    10   6415272.837 ±    262.046    B/op
TransportBenchmark.unaryCall1024:·gc.churn.PS_Eden_Space               true        NETTY  sample    10      2815.863 ±    429.465  MB/sec
TransportBenchmark.unaryCall1024:·gc.churn.PS_Eden_Space.norm          true        NETTY  sample    10   6483440.294 ± 947355.959    B/op
TransportBenchmark.unaryCall1024:·gc.churn.PS_Survivor_Space           true        NETTY  sample    10         2.143 ±      1.623  MB/sec
TransportBenchmark.unaryCall1024:·gc.churn.PS_Survivor_Space.norm      true        NETTY  sample    10      4873.798 ±   3679.598    B/op
TransportBenchmark.unaryCall1024:·gc.count                             true        NETTY  sample    10        42.000               counts
TransportBenchmark.unaryCall1024:·gc.time                              true        NETTY  sample    10       155.000                   ms

After:
Benchmark                                                          (direct)  (transport)    Mode   Cnt         Score        Error   Units
TransportBenchmark.unaryCall1024                                       true        NETTY  sample  5037   1982881.569 ±  16738.841   ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.00                   true        NETTY  sample         1683456.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.50                   true        NETTY  sample         1918976.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.90                   true        NETTY  sample         2232320.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.95                   true        NETTY  sample         2330624.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.99                   true        NETTY  sample         2729574.400                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.999                  true        NETTY  sample         6127304.704                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p0.9999                 true        NETTY  sample        15515648.000                ns/op
TransportBenchmark.unaryCall1024:unaryCall1024·p1.00                   true        NETTY  sample        15515648.000                ns/op
TransportBenchmark.unaryCall1024:·gc.alloc.rate                        true        NETTY  sample    10      2071.435 ±    141.669  MB/sec
TransportBenchmark.unaryCall1024:·gc.alloc.rate.norm                   true        NETTY  sample    10   4318096.849 ±    269.655    B/op
TransportBenchmark.unaryCall1024:·gc.churn.PS_Eden_Space               true        NETTY  sample    10      2076.282 ±    323.504  MB/sec
TransportBenchmark.unaryCall1024:·gc.churn.PS_Eden_Space.norm          true        NETTY  sample    10   4335884.918 ± 729189.378    B/op
TransportBenchmark.unaryCall1024:·gc.churn.PS_Survivor_Space           true        NETTY  sample    10         1.567 ±      1.238  MB/sec
TransportBenchmark.unaryCall1024:·gc.churn.PS_Survivor_Space.norm      true        NETTY  sample    10      3274.883 ±   2640.345    B/op
TransportBenchmark.unaryCall1024:·gc.count                             true        NETTY  sample    10        31.000               counts
TransportBenchmark.unaryCall1024:·gc.time                              true        NETTY  sample    10        51.000                   ms
2016-09-21 09:24:10 -07:00
Carl Mastrangelo 24de2431c7 protobuf: fast path zero sized messages 2016-09-08 18:17:07 -07:00
Eric Anderson bdf8b01129 core,protobuf: Add simple argument introspection for methods
The cast required in protobuf makes me question how much I like
ReflectableMarshaller, but it seems to be pretty sound and the cast is
more an artifact of generics than the API.

Nano and Thrift were purposefully not updated, since getting just the
class requires making a new message instance. That seems a bit lame. It
probably is no burden to create an instance to get the class, and it may
not be too hard to improve the factory to provide class information, but
didn't want to bother at this point. Especially since nano users are
unlikely to need the introspection functionality.
2016-09-08 11:05:16 -07:00
Carl Mastrangelo c47d948a47 protobuf: copy input data before decoding
CodedInputStream is risk averse in ways that hurt performance when
parsing large messages.  gRPC knows how large the input size is as it
is being read from the wire, and only tries to parse it once the entire
message has been read in.  The message is represented as chunks of
memory strung together in a CompositeReadableBuffer, and then wrapped
in a custom BufferInputStream.

When passed to Protobuf, CodedInputStream attempts to read data out
of this InputStream into CIS's internal 4K buffer.  For messages that
are much larger, CIS copies from the input in chunks of 4K and saved in
an ArrayList.  Once the entire message size is read in, it is re-copied
into one large byte array and passed back up.  This only happens for
ByteStrings and ByteBuffers that are read out of CIS.  (See
CIS.readRawBytesSlowPath for implementation).

gRPC doesn't need this overhead, since we already have the entire
message in memory, albeit in chunks.  This change copies the composite
buffer into a single heap byte buffer, and passes this (via
UnsafeByteOperations) into CodedInputStream.  This pays one copy to
build the heap buffer, but avoids the two copes in CIS.  This also
ensures that the buffer is considered "immutable" from CIS's point of
view.

Because CIS does not have ByteString aliasing turned on, this large
buffer will not accidentally be kept in memory even if only tiny fields
from the proto are still referenced.  Instead, reading ByteStrings out
of CIS will always copy.  (This copy, and the problems it avoids, can
be turned off by calling CIS.enableAliasing.)

Benchmark results will come shortly, but initial testing shows
significant speedup in throughput tests.  Profiling has shown that
copying memory was a large time consumer for messages of size 1MB.
2016-08-17 15:45:21 -07:00
Eric Anderson a8700a7837 Begin consuming protobuf-lite artifact
Protobuf-lite since beta-4 is now more of a fork than a subset of
protobuf-java, which may cause us problems later since lite API is not
stable. Also, lite-generated code may now depend on APIs only in
protobuf-lite, so our users must depend on the protobuf-lite runtime.
Having all our users explicitly override the dependency is bothersome to
them and can easily only expose problems only after we do a release.

So now we are doing the dependency overriding; most users should "just
work" and pick up the correct protobuf artifact. I've confirmed the
exclusion is listed in the grpc-protobuf pom and "gradle dependencies"
and "mvn dependency:tree" do not include protobuf-lite for the examples.
Vanilla protobuf users are most likely to experience any breakage, which
should detect problems more quickly since we use protobuf-java more
frequently than protobuf-lite during development.

protobuf-lite does not include pre-generated code for the well-known
protos, so users will need to generate them themselves for the moment
(google/protobuf#1889).

Note that today changing deps does not noticeably reduce the method code
for our users, since ProGuard already is stripping most classes. The
difference in output is only a reduction of 3 classes and 6 methods for
the android example.
2016-08-01 15:51:11 -07:00
Eric Anderson 65dd5db5e3 protolite: Use 'unused' variable to avoid CheckReturnValue
Internally toByteArray is annotated with CheckReturnValue, which can
cause a failure during compilation if the value is ignored.
2016-05-20 09:46:46 -07:00
Carl Mastrangelo bc661e7fbb all: Finish adding tracking issues for ExperimentalApi 2016-05-03 16:15:57 -07:00
Carl Mastrangelo 702518af22 Allow use of a global ExtensionRegistry 2016-04-15 17:36:45 -07:00
Eric Anderson 99a6d8de27 Add native support for Protobuf Lite
Lite already worked by using the protobuf project, but would bring in
extra dependencies that are not intended to work with lite. Although
protobuf is not yet providing a lite package on Maven Central, we will
be able to swap to it once it is available.

There isn't any new original code in the Java portion, except for a new
overload in ProtoUtils that accepts Message instead of MessageLite.
Depending on Message in ProtoUtils allows us to support extra features
out-of-the-box without any changes to the generated code. For example,
JSON encoding could be supported in this way if Marshaller is enhanced.

However, now codegen must be aware of Lite in order to choose with Util
class to use. That is new code.
2016-03-22 15:40:51 -07:00