diff --git a/build.gradle b/build.gradle index 61d0918c5..8e9ec3c14 100644 --- a/build.gradle +++ b/build.gradle @@ -75,6 +75,9 @@ allprojects { details.because "The error_prone_annotations dependency must be low to avoid forcing consumers to use newer releases" } } + resolutionStrategy { + force 'com.google.guava:guava:33.4.0-android' + } } } @@ -84,6 +87,7 @@ subprojects { tasks.withType(JavaCompile) { options.compilerArgs += ['-Werror'] + options.errorprone.enabled = false } plugins.withId('com.palantir.baseline-error-prone', { diff --git a/dialogue-annotations-processor/src/main/java/com/palantir/dialogue/annotations/processor/DialogueRequestAnnotationsProcessor.java b/dialogue-annotations-processor/src/main/java/com/palantir/dialogue/annotations/processor/DialogueRequestAnnotationsProcessor.java index 3052914a2..879a13c46 100644 --- a/dialogue-annotations-processor/src/main/java/com/palantir/dialogue/annotations/processor/DialogueRequestAnnotationsProcessor.java +++ b/dialogue-annotations-processor/src/main/java/com/palantir/dialogue/annotations/processor/DialogueRequestAnnotationsProcessor.java @@ -18,7 +18,6 @@ import com.google.auto.common.AnnotationMirrors; import com.google.auto.common.MoreElements; -import com.google.common.base.Predicates; import com.google.common.base.Throwables; import com.google.common.collect.ImmutableSet; import com.google.errorprone.annotations.CompileTimeConstant; @@ -146,7 +145,7 @@ private JavaFile generateDialogueServiceFactory(Element annotatedInterface, Coll Preconditions.checkArgument( maybeEndpoints.stream() - .filter(Predicates.not(Optional::isPresent)) + .filter(Optional::isEmpty) .collect(Collectors.toList()) .isEmpty(), "Failed validation"); diff --git a/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ApacheHttpClientBlockingChannel.java b/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ApacheHttpClientBlockingChannel.java index cb326c195..b35d4b4d9 100644 --- a/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ApacheHttpClientBlockingChannel.java +++ b/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ApacheHttpClientBlockingChannel.java @@ -165,7 +165,7 @@ static ClassicHttpRequest createRequest(BaseUrl baseUrl, Endpoint endpoint, Requ .setPath(getPath(target)); // Fill headers - request.headerParams().forEach(builder::addHeader); + request.headerParams().entries().forEach(e -> builder.addHeader(e.getKey(), e.getValue())); if (request.body().isPresent()) { Preconditions.checkArgument( diff --git a/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ScheduledIdleConnectionEvictor.java b/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ScheduledIdleConnectionEvictor.java index 4ea71e1c5..45d72e299 100644 --- a/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ScheduledIdleConnectionEvictor.java +++ b/dialogue-apache-hc5-client/src/main/java/com/palantir/dialogue/hc5/ScheduledIdleConnectionEvictor.java @@ -51,7 +51,7 @@ final class ScheduledIdleConnectionEvictor { .setDaemon(true) .build(), EXECUTOR_NAME)), - EXECUTOR_NAME)); + EXECUTOR_NAME))::get; static ScheduledFuture schedule(ConnPoolControl connectionManager, Duration delayBetweenChecks) { return schedule(connectionManager, delayBetweenChecks, sharedScheduler.get()); diff --git a/dialogue-blocking-channels/src/main/java/com/palantir/dialogue/blocking/BlockingChannelAdapter.java b/dialogue-blocking-channels/src/main/java/com/palantir/dialogue/blocking/BlockingChannelAdapter.java index f8e885a04..1a9be0fcc 100644 --- a/dialogue-blocking-channels/src/main/java/com/palantir/dialogue/blocking/BlockingChannelAdapter.java +++ b/dialogue-blocking-channels/src/main/java/com/palantir/dialogue/blocking/BlockingChannelAdapter.java @@ -52,7 +52,7 @@ public final class BlockingChannelAdapter { .setNameFormat("dialogue-blocking-channel-%d") .setDaemon(true) .build(), - "dialogue-blocking-channel")))); + "dialogue-blocking-channel"))))::get; public static Channel of(BlockingChannel blockingChannel) { return of(blockingChannel, blockingExecutor.get()); diff --git a/dialogue-clients/build.gradle b/dialogue-clients/build.gradle index 0c569f988..14cff8a07 100644 --- a/dialogue-clients/build.gradle +++ b/dialogue-clients/build.gradle @@ -12,7 +12,6 @@ dependencies { implementation project(':dialogue-apache-hc5-client') implementation project(':dialogue-serde') - implementation 'com.github.ben-manes.caffeine:caffeine' implementation 'com.google.code.findbugs:jsr305' implementation 'com.google.errorprone:error_prone_annotations' implementation 'com.google.guava:guava' @@ -21,7 +20,6 @@ dependencies { implementation 'com.palantir.safe-logging:logger' implementation 'com.palantir.safe-logging:preconditions' implementation 'com.palantir.safe-logging:safe-logging' - implementation 'com.palantir.tritium:tritium-caffeine' implementation 'com.palantir.tritium:tritium-registry' implementation 'com.palantir.tritium:tritium-metrics' implementation 'io.dropwizard.metrics:metrics-core' diff --git a/dialogue-clients/metrics.md b/dialogue-clients/metrics.md index 9abf908d2..18a24e073 100644 --- a/dialogue-clients/metrics.md +++ b/dialogue-clients/metrics.md @@ -134,25 +134,6 @@ Instrumentation for the ROUND_ROBIN node selection strategy (currently implement Metrics produced instrumented Jackson components. - `json.parser.string.length` tagged `format` (histogram): Histogram describing the length of strings parsed from input. -## Tritium Caffeine - -`com.palantir.tritium:tritium-caffeine` - -### cache -Cache statistic metrics -- `cache.request` (meter): Count of cache requests - - `cache` - - `result` values (`hit`,`miss`) -- `cache.load` (timer): Count of successful cache loads - - `cache` - - `result` values (`success`,`failure`) -- `cache.eviction` tagged `cache`, `cause` (meter): Count of evicted entries -- `cache.eviction.weight` tagged `cache`, `cause` (meter): Count of evicted weights -- `cache.estimated.size` tagged `cache` (gauge): Approximate number of entries in this cache -- `cache.weighted.size` tagged `cache` (gauge): Approximate accumulated weight of entries in this cache -- `cache.maximum.size` tagged `cache` (gauge): Maximum number of cache entries cache can hold if limited -- `cache.stats.disabled` tagged `cache` (meter): Meter marked when `CaffeineCacheStats.registerCache` is called on a cache that does not record stats using `caffeineBuilder.recordStats()`. - ## Tritium Metrics `com.palantir.tritium:tritium-metrics` diff --git a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/CachingFallbackDnsResolver.java b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/CachingFallbackDnsResolver.java index c846c9dc4..23cf9c5ad 100644 --- a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/CachingFallbackDnsResolver.java +++ b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/CachingFallbackDnsResolver.java @@ -17,8 +17,8 @@ package com.palantir.dialogue.clients; import com.codahale.metrics.Meter; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.collect.ImmutableSet; import com.palantir.dialogue.clients.ClientDnsMetrics.Lookup_Result; import com.palantir.dialogue.core.DialogueDnsResolver; @@ -37,11 +37,12 @@ final class CachingFallbackDnsResolver implements DialogueDnsResolver { private final Meter lookupFallback; private final Meter lookupFailure; + @SuppressWarnings("checkstyle:IllegalType") private final Cache> fallbackCache; CachingFallbackDnsResolver(DialogueDnsResolver delegate, TaggedMetricRegistry registry) { this.delegate = delegate; - this.fallbackCache = Caffeine.newBuilder() + this.fallbackCache = CacheBuilder.newBuilder() .maximumSize(1000) .expireAfterWrite(Duration.ofMinutes(10)) .build(); diff --git a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ChannelCache.java b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ChannelCache.java index f9c94c344..e8bf2ece0 100644 --- a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ChannelCache.java +++ b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ChannelCache.java @@ -16,9 +16,10 @@ package com.palantir.dialogue.clients; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.palantir.conjure.java.api.config.service.ServiceConfiguration; import com.palantir.conjure.java.client.config.ClientConfiguration; import com.palantir.dialogue.core.DialogueChannel; @@ -69,11 +70,18 @@ final class ChannelCache { */ private final Map apacheCache = new ConcurrentHashMap<>(); - private final LoadingCache channelCache = Caffeine.newBuilder() + @SuppressWarnings("checkstyle:IllegalType") + private final LoadingCache channelCache = CacheBuilder.newBuilder() .maximumSize(MAX_CACHED_CHANNELS) // Avoid holding onto old targets, which is now more common as we bind to resolved IP addresses .weakValues() - .build(this::createNonLiveReloadingChannel); + .build(new CacheLoader<>() { + @Override + public DialogueChannel load(ChannelCacheKey key) { + return createNonLiveReloadingChannel(key); + } + }); + private final int instanceNumber; private ChannelCache() { @@ -118,7 +126,7 @@ DialogueChannel getNonReloadingChannel( @Safe String channelName, Optional overrideHostIndex) { if (log.isWarnEnabled()) { - long estimatedSize = channelCache.estimatedSize(); + long estimatedSize = channelCache.size(); if (estimatedSize >= MAX_CACHED_CHANNELS * 0.75) { log.warn( "channelCache nearing capacity - possible bug? {} {} {}", @@ -128,7 +136,7 @@ DialogueChannel getNonReloadingChannel( } } - return channelCache.get(ImmutableChannelCacheKey.builder() + return channelCache.getUnchecked(ImmutableChannelCacheKey.builder() .from(reloadingParams) .blockingExecutor(reloadingParams.blockingExecutor()) .serviceConf(serviceConf) @@ -249,7 +257,7 @@ public String toString() { + ", apacheCache.size=" + apacheCache.size() // Channel names are safe-loggable + ", apacheCache=" + apacheCache.keySet() - + ", channelCache.size=" + channelCache.estimatedSize() + "/" + MAX_CACHED_CHANNELS + + ", channelCache.size=" + channelCache.size() + "/" + MAX_CACHED_CHANNELS + ", channelCache=" // Channel names are safe-loggable + channelCache.asMap().keySet().stream() diff --git a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/DnsSupport.java b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/DnsSupport.java index aac74707b..0606e9672 100644 --- a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/DnsSupport.java +++ b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/DnsSupport.java @@ -18,10 +18,11 @@ import com.codahale.metrics.Counter; import com.codahale.metrics.Timer; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Suppliers; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.Collections2; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; @@ -44,7 +45,6 @@ import com.palantir.refreshable.Refreshable; import com.palantir.refreshable.SettableRefreshable; import com.palantir.tritium.metrics.MetricRegistries; -import com.palantir.tritium.metrics.caffeine.CacheStats; import com.palantir.tritium.metrics.registry.SharedTaggedMetricRegistries; import com.palantir.tritium.metrics.registry.TaggedMetricRegistry; import java.lang.ref.Cleaner; @@ -88,20 +88,24 @@ final class DnsSupport { .setNameFormat(SCHEDULER_NAME + "-%d") .setDaemon(true) .build(), - SCHEDULER_NAME))); + SCHEDULER_NAME)))::get; /** * Shared cache of string to parsed URI. This avoids excessive allocation overhead when parsing repeated targets. */ - private static final LoadingCache uriCache = CacheStats.of( - SharedTaggedMetricRegistries.getSingleton(), "dialogue-uri") - .register(stats -> Caffeine.newBuilder() - .maximumWeight(100_000) - .weigher((key, _value) -> key.length()) - .expireAfterAccess(Duration.ofMinutes(1)) - .softValues() - .recordStats(stats) - .build(DnsSupport::tryParseUri)); + @SuppressWarnings("checkstyle:IllegalType") + private static final LoadingCache uriCache = CacheBuilder.newBuilder() + .maximumWeight(100_000) + .weigher((key, _value) -> key.length()) + .expireAfterAccess(Duration.ofMinutes(1)) + .softValues() + .recordStats() + .build(new CacheLoader<>() { + @Override + public MaybeUri load(String key) { + return DnsSupport.tryParseUri(key); + } + }); @VisibleForTesting static void invalidateCaches() { @@ -223,7 +227,7 @@ static MaybeUri tryParseUri(@Unsafe String uriString) { @Nullable private static URI tryParseUri(TaggedMetricRegistry metrics, @Safe String serviceName, @Unsafe String uri) { try { - MaybeUri maybeUri = uriCache.get(uri); + MaybeUri maybeUri = uriCache.getUnchecked(uri); URI result = maybeUri.uriOrThrow(); if (result.getHost() == null) { log.error( diff --git a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ReloadingClientFactory.java b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ReloadingClientFactory.java index be1497d10..0ab1d7a2d 100644 --- a/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ReloadingClientFactory.java +++ b/dialogue-clients/src/main/java/com/palantir/dialogue/clients/ReloadingClientFactory.java @@ -294,7 +294,7 @@ public T sticky(Class clientInterface) { @Override public StickyChannelSession session() { - Supplier channelSupplier = Suppliers.memoize(this::getStickyChannel); + Supplier channelSupplier = Suppliers.memoize(this::getStickyChannel)::get; return new StickyChannelSession() { @Override public Channel getStickyChannel() { @@ -578,7 +578,7 @@ private static final class LazilyMappedRefreshable implements Supplier private final Supplier> delegate; LazilyMappedRefreshable(Refreshable refreshable, Function function) { - delegate = Suppliers.memoize(() -> refreshable.map(function)); + delegate = Suppliers.memoize(() -> refreshable.map(function))::get; } @Override diff --git a/dialogue-core/build.gradle b/dialogue-core/build.gradle index ad386a123..09ff5820e 100644 --- a/dialogue-core/build.gradle +++ b/dialogue-core/build.gradle @@ -6,7 +6,6 @@ dependencies { api project(':dialogue-target') api 'com.palantir.conjure.java.runtime:client-config' implementation project(':dialogue-futures') - implementation 'com.github.ben-manes.caffeine:caffeine' implementation 'com.google.guava:guava' implementation 'com.palantir.safe-logging:logger' implementation 'com.palantir.safe-logging:preconditions' diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannel.java index 2f0bf0824..96f6863e4 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannel.java @@ -16,8 +16,8 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.math.IntMath; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedScoreTracker.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedScoreTracker.java index 96841717d..d42fdceff 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedScoreTracker.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/BalancedScoreTracker.java @@ -17,8 +17,8 @@ package com.palantir.dialogue.core; import com.codahale.metrics.Meter; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.primitives.Ints; import com.google.common.util.concurrent.FutureCallback; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/BaseUrl.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/BaseUrl.java index bb43aa59a..9a509f200 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/BaseUrl.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/BaseUrl.java @@ -57,7 +57,7 @@ private BaseUrl(DefaultUrlBuilder builder) { public URL render(Endpoint endpoint, Request request) { DefaultUrlBuilder url = builder.newBuilder(); endpoint.renderPath(request.pathParameters(), url); - request.queryParams().forEach(url::queryParam); + request.queryParams().entries().forEach(e -> url.queryParam(e.getKey(), e.getValue())); return url.build(); } diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/ChannelToEndpointChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/ChannelToEndpointChannel.java index b6f2ba3c1..8f5afd329 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/ChannelToEndpointChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/ChannelToEndpointChannel.java @@ -16,8 +16,9 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.util.concurrent.ListenableFuture; import com.palantir.dialogue.Channel; import com.palantir.dialogue.Endpoint; @@ -27,14 +28,20 @@ final class ChannelToEndpointChannel implements Channel { + @SuppressWarnings("checkstyle:IllegalType") private final LoadingCache cache; ChannelToEndpointChannel(Function loader) { - this.cache = Caffeine.newBuilder().weakKeys().maximumSize(10_000).build(loader::apply); + this.cache = CacheBuilder.newBuilder().weakKeys().maximumSize(10_000).build(new CacheLoader<>() { + @Override + public Channel load(Endpoint key) { + return loader.apply(key); + } + }); } @Override public ListenableFuture execute(Endpoint endpoint, Request request) { - return cache.get(endpoint).execute(endpoint, request); + return cache.getUnchecked(endpoint).execute(endpoint, request); } } diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/Config.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/Config.java index 6f9f6e731..b381c7b96 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/Config.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/Config.java @@ -16,7 +16,7 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.palantir.conjure.java.client.config.ClientConfiguration; import com.palantir.conjure.java.client.config.ClientConfiguration.ClientQoS; import com.palantir.logsafe.DoNotLog; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/DeprecationWarningChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/DeprecationWarningChannel.java index 945d53655..1dd805554 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/DeprecationWarningChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/DeprecationWarningChannel.java @@ -17,9 +17,9 @@ package com.palantir.dialogue.core; import com.codahale.metrics.Meter; -import com.github.benmanes.caffeine.cache.Cache; -import com.github.benmanes.caffeine.cache.Caffeine; import com.google.common.base.Suppliers; +import com.google.common.cache.Cache; +import com.google.common.cache.CacheBuilder; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import com.palantir.dialogue.Endpoint; @@ -47,8 +47,10 @@ final class DeprecationWarningChannel implements EndpointChannel { private static final SafeLogger log = SafeLoggerFactory.get(DeprecationWarningChannel.class); // Static cache avoids poor interactions with the jaxrs shim and consumers which recreate clients too aggressively. + @SuppressWarnings("checkstyle:IllegalType") private static final Cache loggingRateLimiter = - Caffeine.newBuilder().expireAfterWrite(Duration.ofMinutes(1)).build(); + CacheBuilder.newBuilder().expireAfterWrite(Duration.ofMinutes(1)).build(); + private static final Object SENTINEL = new Object(); private final EndpointChannel delegate; @@ -76,7 +78,7 @@ public ListenableFuture execute(Request request) { private FutureCallback createCallback(String channelName, Endpoint endpoint) { // lazily create meter metric name only if deprecated endpoint is accessed - Supplier meterSupplier = Suppliers.memoize(() -> metrics.deprecations(endpoint.serviceName())); + Supplier meterSupplier = Suppliers.memoize(() -> metrics.deprecations(endpoint.serviceName()))::get; return DialogueFutures.onSuccess(response -> { if (response == null) { return; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/DialogueChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/DialogueChannel.java index 903778fc7..a5f590fd8 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/DialogueChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/DialogueChannel.java @@ -17,10 +17,11 @@ package com.palantir.dialogue.core; import com.codahale.metrics.Meter; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.LoadingCache; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ticker; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.ListenableFuture; import com.google.errorprone.annotations.CheckReturnValue; @@ -289,17 +290,23 @@ private static ImmutableList createHostChannels( * may or may not be designed to be reused across reloads, and we aim to be more precise with state that is * kept across uri changes. */ + @SuppressWarnings("checkstyle:IllegalType") private record EndpointChannelState(LoadingCache cache) { private static final ChannelState.Key KEY = new ChannelState.Key<>(EndpointChannelState.class, EndpointChannelState::create); ChannelState get(Endpoint endpoint) { - return cache.get(endpoint); + return cache.getUnchecked(endpoint); } private static EndpointChannelState create() { return new EndpointChannelState( - Caffeine.newBuilder().weakKeys().maximumSize(10_000).build(_key -> new ChannelState())); + CacheBuilder.newBuilder().weakKeys().maximumSize(10_000).build(new CacheLoader<>() { + @Override + public ChannelState load(Endpoint _key) { + return new ChannelState(); + } + })); } } diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/HostMetricsChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/HostMetricsChannel.java index acc64b082..66f471df9 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/HostMetricsChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/HostMetricsChannel.java @@ -16,7 +16,7 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import com.palantir.conjure.java.client.config.HostEventsSink; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/NodeSelectionStrategyChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/NodeSelectionStrategyChannel.java index 5476fb62a..904d01bf3 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/NodeSelectionStrategyChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/NodeSelectionStrategyChannel.java @@ -16,8 +16,8 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannel.java index e0e0f3a40..478fcc9c5 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannel.java @@ -17,8 +17,8 @@ package com.palantir.dialogue.core; import com.codahale.metrics.Meter; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/QueuedChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/QueuedChannel.java index a995c1544..53e139d01 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/QueuedChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/QueuedChannel.java @@ -105,7 +105,7 @@ final class QueuedChannel implements Channel { this.maxQueueSize = maxQueueSize; // Lazily create the counter. Unlike meters, timers, and histograms, counters cannot be ignored when they have // zero interactions because they support both increment and decrement operations. - this.queueSizeCounter = Suppliers.memoize(metrics::requestsQueued); + this.queueSizeCounter = Suppliers.memoize(metrics::requestsQueued)::get; this.queuedTime = metrics.requestQueuedTime(); this.limitedResultSupplier = () -> Futures.immediateFailedFuture(new SafeRuntimeException( "Unable to make a request (queue is full)", SafeArg.of("maxQueueSize", maxQueueSize))); @@ -496,8 +496,8 @@ private static final class MemoizedQueuedChannelInstrumentation implements Queue private final Supplier requestQueuedTimeSupplier; MemoizedQueuedChannelInstrumentation(QueuedChannelInstrumentation delegate) { - this.requestsQueuedSupplier = Suppliers.memoize(delegate::requestsQueued); - this.requestQueuedTimeSupplier = Suppliers.memoize(delegate::requestQueuedTime); + this.requestsQueuedSupplier = Suppliers.memoize(delegate::requestsQueued)::get; + this.requestQueuedTimeSupplier = Suppliers.memoize(delegate::requestQueuedTime)::get; } @Override diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/RetryingChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/RetryingChannel.java index ab47c89af..10af49004 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/RetryingChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/RetryingChannel.java @@ -83,7 +83,7 @@ final class RetryingChannel implements EndpointChannel { .setNameFormat(SCHEDULER_NAME + "-%d") .setDaemon(true) .build(), - SCHEDULER_NAME))); + SCHEDULER_NAME)))::get; @SuppressWarnings("UnnecessaryLambda") // no allocations private static final BiFunction qosThrowable = (_endpoint, response) -> @@ -175,12 +175,12 @@ private RetryingChannel( .requestRetry() .channelName(channelName) .reason("serverError") - .build()); + .build())::get; this.retryDueToQosResponse = Suppliers.memoize(() -> dialogueClientMetrics .requestRetry() .channelName(channelName) .reason("qosResponse") - .build()); + .build())::get; this.retryDueToThrowable = throwable -> dialogueClientMetrics .requestRetry() .channelName(channelName) diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/StickyEndpointChannels.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/StickyEndpointChannels.java index 51ec0b199..d63348fca 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/StickyEndpointChannels.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/StickyEndpointChannels.java @@ -16,9 +16,9 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Suppliers; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.ListenableFuture; import com.palantir.dialogue.Channel; @@ -80,7 +80,7 @@ private static final class Sticky implements EndpointChannelFactory, Channel { private Sticky(ImmutableList channels, BalancedScoreTracker tracker) { this.channels = channels; - this.getSingleBestChannel = Suppliers.memoize(tracker::getSingleBestChannelByScore); + this.getSingleBestChannel = Suppliers.memoize(tracker::getSingleBestChannelByScore)::get; } @Override diff --git a/dialogue-core/src/main/java/com/palantir/dialogue/core/TimingEndpointChannel.java b/dialogue-core/src/main/java/com/palantir/dialogue/core/TimingEndpointChannel.java index 9384d76c7..3296c1502 100644 --- a/dialogue-core/src/main/java/com/palantir/dialogue/core/TimingEndpointChannel.java +++ b/dialogue-core/src/main/java/com/palantir/dialogue/core/TimingEndpointChannel.java @@ -17,8 +17,8 @@ package com.palantir.dialogue.core; import com.codahale.metrics.Timer; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.base.Suppliers; +import com.google.common.base.Ticker; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.RateLimiter; @@ -59,13 +59,13 @@ final class TimingEndpointChannel implements EndpointChannel { .serviceName(endpoint.serviceName()) .endpoint(endpoint.endpointName()) .status("success") - .build()); + .build())::get; this.failureTimer = Suppliers.memoize(() -> metrics.response() .channelName(channelName) .serviceName(endpoint.serviceName()) .endpoint(endpoint.endpointName()) .status("failure") - .build()); + .build())::get; } static EndpointChannel create(Config cf, EndpointChannel delegate, Endpoint endpoint) { diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannelTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannelTest.java index d7fbe09b8..470022a86 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannelTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/BalancedNodeSelectionStrategyChannelTest.java @@ -23,7 +23,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/HostMetricsChannelTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/HostMetricsChannelTest.java index b9f6e08d5..a40279828 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/HostMetricsChannelTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/HostMetricsChannelTest.java @@ -20,7 +20,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import com.palantir.conjure.java.client.config.ClientConfiguration; diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/NodeSelectionStrategyChannelTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/NodeSelectionStrategyChannelTest.java index 4f4e93d44..2d8550368 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/NodeSelectionStrategyChannelTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/NodeSelectionStrategyChannelTest.java @@ -23,7 +23,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.palantir.dialogue.Request; diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannelTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannelTest.java index 3520b6899..cbf7aad75 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannelTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/PinUntilErrorNodeSelectionStrategyChannelTest.java @@ -22,7 +22,7 @@ import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.when; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/StickyEndpointChannelsTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/StickyEndpointChannelsTest.java index b1eadea52..2f25e6c54 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/StickyEndpointChannelsTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/StickyEndpointChannelsTest.java @@ -18,6 +18,7 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.FutureCallback; import com.google.common.util.concurrent.Futures; @@ -57,7 +58,12 @@ class StickyEndpointChannelsTest { private StickyEndpointChannels.Builder builder() { return StickyEndpointChannels.builder() .random(new Random(11)) - .ticker(ticker::getAndIncrement) + .ticker(new Ticker() { + @Override + public long read() { + return ticker.getAndIncrement(); + } + }) .taggedMetricRegistry(new DefaultTaggedMetricRegistry()) .channelName("channelName"); } diff --git a/dialogue-core/src/test/java/com/palantir/dialogue/core/TimingEndpointChannelTest.java b/dialogue-core/src/test/java/com/palantir/dialogue/core/TimingEndpointChannelTest.java index 16d994898..c13489c62 100644 --- a/dialogue-core/src/test/java/com/palantir/dialogue/core/TimingEndpointChannelTest.java +++ b/dialogue-core/src/test/java/com/palantir/dialogue/core/TimingEndpointChannelTest.java @@ -21,7 +21,7 @@ import static org.mockito.Mockito.when; import com.codahale.metrics.Timer; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.collect.ListMultimap; import com.google.common.collect.MultimapBuilder; import com.google.common.util.concurrent.Futures; diff --git a/dialogue-jmh/src/main/java/com/palantir/dialogue/core/NodeSelectionBenchmark.java b/dialogue-jmh/src/main/java/com/palantir/dialogue/core/NodeSelectionBenchmark.java index df62242dc..89e38b27d 100644 --- a/dialogue-jmh/src/main/java/com/palantir/dialogue/core/NodeSelectionBenchmark.java +++ b/dialogue-jmh/src/main/java/com/palantir/dialogue/core/NodeSelectionBenchmark.java @@ -16,7 +16,7 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; +import com.google.common.base.Ticker; import com.google.common.collect.ImmutableList; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; diff --git a/dialogue-serde/build.gradle b/dialogue-serde/build.gradle index 89cf0ff49..5521af7f3 100644 --- a/dialogue-serde/build.gradle +++ b/dialogue-serde/build.gradle @@ -24,7 +24,6 @@ dependencies { implementation 'com.palantir.conjure.java:conjure-lib' implementation 'com.palantir.safe-logging:logger' implementation 'com.palantir.safe-logging:safe-logging' - implementation 'com.github.ben-manes.caffeine:caffeine' testImplementation project(':dialogue-test-common') testImplementation project(':dialogue-example') diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java index b738b8529..5a01c2a90 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/ConjureBodySerDe.java @@ -16,10 +16,11 @@ package com.palantir.conjure.java.dialogue.serde; -import com.github.benmanes.caffeine.cache.Caffeine; -import com.github.benmanes.caffeine.cache.CaffeineSpec; -import com.github.benmanes.caffeine.cache.LoadingCache; import com.google.common.base.Suppliers; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheBuilderSpec; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.net.HttpHeaders; @@ -57,7 +58,11 @@ final class ConjureBodySerDe implements BodySerDe { private final Deserializer binaryInputStreamDeserializer; private final Deserializer> optionalBinaryInputStreamDeserializer; private final Deserializer emptyBodyDeserializer; + + @SuppressWarnings("checkstyle:IllegalType") private final LoadingCache> serializers; + + @SuppressWarnings("checkstyle:IllegalType") private final LoadingCache> deserializers; /** @@ -69,7 +74,7 @@ final class ConjureBodySerDe implements BodySerDe { List rawEncodings, ErrorDecoder errorDecoder, EmptyContainerDeserializer emptyContainerDeserializer, - CaffeineSpec cacheSpec) { + CacheBuilderSpec cacheSpec) { List encodings = decorateEncodings(rawEncodings); this.encodingsSortedByWeight = sortByWeight(encodings); Preconditions.checkArgument(encodings.size() > 0, "At least one Encoding is required"); @@ -87,11 +92,19 @@ final class ConjureBodySerDe implements BodySerDe { this.emptyBodyDeserializer = new EmptyBodyDeserializer(errorDecoder); // Class unloading: Not supported, Jackson keeps strong references to the types // it sees: https://github.com/FasterXML/jackson-databind/issues/489 - this.serializers = Caffeine.from(cacheSpec) - .build(type -> new EncodingSerializerRegistry<>(defaultEncoding, TypeMarker.of(type))); - this.deserializers = Caffeine.from(cacheSpec) - .build(type -> new EncodingDeserializerRegistry<>( - encodingsSortedByWeight, errorDecoder, emptyContainerDeserializer, TypeMarker.of(type))); + this.serializers = CacheBuilder.from(cacheSpec).build(new CacheLoader<>() { + @Override + public Serializer load(Type type) { + return new EncodingSerializerRegistry<>(defaultEncoding, TypeMarker.of(type)); + } + }); + this.deserializers = CacheBuilder.from(cacheSpec).build(new CacheLoader<>() { + @Override + public Deserializer load(Type type) { + return new EncodingDeserializerRegistry<>( + encodingsSortedByWeight, errorDecoder, emptyContainerDeserializer, TypeMarker.of(type)); + } + }); } private static List decorateEncodings(List input) { @@ -113,13 +126,13 @@ private ImmutableList sortByWeight(List encodings) { @Override @SuppressWarnings("unchecked") public Serializer serializer(TypeMarker token) { - return (Serializer) serializers.get(token.getType()); + return (Serializer) serializers.getUnchecked(token.getType()); } @Override @SuppressWarnings("unchecked") public Deserializer deserializer(TypeMarker token) { - return (Deserializer) deserializers.get(token.getType()); + return (Deserializer) deserializers.getUnchecked(token.getType()); } @Override @@ -235,7 +248,7 @@ private static final class EncodingDeserializerRegistry implements Deserializ .collect(ImmutableList.toImmutableList()); this.errorDecoder = errorDecoder; this.token = token; - this.emptyInstance = Suppliers.memoize(() -> empty.tryGetEmptyInstance(token)); + this.emptyInstance = Suppliers.memoize(() -> empty.tryGetEmptyInstance(token))::get; // Encodings are applied to the accept header in the order of preference based on the provided list. this.acceptValue = Optional.of(encodings.stream().map(Encoding::getContentType).collect(Collectors.joining(", "))); diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java index 3e4766fda..dd0a95e6c 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/DefaultConjureRuntime.java @@ -16,8 +16,8 @@ package com.palantir.conjure.java.dialogue.serde; -import com.github.benmanes.caffeine.cache.CaffeineSpec; import com.google.common.annotations.VisibleForTesting; +import com.google.common.cache.CacheBuilderSpec; import com.google.common.collect.ImmutableList; import com.google.errorprone.annotations.CanIgnoreReturnValue; import com.palantir.dialogue.BodySerDe; @@ -32,8 +32,8 @@ */ public final class DefaultConjureRuntime implements ConjureRuntime { @VisibleForTesting - static final CaffeineSpec DEFAULT_SERDE_CACHE_SPEC = - CaffeineSpec.parse("maximumSize=1000,expireAfterAccess=1m,weakKeys,weakValues"); + static final CacheBuilderSpec DEFAULT_SERDE_CACHE_SPEC = + CacheBuilderSpec.parse("maximumSize=1000,expireAfterAccess=1m,weakKeys,weakValues"); static final ImmutableList DEFAULT_ENCODINGS = ImmutableList.of( WeightedEncoding.of(Encodings.json(), .9), diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/Encodings.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/Encodings.java index 1e94c1a17..946f6a4ba 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/Encodings.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/Encodings.java @@ -33,7 +33,7 @@ public final class Encodings { private Encodings() {} private static final Supplier JSON_MAPPER = - Suppliers.memoize(() -> configure(ObjectMappers.newClientObjectMapper())); + Suppliers.memoize(() -> configure(ObjectMappers.newClientObjectMapper()))::get; private abstract static class AbstractJacksonEncoding implements Encoding { diff --git a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/LazilyInitializedEncoding.java b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/LazilyInitializedEncoding.java index 68f9846d9..363c89508 100644 --- a/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/LazilyInitializedEncoding.java +++ b/dialogue-serde/src/main/java/com/palantir/conjure/java/dialogue/serde/LazilyInitializedEncoding.java @@ -70,7 +70,7 @@ private static final class LazilyInitializedSerializer implements Serializer< private final Supplier> delegate; LazilyInitializedSerializer(Supplier> delegate) { - this.delegate = Suppliers.memoize(delegate::get); + this.delegate = Suppliers.memoize(delegate::get)::get; } @Override @@ -89,7 +89,7 @@ private static final class LazilyInitializedDeserializer implements Deseriali private final Supplier> delegate; LazilyInitializedDeserializer(Supplier> delegate) { - this.delegate = Suppliers.memoize(delegate::get); + this.delegate = Suppliers.memoize(delegate::get)::get; } @Override diff --git a/dialogue-target/src/main/java/com/palantir/dialogue/Request.java b/dialogue-target/src/main/java/com/palantir/dialogue/Request.java index a0891180a..ccd7fd61c 100644 --- a/dialogue-target/src/main/java/com/palantir/dialogue/Request.java +++ b/dialogue-target/src/main/java/com/palantir/dialogue/Request.java @@ -297,7 +297,7 @@ private ListMultimap mutableHeaderParams() { Multimaps.newListMultimap(new TreeMap<>(String.CASE_INSENSITIVE_ORDER), MAP_VALUE_FACTORY); if (!headerParams.isEmpty()) { // Outperforms mutable.putAll(headerParams) - headerParams.forEach(mutable::put); + headerParams.entries().forEach(e -> mutable.put(e.getKey(), e.getValue())); } headerParams = mutable; } diff --git a/simulation/src/main/java/com/palantir/dialogue/core/Simulation.java b/simulation/src/main/java/com/palantir/dialogue/core/Simulation.java index 74b9a491e..0449f70d2 100644 --- a/simulation/src/main/java/com/palantir/dialogue/core/Simulation.java +++ b/simulation/src/main/java/com/palantir/dialogue/core/Simulation.java @@ -16,7 +16,6 @@ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; import com.google.common.util.concurrent.ListeningScheduledExecutorService; import com.palantir.logsafe.logger.SafeLogger; import com.palantir.logsafe.logger.SafeLoggerFactory; @@ -45,7 +44,7 @@ final class Simulation { this.listenableExecutor = new ExternalDeterministicScheduler(deterministicExecutor, ticker); } - public Ticker clock() { + public TestCaffeineTicker clock() { return ticker; // read only! } diff --git a/simulation/src/main/java/com/palantir/dialogue/core/TestCaffeineTicker.java b/simulation/src/main/java/com/palantir/dialogue/core/TestCaffeineTicker.java index 2d1fbc2a7..65e9c8b2e 100644 --- a/simulation/src/main/java/com/palantir/dialogue/core/TestCaffeineTicker.java +++ b/simulation/src/main/java/com/palantir/dialogue/core/TestCaffeineTicker.java @@ -15,12 +15,12 @@ */ package com.palantir.dialogue.core; -import com.github.benmanes.caffeine.cache.Ticker; import com.palantir.logsafe.SafeArg; import com.palantir.logsafe.exceptions.SafeIllegalStateException; import java.time.Duration; -final class TestCaffeineTicker implements Ticker { +final class TestCaffeineTicker extends com.google.common.base.Ticker + implements com.github.benmanes.caffeine.cache.Ticker { private long nanos = 0; @Override diff --git a/simulation/src/test/java/com/palantir/dialogue/core/SimulationTest.java b/simulation/src/test/java/com/palantir/dialogue/core/SimulationTest.java index 12689661f..f42403964 100644 --- a/simulation/src/test/java/com/palantir/dialogue/core/SimulationTest.java +++ b/simulation/src/test/java/com/palantir/dialogue/core/SimulationTest.java @@ -641,7 +641,7 @@ private Function respond500AtRate(double rate) { private Supplier> servers(SimulationServer... values) { return Suppliers.memoize( - () -> Arrays.stream(values).collect(Collectors.toMap(SimulationServer::toString, Function.identity()))); + () -> Arrays.stream(values).collect(Collectors.toMap(SimulationServer::toString, Function.identity())))::get; } /** Use the {@link #beginAt} method to simulate live-reloads. */ diff --git a/versions.lock b/versions.lock index d315b40c8..47a462904 100644 --- a/versions.lock +++ b/versions.lock @@ -8,12 +8,12 @@ com.fasterxml.jackson.datatype:jackson-datatype-guava:2.18.2 (1 constraints: 831 com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.18.2 (1 constraints: 831caaa4) com.fasterxml.jackson.datatype:jackson-datatype-joda:2.18.2 (1 constraints: 831caaa4) com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.18.2 (1 constraints: 831caaa4) -com.github.ben-manes.caffeine:caffeine:3.2.0 (3 constraints: 08289433) +com.github.ben-manes.caffeine:caffeine:3.2.0 (2 constraints: bb17f94d) com.google.auto:auto-common:1.2.1 (1 constraints: 17120ffb) com.google.code.findbugs:jsr305:3.0.2 (14 constraints: 49e26143) -com.google.errorprone:error_prone_annotations:2.7.1 (18 constraints: 8420df82) +com.google.errorprone:error_prone_annotations:2.7.1 (17 constraints: 07102aec) com.google.guava:failureaccess:1.0.2 (1 constraints: 150ae2b4) -com.google.guava:guava:33.4.0-jre (18 constraints: 603f58d1) +com.google.guava:guava:33.4.0-android (17 constraints: 172fc441) com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava (1 constraints: bd17c918) com.google.j2objc:j2objc-annotations:3.0.0 (1 constraints: 150aeab4) com.palantir.common:streams:2.4.0 (1 constraints: 08050136) @@ -30,29 +30,28 @@ com.palantir.javapoet:javapoet:0.6.0 (2 constraints: c81064d1) com.palantir.nylon:nylon-threads:0.4.0 (1 constraints: 0c10fa91) com.palantir.refreshable:refreshable:2.5.0 (2 constraints: f1188fb2) com.palantir.ri:resource-identifier:2.8.0 (2 constraints: fc1495b7) -com.palantir.safe-logging:logger:3.7.0 (13 constraints: 99d0b80e) +com.palantir.safe-logging:logger:3.7.0 (12 constraints: 4ec09cd5) com.palantir.safe-logging:logger-slf4j:3.7.0 (1 constraints: 050e6842) com.palantir.safe-logging:logger-spi:3.7.0 (2 constraints: 191ea27b) -com.palantir.safe-logging:preconditions:3.7.0 (19 constraints: 4e351810) -com.palantir.safe-logging:safe-logging:3.7.0 (18 constraints: da26b0dc) +com.palantir.safe-logging:preconditions:3.7.0 (18 constraints: 03250acd) +com.palantir.safe-logging:safe-logging:3.7.0 (17 constraints: 8f168d3a) com.palantir.safethreadlocalrandom:safe-thread-local-random:0.3.0 (1 constraints: 0505f435) com.palantir.tokens:auth-tokens:3.18.0 (3 constraints: 2628868e) com.palantir.tracing:tracing:6.20.0 (2 constraints: 5416db0d) com.palantir.tracing:tracing-api:6.20.0 (2 constraints: 0912eb17) com.palantir.tritium:tritium-api:0.96.0 (2 constraints: 3f1f48be) -com.palantir.tritium:tritium-caffeine:0.96.0 (1 constraints: 4105553b) com.palantir.tritium:tritium-core:0.96.0 (1 constraints: 47105ea2) com.palantir.tritium:tritium-ids:0.96.0 (1 constraints: d20fb696) -com.palantir.tritium:tritium-metrics:0.96.0 (2 constraints: c11598e4) -com.palantir.tritium:tritium-registry:0.96.0 (5 constraints: ab561c1f) +com.palantir.tritium:tritium-metrics:0.96.0 (1 constraints: 4105553b) +com.palantir.tritium:tritium-registry:0.96.0 (4 constraints: 2b46fa8f) com.squareup:javapoet:1.13.0 (1 constraints: f50b65f7) -io.dropwizard.metrics:metrics-core:4.2.30 (5 constraints: 5553f0f5) +io.dropwizard.metrics:metrics-core:4.2.30 (4 constraints: d3425911) javax.annotation:javax.annotation-api:1.3.2 (1 constraints: 0805fb35) joda-time:joda-time:2.12.7 (1 constraints: 2f16b1f1) org.apache.httpcomponents.client5:httpclient5:5.3.1 (1 constraints: 0b050e36) org.apache.httpcomponents.core5:httpcore5:5.3.3 (3 constraints: a42a81aa) org.apache.httpcomponents.core5:httpcore5-h2:5.3.3 (1 constraints: 3f130d3c) -org.checkerframework:checker-qual:3.43.0 (4 constraints: a237011e) +org.checkerframework:checker-qual:3.43.0 (3 constraints: 2727263b) org.derive4j:derive4j-annotation:1.1.1 (1 constraints: 0505f435) org.eclipse.collections:eclipse-collections:11.1.0 (1 constraints: 1b108aa9) org.eclipse.collections:eclipse-collections-api:11.1.0 (2 constraints: f8229c26) diff --git a/versions.props b/versions.props index fb7c34b88..e307a6258 100644 --- a/versions.props +++ b/versions.props @@ -1,7 +1,7 @@ com.fasterxml.jackson.*:* = 2.18.2 com.fasterxml.jackson.core:jackson-databind = 2.18.2 com.google.code.findbugs:jsr305 = 3.0.2 -com.google.guava:guava = 33.4.0-jre +com.google.guava:guava = 33.4.0-android com.google.testing.compile:compile-testing = 0.21.0 com.palantir.common:streams = 2.4.0 com.palantir.conjure.java.api:* = 2.58.0