blob: 84267bee433e47ac4803d98b7f56b2311a0aaf1a [file] [log] [blame]
/*
* Copyright 2018 The gRPC Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.grpc.internal;
import com.google.common.base.MoreObjects;
import com.google.common.base.Objects;
import com.google.common.collect.ImmutableSet;
import io.grpc.Status.Code;
import java.util.Set;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;
/**
* Retry policy data object.
*/
@Immutable
final class RetryPolicy {
final int maxAttempts;
final long initialBackoffNanos;
final long maxBackoffNanos;
final double backoffMultiplier;
@Nullable
final Long perAttemptRecvTimeoutNanos;
final Set<Code> retryableStatusCodes;
/**
* The caller is supposed to have validated the arguments and handled throwing exception or
* logging warnings already, so we avoid repeating args check here.
*/
RetryPolicy(
int maxAttempts,
long initialBackoffNanos,
long maxBackoffNanos,
double backoffMultiplier,
@Nullable Long perAttemptRecvTimeoutNanos,
@Nonnull Set<Code> retryableStatusCodes) {
this.maxAttempts = maxAttempts;
this.initialBackoffNanos = initialBackoffNanos;
this.maxBackoffNanos = maxBackoffNanos;
this.backoffMultiplier = backoffMultiplier;
this.perAttemptRecvTimeoutNanos = perAttemptRecvTimeoutNanos;
this.retryableStatusCodes = ImmutableSet.copyOf(retryableStatusCodes);
}
@Override
public int hashCode() {
return Objects.hashCode(
maxAttempts,
initialBackoffNanos,
maxBackoffNanos,
backoffMultiplier,
perAttemptRecvTimeoutNanos,
retryableStatusCodes);
}
@Override
public boolean equals(Object other) {
if (!(other instanceof RetryPolicy)) {
return false;
}
RetryPolicy that = (RetryPolicy) other;
return this.maxAttempts == that.maxAttempts
&& this.initialBackoffNanos == that.initialBackoffNanos
&& this.maxBackoffNanos == that.maxBackoffNanos
&& Double.compare(this.backoffMultiplier, that.backoffMultiplier) == 0
&& Objects.equal(this.perAttemptRecvTimeoutNanos, that.perAttemptRecvTimeoutNanos)
&& Objects.equal(this.retryableStatusCodes, that.retryableStatusCodes);
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("maxAttempts", maxAttempts)
.add("initialBackoffNanos", initialBackoffNanos)
.add("maxBackoffNanos", maxBackoffNanos)
.add("backoffMultiplier", backoffMultiplier)
.add("perAttemptRecvTimeoutNanos", perAttemptRecvTimeoutNanos)
.add("retryableStatusCodes", retryableStatusCodes)
.toString();
}
}