Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Exclude attributes from
Endpoint.toString()
(#6061)
Motivation: We observed `OutOfMemoryError` in internal CI tests when a new `Endpoint` is created. ``` com.linecorp.armeria.xds.client.endpoint.EndpointsPool$$Lambda$754/1708334230@3a58f44e java.lang.OutOfMemoryError: Java heap space at java.util.Arrays.copyOfRange(Arrays.java:3664) at java.lang.String.<init>(String.java:207) at java.lang.StringBuilder.toString(StringBuilder.java:412) at com.google.protobuf.TextFormat$Printer.printToString(TextFormat.java:593) at com.google.protobuf.AbstractMessage.toString(AbstractMessage.java:87) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:136) at com.linecorp.armeria.internal.shaded.guava.collect.AbstractMapEntry.toString(AbstractMapEntry.java:70) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:136) at com.linecorp.armeria.internal.shaded.guava.collect.Iterators.toString(Iterators.java:294) at com.linecorp.armeria.common.ImmutableAttributes.toString(ImmutableAttributes.java:183) at java.lang.String.valueOf(String.java:2994) at java.lang.StringBuilder.append(StringBuilder.java:136) at com.linecorp.armeria.client.Endpoint.generateToString(Endpoint.java:304) at com.linecorp.armeria.client.Endpoint.<init>(Endpoint.java:268) at com.linecorp.armeria.client.Endpoint.replaceAttrs(Endpoint.java:747) at com.linecorp.armeria.client.Endpoint.withAttr(Endpoint.java:707) at com.linecorp.armeria.xds.client.endpoint.EndpointsPool.withTimestamp(EndpointsPool.java:103) at com.linecorp.armeria.xds.client.endpoint.EndpointsPool.cacheAttributesAndDelegate(EndpointsPool.java:71) at com.linecorp.armeria.xds.client.endpoint.EndpointsPool.lambda$updateClusterSnapshot$1(EndpointsPool.java:62) at com.linecorp.armeria.xds.client.endpoint.EndpointsPool$$Lambda$754/1708334230.run(Unknown Source) ``` When an `Endpoint` is initicated, it pre-generates a string representation for caching and reuse. In our tests, it contained many attributes related to xDS for service discovery. It might be a good idea to remove attributes whose size is hard to predict from `toString()` and prevent unintended OOM. In addition, the result size of `toString()` gets small, so I doubt that the pre-generated cache is useful for performance. Modifications: - Remove attributes from `toString()`. - Lazily build the string representation when `toString()` is called and don't cache the result. Result: `Endpoint` no longer includes attributes in `.toString()`.
- Loading branch information