diff --git a/servicetalk-client-api/src/main/java/io/servicetalk/client/api/LoadBalancerFactory.java b/servicetalk-client-api/src/main/java/io/servicetalk/client/api/LoadBalancerFactory.java index 460cc034d5..dca0e1fcac 100644 --- a/servicetalk-client-api/src/main/java/io/servicetalk/client/api/LoadBalancerFactory.java +++ b/servicetalk-client-api/src/main/java/io/servicetalk/client/api/LoadBalancerFactory.java @@ -86,7 +86,7 @@ LoadBalancer newLoadBalancer( * new connections. Returned {@link LoadBalancer} will own the responsibility for this {@link ConnectionFactory} * and hence will call {@link ConnectionFactory#closeAsync()} when {@link LoadBalancer#closeAsync()} is called. * @param targetResource A {@link String} representation of the target resource for which the created instance - * will perform load balancing. Bear in mind, load balancing is performed over the a collection of hosts provided + * will perform load balancing. Bear in mind, load balancing is performed over the collection of hosts provided * via the {@code eventPublisher} which may not correspond directly to a single unresolved address, but potentially * a merged collection. * @return a new {@link LoadBalancer}. diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancer.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancer.java index d9448adfb0..d39baf1225 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancer.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancer.java @@ -133,7 +133,7 @@ final class DefaultLoadBalancer loadBalancerObserver, @Nullable final HealthCheckConfig healthCheckConfig, - @Nullable final Supplier healthCheckerFactory) { + @Nullable final Supplier> healthCheckerFactory) { this.targetResource = requireNonNull(targetResourceName); this.lbDescription = makeDescription(id, targetResource); this.hostSelector = requireNonNull(hostSelector, "hostSelector"); @@ -145,7 +145,7 @@ final class DefaultLoadBalancer - LOGGER.error("{}: Uncaught exception in " + this.getClass().getSimpleName(), this, uncaughtException)); + LOGGER.error("{}: Uncaught exception in {}", this, this.getClass().getSimpleName(), uncaughtException)); this.asyncCloseable = toAsyncCloseable(this::doClose); // Maintain a Subscriber so signals are always delivered to replay and new Subscribers get the latest signal. eventStream.ignoreElements().subscribe(); diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancerBuilder.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancerBuilder.java index b60584d5cf..0379f9f37e 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancerBuilder.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultLoadBalancerBuilder.java @@ -51,7 +51,7 @@ final class DefaultLoadBalancerBuilder loadBalancerObserver; @Nullable - private HealthCheckerFactory healthCheckerFactory; + private HealthCheckerFactory healthCheckerFactory; private Duration healthCheckInterval = DEFAULT_HEALTH_CHECK_INTERVAL; private Duration healthCheckJitter = DEFAULT_HEALTH_CHECK_JITTER; private int healthCheckFailedConnectionsThreshold = DEFAULT_HEALTH_CHECK_FAILED_CONNECTIONS_THRESHOLD; @@ -70,7 +70,8 @@ public LoadBalancerBuilder linearSearchSpace(int linearSearc } @Override - public LoadBalancerBuilder loadBalancingPolicy(LoadBalancingPolicy loadBalancingPolicy) { + public LoadBalancerBuilder loadBalancingPolicy( + LoadBalancingPolicy loadBalancingPolicy) { this.loadBalancingPolicy = requireNonNull(loadBalancingPolicy, "loadBalancingPolicy"); return this; } @@ -83,7 +84,8 @@ public LoadBalancerBuilder loadBalancerObserver( } @Override - public LoadBalancerBuilder healthCheckerFactory(HealthCheckerFactory healthCheckerFactory) { + public LoadBalancerBuilder healthCheckerFactory( + HealthCheckerFactory healthCheckerFactory) { this.healthCheckerFactory = healthCheckerFactory; return this; } @@ -133,7 +135,7 @@ public LoadBalancerFactory build() { } final LoadBalancerObserver loadBalancerObserver = this.loadBalancerObserver != null ? this.loadBalancerObserver : NoopLoadBalancerObserver.instance(); - Supplier healthCheckerSupplier; + Supplier> healthCheckerSupplier; if (healthCheckerFactory == null) { healthCheckerSupplier = null; } else { @@ -150,18 +152,18 @@ private static final class DefaultLoadBalancerFactory { private final String id; - private final LoadBalancingPolicy loadBalancingPolicy; + private final LoadBalancingPolicy loadBalancingPolicy; private final LoadBalancerObserver loadBalancerObserver; private final int linearSearchSpace; @Nullable - private final Supplier healthCheckerFactory; + private final Supplier> healthCheckerFactory; @Nullable private final HealthCheckConfig healthCheckConfig; - DefaultLoadBalancerFactory(final String id, final LoadBalancingPolicy loadBalancingPolicy, - final int linearSearchSpace, final HealthCheckConfig healthCheckConfig, + DefaultLoadBalancerFactory(final String id, final LoadBalancingPolicy loadBalancingPolicy, + final int linearSearchSpace, final HealthCheckConfig healthCheckConfig, final LoadBalancerObserver loadBalancerObserver, - final Supplier healthCheckerFactory) { + final Supplier> healthCheckerFactory) { this.id = requireNonNull(id, "id"); this.loadBalancingPolicy = requireNonNull(loadBalancingPolicy, "loadBalancingPolicy"); this.loadBalancerObserver = requireNonNull(loadBalancerObserver, "loadBalancerObserver"); @@ -174,7 +176,7 @@ private static final class DefaultLoadBalancerFactory LoadBalancer newLoadBalancer(String targetResource, Publisher>> eventPublisher, ConnectionFactory connectionFactory) { - return new DefaultLoadBalancer<>(id, targetResource, eventPublisher, + return new DefaultLoadBalancer(id, targetResource, eventPublisher, loadBalancingPolicy.buildSelector(Collections.emptyList(), targetResource), connectionFactory, linearSearchSpace, loadBalancerObserver, healthCheckConfig, healthCheckerFactory); } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultRequestTracker.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultRequestTracker.java index 2c8ca48d76..3e9e2a5492 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultRequestTracker.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/DefaultRequestTracker.java @@ -87,19 +87,19 @@ public final long beforeStart() { } @Override - public void observeSuccess(final long startTimeNanos) { + public void onSuccess(final long startTimeNanos) { pendingUpdater.decrementAndGet(this); calculateAndStore((ewma, currentLatency) -> currentLatency, startTimeNanos); } @Override - public void observeCancel(final long startTimeNanos) { + public void onCancel(final long startTimeNanos) { pendingUpdater.decrementAndGet(this); calculateAndStore(this::cancelPenalty, startTimeNanos); } @Override - public void observeError(final long startTimeNanos) { + public void onError(final long startTimeNanos) { pendingUpdater.decrementAndGet(this); calculateAndStore(this::errorPenalty, startTimeNanos); } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthChecker.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthChecker.java index 64fd144cd7..fda87f0806 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthChecker.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthChecker.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Apple Inc. and the ServiceTalk project authors + * Copyright © 2024 Apple Inc. and the ServiceTalk project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,8 +19,6 @@ /** * The representation of a health checking system for use with load balancing. - *

- * The core */ interface HealthChecker extends Cancellable { diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthCheckerFactory.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthCheckerFactory.java index 9326493bef..ed85456935 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthCheckerFactory.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthCheckerFactory.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Apple Inc. and the ServiceTalk project authors + * Copyright © 2024 Apple Inc. and the ServiceTalk project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthIndicator.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthIndicator.java index c38dfecf50..cf04a6811f 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthIndicator.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/HealthIndicator.java @@ -1,5 +1,5 @@ /* - * Copyright © 2023 Apple Inc. and the ServiceTalk project authors + * Copyright © 2024 Apple Inc. and the ServiceTalk project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancerBuilder.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancerBuilder.java index 017d497dd5..44d6b013c8 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancerBuilder.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancerBuilder.java @@ -89,7 +89,8 @@ LoadBalancerBuilder loadBalancerObserver( * {@link HealthChecker}. * @return {code this} */ - LoadBalancerBuilder healthCheckerFactory(HealthCheckerFactory healthCheckerFactory); + LoadBalancerBuilder healthCheckerFactory( + HealthCheckerFactory healthCheckerFactory); /** * This {@link LoadBalancer} may monitor hosts to which connection establishment has failed diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancingPolicy.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancingPolicy.java index 8a2b9b60b1..3dca665225 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancingPolicy.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/LoadBalancingPolicy.java @@ -36,5 +36,6 @@ interface LoadBalancingPolicy * @param targetResource the name of the target resource, useful for debugging purposes. * @return a {@link HostSelector} */ - HostSelector buildSelector(List> hosts, String targetResource); + HostSelector buildSelector( + List> hosts, String targetResource); } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/P2CLoadBalancingPolicy.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/P2CLoadBalancingPolicy.java index bb8ea21414..a34f12f8d7 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/P2CLoadBalancingPolicy.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/P2CLoadBalancingPolicy.java @@ -52,7 +52,8 @@ private P2CLoadBalancingPolicy(final int maxEffort, final boolean failOpen, @Nul } @Override - public HostSelector buildSelector(List> hosts, String targetResource) { + public HostSelector buildSelector( + List> hosts, String targetResource) { return new P2CSelector<>(hosts, targetResource, maxEffort, failOpen, random); } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RequestTracker.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RequestTracker.java index a4c86cd1df..2abac19be7 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RequestTracker.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RequestTracker.java @@ -1,5 +1,5 @@ /* - * Copyright © 2020 Apple Inc. and the ServiceTalk project authors + * Copyright © 2023-2024 Apple Inc. and the ServiceTalk project authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -22,7 +22,6 @@ */ interface RequestTracker { - @SuppressWarnings("rawtypes") ContextMap.Key REQUEST_TRACKER_KEY = ContextMap.Key.newKey("request_tracker", RequestTracker.class); @@ -38,19 +37,19 @@ interface RequestTracker { * * @param beforeStartTimeNs return value from {@link #beforeStart()}. */ - void observeSuccess(long beforeStartTimeNs); + void onSuccess(long beforeStartTimeNs); /** * Records cancellation of the action for which latency is to be tracked. * * @param beforeStartTimeNs return value from {@link #beforeStart()}. */ - void observeCancel(long beforeStartTimeNs); + void onCancel(long beforeStartTimeNs); /** * Records a failed completion of the action for which latency is to be tracked. * * @param beforeStartTimeNs return value from {@link #beforeStart()}. */ - void observeError(long beforeStartTimeNs); + void onError(long beforeStartTimeNs); } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RootSwayingLeafRequestTracker.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RootSwayingLeafRequestTracker.java index d1e9e139ed..f56023be62 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RootSwayingLeafRequestTracker.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RootSwayingLeafRequestTracker.java @@ -40,23 +40,23 @@ public long beforeStart() { } @Override - public void observeSuccess(final long beforeStartTimeNs) { + public void onSuccess(final long beforeStartTimeNs) { // Tracks both levels - root.observeSuccess(beforeStartTimeNs); - leaf.observeSuccess(beforeStartTimeNs); + root.onSuccess(beforeStartTimeNs); + leaf.onSuccess(beforeStartTimeNs); } @Override - public void observeCancel(final long beforeStartTimeNs) { + public void onCancel(final long beforeStartTimeNs) { // Tracks both levels - root.observeCancel(beforeStartTimeNs); - leaf.observeCancel(beforeStartTimeNs); + root.onCancel(beforeStartTimeNs); + leaf.onCancel(beforeStartTimeNs); } @Override - public void observeError(final long beforeStartTimeNs) { + public void onError(final long beforeStartTimeNs) { // Tracks both levels - root.observeError(beforeStartTimeNs); - leaf.observeError(beforeStartTimeNs); + root.onError(beforeStartTimeNs); + leaf.onError(beforeStartTimeNs); } } diff --git a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancingPolicy.java b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancingPolicy.java index 8ed1fe9892..395fd41418 100644 --- a/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancingPolicy.java +++ b/servicetalk-loadbalancer/src/main/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancingPolicy.java @@ -36,8 +36,8 @@ private RoundRobinLoadBalancingPolicy(final boolean failOpen) { } @Override - public HostSelector - buildSelector(final List> hosts, final String targetResource) { + public HostSelector + buildSelector(final List> hosts, final String targetResource) { return new RoundRobinSelector<>(hosts, targetResource, failOpen); } diff --git a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultLoadBalancerTest.java b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultLoadBalancerTest.java index ba4152692f..f9574cae34 100644 --- a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultLoadBalancerTest.java +++ b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultLoadBalancerTest.java @@ -210,15 +210,15 @@ public boolean isHealthy() { } @Override - public void observeSuccess(long beforeStartTime) { + public void onSuccess(long beforeStartTime) { } @Override - public void observeCancel(long beforeStartTimeNs) { + public void onCancel(long beforeStartTimeNs) { } @Override - public void observeError(long beforeStartTime) { + public void onError(long beforeStartTime) { } } @@ -270,30 +270,30 @@ public String name() { } @Override - public HostSelector buildSelector( - List> hosts, String targetResource) { + public HostSelector buildSelector( + List> hosts, String targetResource) { return new TestSelector(hosts); } - private class TestSelector implements HostSelector { + private class TestSelector implements HostSelector { - private final List> hosts; + private final List> hosts; - TestSelector(final List> hosts) { + TestSelector(final List> hosts) { this.hosts = hosts; } @Override - public Single selectConnection( - Predicate selector, @Nullable ContextMap context, + public Single selectConnection( + Predicate selector, @Nullable ContextMap context, boolean forceNewConnectionAndReserve) { return hosts.isEmpty() ? failed(new IllegalStateException("shouldn't be empty")) : hosts.get(0).newConnection(selector, false, context); } @Override - public HostSelector rebuildWithHosts( - List> hosts) { + public HostSelector rebuildWithHosts( + List> hosts) { rebuilds++; return new TestSelector(hosts); } diff --git a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultRequestTrackerTest.java b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultRequestTrackerTest.java index 4b211a9fb3..c6c0366358 100644 --- a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultRequestTrackerTest.java +++ b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/DefaultRequestTrackerTest.java @@ -37,11 +37,11 @@ void test() { Assertions.assertEquals(0, requestTracker.score()); // upon success score - requestTracker.observeSuccess(requestTracker.beforeStart()); + requestTracker.onSuccess(requestTracker.beforeStart()); Assertions.assertEquals(-500, requestTracker.score()); // error penalty - requestTracker.observeError(requestTracker.beforeStart()); + requestTracker.onError(requestTracker.beforeStart()); Assertions.assertEquals(-5000, requestTracker.score()); // decay diff --git a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancerBuilderAdapter.java b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancerBuilderAdapter.java index 9057258ddb..ccbc02ddf8 100644 --- a/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancerBuilderAdapter.java +++ b/servicetalk-loadbalancer/src/test/java/io/servicetalk/loadbalancer/RoundRobinLoadBalancerBuilderAdapter.java @@ -44,7 +44,7 @@ public LoadBalancerBuilder loadBalancerObser @Override public LoadBalancerBuilder healthCheckerFactory( - HealthCheckerFactory healthCheckerFactory) { + HealthCheckerFactory healthCheckerFactory) { throw new IllegalStateException("Cannot set a load balancer health checker for old round robin"); }