apple-oss-lab / servicetalk

apple/servicetalk

Reactive networking library on Netty. Architecture and build analysis by arcade-agent. Upstream: apple/servicetalk · Fork: arcade-agent/servicetalk

Scope: static analysis of the default branch plus GitHub metadata for open PRs and the 30 most recently merged PRs. Java sources only (9961 entities, tests excluded); Kotlin files are not parsed. This is an independent, unofficial analysis; it does not evaluate people.

Architecture baseline

9961entities
63021dependency edges
26components (package-based)
21smells
0.4313RCI (intra-edge ratio)
0.2201BasicMQ

Components

ComponentEntities
Http3038
Concurrent2133
Buffer896
Transport807
Grpc482
Loadbalancer378
Examples304
Utils286
Client243
Opentracing211
Encoding163
Context151
Dns150
Opentelemetry129
Data112
Logging96
Traffic81
Serializer69
Capacity54
Tcp53
Log4J234
Serialization33
Benchmark17
Circuit15
Router15
Oio11

Architectural smells (21)

TypeSeverityDescription
Dependency CyclehighCircular dependency among 23 components: Buffer <-> Capacity <-> Client <-> Concurrent <-> Context <-> Data <-> Dns <-> Encoding <-> Examples <-> Grpc <-> Http <-> Loadbalancer <-> Log4J2 <-> Logging <-> Opentelemetry <-> Opentracing <-> Router <-> Serialization <-> Serializer <-> Tcp <-> Traffic <-> Transport <-> Utils
Concern OverloadhighOpentelemetry contains 129 entities but only 25 internal dependencies (0.19 per entity), suggesting multiple responsibilities.
Concern OverloadhighTcp contains 53 entities but only 7 internal dependencies (0.13 per entity), suggesting multiple responsibilities.
Concern OverloadhighTraffic contains 81 entities but only 4 internal dependencies (0.05 per entity), suggesting multiple responsibilities.
Scattered Parasitic Functionalityhigh'Config' pattern is scattered across 8 components: Concurrent, Grpc, Http, Loadbalancer, Logging, Tcp, Transport, Utils
Scattered Parasitic Functionalityhigh'Exception' pattern is scattered across 12 components: Capacity, Client, Concurrent, Encoding, Grpc, Http, Loadbalancer, Serialization, Serializer, Traffic, Transport, Utils
Scattered Parasitic Functionalityhigh'Factory' pattern is scattered across 13 components: Buffer, Client, Concurrent, Context, Data, Dns, Encoding, Grpc, Http, Loadbalancer, Router, Serializer, Transport
Scattered Parasitic Functionalityhigh'Handler' pattern is scattered across 6 components: Buffer, Concurrent, Encoding, Http, Logging, Transport
Scattered Parasitic Functionalityhigh'Provider' pattern is scattered across 14 components: Client, Concurrent, Context, Data, Dns, Grpc, Http, Loadbalancer, Log4J2, Opentelemetry, Opentracing, Serialization, Traffic, Transport
Scattered Parasitic Functionalityhigh'Service' pattern is scattered across 5 components: Concurrent, Context, Examples, Grpc, Http
Scattered Parasitic Functionalityhigh'Utils' pattern is scattered across 15 components: Buffer, Capacity, Client, Concurrent, Context, Encoding, Examples, Grpc, Http, Oio, Opentracing, Router, Serializer, Transport, Utils
Link/Upstream OverloadhighConcurrent is depended on by 20 other components (80% of all components).
Concern OverloadmediumLog4J2 contains 34 entities but only 5 internal dependencies (0.15 per entity), suggesting multiple responsibilities.
Concern OverloadmediumSerialization contains 33 entities but only 9 internal dependencies (0.27 per entity), suggesting multiple responsibilities.
Scattered Parasitic Functionalitymedium'Controller' pattern is scattered across 3 components: Client, Concurrent, Http
Scattered Parasitic Functionalitymedium'Manager' pattern is scattered across 4 components: Http, Opentracing, Transport, Utils
Link/Upstream OverloadmediumBuffer is depended on by 14 other components (56% of all components).
Link/Upstream OverloadmediumContext is depended on by 13 other components (52% of all components).
Link/Upstream OverloadmediumHttp is depended on by 13 other components (52% of all components).
Link/Upstream OverloadmediumTransport is depended on by 17 other components (68% of all components).
Link/Upstream OverloadmediumUtils is depended on by 15 other components (60% of all components).

Build & CI audit (Gradle)

Same measure → report → fix methodology as mvn-perf, ported to Gradle (mvn-perf itself only hooks Maven). Each row cites where it was found.

CheckStateEvidence
Gradle parallel + local build cacheongradle.properties: org.gradle.parallel=true, org.gradle.caching=true, configureondemand=true
Configuration cacheoffNo reference anywhere in the repo
Remote build cache / DevelocityoffNo reference anywhere in the repo
PR CI matrixinfoci-prb.yml: JDK 8/11/17/21/25 on ubuntu, JDK 11 on self-hosted macOS, plus a Netty 4.1.x variant; each runs the full suite
JUnit class parallelismoffjunit-platform.properties: parallel.enabled=true but mode.default and mode.classes.default are same_thread
Workflow timeoutsoffNo timeout-minutes in .github/workflows
Test sharding within a moduleoffNone found; a job runs one module's tests sequentially

Measured

CommandWallResultNote
./gradlew :servicetalk-buffer-api:test --profile165 sBUILD SUCCESSFULWall time includes wrapper/dependency download and daemon start; summed task time ≈ 22 s. Slowest tasks: :compileGroovy 18s; :servicetalk-buffer-api:test 3s; :servicetalk-buffer-api:compileTestJava 1s

