RetryHelper: Support configuring timeout on a per-call basis

Change-Id: I8f9f96fc12d61b9b017f451bba0abb25275bbc50
This commit is contained in:
Dave Borowitz
2017-08-07 14:14:48 -04:00
parent c9d84f7404
commit c731351eaa

View File

@@ -14,6 +14,7 @@
package com.google.gerrit.server.update; package com.google.gerrit.server.update;
import static com.google.common.base.MoreObjects.firstNonNull;
import static java.util.concurrent.TimeUnit.MILLISECONDS; import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS; import static java.util.concurrent.TimeUnit.SECONDS;
@@ -21,7 +22,6 @@ import com.github.rholder.retry.RetryException;
import com.github.rholder.retry.RetryListener; import com.github.rholder.retry.RetryListener;
import com.github.rholder.retry.RetryerBuilder; import com.github.rholder.retry.RetryerBuilder;
import com.github.rholder.retry.StopStrategies; import com.github.rholder.retry.StopStrategies;
import com.github.rholder.retry.StopStrategy;
import com.github.rholder.retry.WaitStrategies; import com.github.rholder.retry.WaitStrategies;
import com.github.rholder.retry.WaitStrategy; import com.github.rholder.retry.WaitStrategy;
import com.google.auto.value.AutoValue; import com.google.auto.value.AutoValue;
@@ -33,6 +33,7 @@ import com.google.gerrit.server.git.LockFailureException;
import com.google.gerrit.server.notedb.NotesMigration; import com.google.gerrit.server.notedb.NotesMigration;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import java.time.Duration;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
import org.eclipse.jgit.lib.Config; import org.eclipse.jgit.lib.Config;
@@ -61,10 +62,15 @@ public class RetryHelper {
@Nullable @Nullable
abstract RetryListener listener(); abstract RetryListener listener();
@Nullable
abstract Duration timeout();
@AutoValue.Builder @AutoValue.Builder
public abstract static class Builder { public abstract static class Builder {
public abstract Builder listener(RetryListener listener); public abstract Builder listener(RetryListener listener);
public abstract Builder timeout(Duration timeout);
public abstract Options build(); public abstract Options build();
} }
} }
@@ -79,7 +85,7 @@ public class RetryHelper {
private final NotesMigration migration; private final NotesMigration migration;
private final BatchUpdate.Factory updateFactory; private final BatchUpdate.Factory updateFactory;
private final StopStrategy stopStrategy; private final Duration defaultTimeout;
private final WaitStrategy waitStrategy; private final WaitStrategy waitStrategy;
@Inject @Inject
@@ -91,10 +97,9 @@ public class RetryHelper {
this.migration = migration; this.migration = migration;
this.updateFactory = this.updateFactory =
new BatchUpdate.Factory(migration, reviewDbBatchUpdateFactory, noteDbBatchUpdateFactory); new BatchUpdate.Factory(migration, reviewDbBatchUpdateFactory, noteDbBatchUpdateFactory);
this.stopStrategy = this.defaultTimeout =
StopStrategies.stopAfterDelay( Duration.ofMillis(
cfg.getTimeUnit("noteDb", null, "retryTimeout", SECONDS.toMillis(20), MILLISECONDS), cfg.getTimeUnit("noteDb", null, "retryTimeout", SECONDS.toMillis(20), MILLISECONDS));
MILLISECONDS);
this.waitStrategy = this.waitStrategy =
WaitStrategies.join( WaitStrategies.join(
WaitStrategies.exponentialWait( WaitStrategies.exponentialWait(
@@ -112,7 +117,9 @@ public class RetryHelper {
RetryerBuilder<T> builder = RetryerBuilder.newBuilder(); RetryerBuilder<T> builder = RetryerBuilder.newBuilder();
if (migration.disableChangeReviewDb()) { if (migration.disableChangeReviewDb()) {
builder builder
.withStopStrategy(stopStrategy) .withStopStrategy(
StopStrategies.stopAfterDelay(
firstNonNull(opts.timeout(), defaultTimeout).toMillis(), MILLISECONDS))
.withWaitStrategy(waitStrategy) .withWaitStrategy(waitStrategy)
.retryIfException(RetryHelper::isLockFailure); .retryIfException(RetryHelper::isLockFailure);
if (opts.listener() != null) { if (opts.listener() != null) {