Single cold run on one laptop (macOS, JDK 25), no repetition: a data point, not a benchmark.

Pull requests (52)

Filter:

#TitleStateKindComponents+/−
3662http-netty: stop ClientEffectiveStrategyTest blaming late send events on the next requestopentest-only-+42/−60
3661loadbalancer-experimental-provider: align property names with OutlierDetectorConfig.BuildermergedmixedLoadbalancer+85/−12
3660build(deps): bump github/codeql-action/analyze from 4.37.9 to 4.38.1openci-only-+1/−1
3659build(deps): bump github/codeql-action/init from 4.37.9 to 4.38.1openci-only-+1/−1
3658Housekeeping: replace repo-level CODE_OF_CONDUCTmergeddocs-only-+0/−62
3657AGENTS.md: collapse copyright years into a single rangemergeddocs-only-+3/−3
3656Add a commit message skill for coding agentsmergeddocs-only-+152/−3
3655http-router-jersey: document how to limit request payload sizesopenmixedHttp+303/−2
3654Rename test classes to the *Test conventionmergedtest-only-+12/−12
3653http: allow opting out of interrupt-on-cancel for blocking streaming …openmixedConcurrent, Http+554/−38
3652loadbalancer: align outlier detector defaults with EnvoymergedmixedLoadbalancer+229/−57
3651Use Hamcrest matchers that print the actual value in collection assertsmergedtest-only-+123/−97
3650Use assertThrows instead of try/fail/catch in testsmergedtest-only-+200/−444
3649http: score connections by outstanding requests for p2c selectionmergedmixedClient, Http+158/−25
3648ci: gate test reports on artifact origin and drop the quality reportsmergedci-only-+6/−80
3646build(deps): bump actions/setup-java from 6.0.0 to 6.0.1mergedci-only-+6/−6
3644loadbalancer: infer a forced core pool from minConnectionsPerHostmergedmixedLoadbalancer+87/−15
3643loadbalancer: don't strand connections on hosts that can't grow their poolmergedmixedClient, Loadbalancer+157/−30
3642Add AGENTS.md and a testing skill for coding agentsmergeddocs-only-+855/−0
3641loadbalancer: fix corePool connection selector crash on empty poolmergedmixedClient, Loadbalancer+145/−16
3640loadbalancer: properly honor the maxEjectionPercentagemergedmixedExamples, Loadbalancer+162/−21
3639loadbalancer: release the health indicator when an expired host drainsmergedmixedLoadbalancer+47/−18
3638ThreadInterruptingCancellable: fix interrupt leak when onSubscribe throwsmergedmixedConcurrent, Http+159/−9
3637concurrent-internal: fix ThreadInterruptingCancellable interrupt leakmergedmixedConcurrent+175/−29
3636docs: java.net.preferIPv6Stack -> java.net.preferIPv6Addressesmergedmain-onlyDns+2/−2
3634build(deps): bump github/codeql-action/init from 4.37.8 to 4.37.9mergedci-only-+1/−1
3633build(deps): bump github/codeql-action/analyze from 4.37.8 to 4.37.9mergedci-only-+1/−1
3630Remove MethodHandles from HTTP/2 codec builderclosedmain-onlyUtils+3/−88
3629Fix traffic resilience documentation linksmergedmixed-+1/−3
3628build(deps): bump github/codeql-action/analyze from 4.37.5 to 4.37.8mergedci-only-+1/−1
3626build(deps): bump github/codeql-action/init from 4.37.5 to 4.37.8mergedci-only-+1/−1
3625build(deps): bump actions/setup-java from 5.7.0 to 6.0.0mergedci-only-+6/−6
3624build(deps): bump gradle-wrapper from 9.7.0 to 9.7.1mergedbuild-only-+2/−2
3622Fix flaky H2ResponseCancelTestclosedtest-only-+4/−1
3621Update tags for releasemergedmixed-+14/−14
3620examples: add virtual threads HTTP example and guidemergedmixedExamples+373/−0
3606http-netty: fix connection acceptor context test racemergedtest-only-+28/−21
3601build(deps): bump gradle/actions/wrapper-validation from 6.2.0 to 6.3.0mergedci-only-+1/−1
3596dns-discovery-netty: fix SRV resurrection during A-record backoffopenmixedDns+149/−35
3570opentelemetry-http: stabilize lifecycle cancellation testmergedtest-only-+14/−2
3535Try to fix the flaky ReplayPublisherTest.concurrentTTL testmergedtest-only-+42/−35
3521http-netty: fix flaky PayloadSizeLimitingHttpServiceFilterTestmergedtest-only-+15/−2
3506http-netty: Fix flaky noMaxActiveStreamsViolatedErrorAfterCancel() testmergedtest-only-+23/−18
3461Defer connectionEstablished observer callback and H2 auto-read untilopenmixedHttp, Transport+483/−30
3447opentelemetry-client: add ServiceTalk[Grpc|Http]Sender implementationsopenmixed-+3474/−0
3162http-netty: Add support for GC based message leak detectionopenmixedHttp+570/−101
2906Add `ContextMaps` to let users create various `ContextMap`sopenmixedConcurrent, Context, Grpc, Http+827/−146
2861Introduce a cache for Publishers that tracks subscriptions to manage the cacheopenmixed-+472/−0
2690Add Publisher.zipopenmixedConcurrent+2872/−19
2571Streamline the creation of GRPC ExceptionsopenmixedGrpc+39/−3
2384PublisherAsBlockingIterable LinkedBlockingQueue -> SpscBlockingQueueopenmixedConcurrent, Loadbalancer, Utils+417/−4
2383Make `Single.concat(Publisher)` behavior consistent on cancelopenmixedConcurrent+124/−54

Generated 2026-09-28 · arcade-agent baseline computed in 1.6 s.