@Test void retryOnlyOnRevisionNotFoundException() { when(delegate.normalizeRevision(any(), any(), any())) .thenReturn(exceptionallyCompletedFuture(new ProjectNotFoundException())); assertThatThrownBy(() -> dogma.normalizeRevision("foo", "bar", Revision.HEAD).join()) .isInstanceOf(CompletionException.class) .hasCauseInstanceOf(ProjectNotFoundException.class); verify(delegate, times(1)).normalizeRevision("foo", "bar", Revision.HEAD); verifyNoMoreInteractions(delegate); }
@Override public CompletableFuture<Revision> normalizeRevision( String projectName, String repositoryName, Revision revision) { return executeWithRetries( new Supplier<CompletableFuture<Revision>>() { @Override public CompletableFuture<Revision> get() { return delegate.normalizeRevision(projectName, repositoryName, revision); } @Override public String toString() { return "normalizeRevision(" + projectName + ", " + repositoryName + ", " + revision + ')'; } }, (res, cause) -> { if (cause != null) { return handleRevisionNotFound(projectName, repositoryName, revision, cause); } if (revision.isRelative()) { final Revision headRevision = res.forward(-(revision.major() + 1)); return !updateLatestKnownRevision(projectName, repositoryName, headRevision); } updateLatestKnownRevision(projectName, repositoryName, revision); return false; }); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public CompletableFuture<Revision> normalizeRevision( String projectName, String repositoryName, Revision revision) { return executeWithRetries( new Supplier<CompletableFuture<Revision>>() { @Override public CompletableFuture<Revision> get() { return delegate.normalizeRevision(projectName, repositoryName, revision); } @Override public String toString() { return "normalizeRevision(" + projectName + ", " + repositoryName + ", " + revision + ')'; } }, (res, cause) -> { if (cause != null) { return handleRevisionNotFound(projectName, repositoryName, revision, cause); } if (revision.isRelative()) { final Revision headRevision = res.forward(-(revision.major() + 1)); return !updateLatestKnownRevision(projectName, repositoryName, headRevision); } updateLatestKnownRevision(projectName, repositoryName, revision); return false; }); } }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public CompletableFuture<Revision> normalizeRevision( String projectName, String repositoryName, Revision revision) { return executeWithRetries( new Supplier<CompletableFuture<Revision>>() { @Override public CompletableFuture<Revision> get() { return delegate.normalizeRevision(projectName, repositoryName, revision); } @Override public String toString() { return "normalizeRevision(" + projectName + ", " + repositoryName + ", " + revision + ')'; } }, (res, cause) -> { if (cause != null) { return handleRevisionNotFound(projectName, repositoryName, revision, cause); } if (revision.isRelative()) { final Revision headRevision = res.forward(-(revision.major() + 1)); return !updateLatestKnownRevision(projectName, repositoryName, headRevision); } updateLatestKnownRevision(projectName, repositoryName, revision); return false; }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public CompletableFuture<Revision> normalizeRevision( String projectName, String repositoryName, Revision revision) { return executeWithRetries( new Supplier<CompletableFuture<Revision>>() { @Override public CompletableFuture<Revision> get() { return delegate.normalizeRevision(projectName, repositoryName, revision); } @Override public String toString() { return "normalizeRevision(" + projectName + ", " + repositoryName + ", " + revision + ')'; } }, (res, cause) -> { if (cause != null) { return handleRevisionNotFound(projectName, repositoryName, revision, cause); } if (revision.isRelative()) { final Revision headRevision = res.forward(-(revision.major() + 1)); return !updateLatestKnownRevision(projectName, repositoryName, headRevision); } updateLatestKnownRevision(projectName, repositoryName, revision); return false; }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); @Override CompletableFuture<Void> createProject(String projectName); @Override CompletableFuture<Void> removeProject(String projectName); @Override CompletableFuture<Void> purgeProject(String projectName); @Override CompletableFuture<Void> unremoveProject(String projectName); @Override CompletableFuture<Set<String>> listProjects(); @Override CompletableFuture<Set<String>> listRemovedProjects(); @Override CompletableFuture<Void> createRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> removeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> purgeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> unremoveRepository(String projectName, String repositoryName); @Override CompletableFuture<Map<String, RepositoryInfo>> listRepositories(String projectName); @Override CompletableFuture<Set<String>> listRemovedRepositories(String projectName); @Override CompletableFuture<Revision> normalizeRevision(
            String projectName, String repositoryName, Revision revision); @Override CompletableFuture<Map<String, EntryType>> listFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<Entry<T>> getFile(
            String projectName, String repositoryName, Revision revision, Query<T> query); @Override CompletableFuture<Map<String, Entry<?>>> getFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<MergedEntry<T>> mergeFiles(
            String projectName, String repositoryName, Revision revision,
            MergeQuery<T> mergeQuery); @Override CompletableFuture<List<Commit>> getHistory(
            String projectName, String repositoryName, Revision from,
            Revision to, String pathPattern); @Override CompletableFuture<Change<T>> getDiff(
            String projectName, String repositoryName, Revision from, Revision to, Query<T> query); @Override CompletableFuture<List<Change<?>>> getDiffs(
            String projectName, String repositoryName, Revision from, Revision to, String pathPattern); @Override CompletableFuture<List<Change<?>>> getPreviewDiffs(
            String projectName, String repositoryName, Revision baseRevision,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            String summary, String detail, Markup markup, Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            Author author, String summary, String detail, Markup markup,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<Revision> watchRepository(
            String projectName, String repositoryName, Revision lastKnownRevision,
            String pathPattern, long timeoutMillis); @Override CompletableFuture<Entry<T>> watchFile(
            String projectName, String repositoryName, Revision lastKnownRevision,
            Query<T> query, long timeoutMillis); }
ReplicationLagTolerantCentralDogma extends AbstractCentralDogma { @Override public CompletableFuture<Revision> normalizeRevision( String projectName, String repositoryName, Revision revision) { return executeWithRetries( new Supplier<CompletableFuture<Revision>>() { @Override public CompletableFuture<Revision> get() { return delegate.normalizeRevision(projectName, repositoryName, revision); } @Override public String toString() { return "normalizeRevision(" + projectName + ", " + repositoryName + ", " + revision + ')'; } }, (res, cause) -> { if (cause != null) { return handleRevisionNotFound(projectName, repositoryName, revision, cause); } if (revision.isRelative()) { final Revision headRevision = res.forward(-(revision.major() + 1)); return !updateLatestKnownRevision(projectName, repositoryName, headRevision); } updateLatestKnownRevision(projectName, repositoryName, revision); return false; }); } ReplicationLagTolerantCentralDogma(ScheduledExecutorService executor, CentralDogma delegate,
                                              int maxRetries, long retryIntervalMillis,
                                              Supplier<?> currentReplicaHintSupplier); @Override CompletableFuture<Void> createProject(String projectName); @Override CompletableFuture<Void> removeProject(String projectName); @Override CompletableFuture<Void> purgeProject(String projectName); @Override CompletableFuture<Void> unremoveProject(String projectName); @Override CompletableFuture<Set<String>> listProjects(); @Override CompletableFuture<Set<String>> listRemovedProjects(); @Override CompletableFuture<Void> createRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> removeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> purgeRepository(String projectName, String repositoryName); @Override CompletableFuture<Void> unremoveRepository(String projectName, String repositoryName); @Override CompletableFuture<Map<String, RepositoryInfo>> listRepositories(String projectName); @Override CompletableFuture<Set<String>> listRemovedRepositories(String projectName); @Override CompletableFuture<Revision> normalizeRevision(
            String projectName, String repositoryName, Revision revision); @Override CompletableFuture<Map<String, EntryType>> listFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<Entry<T>> getFile(
            String projectName, String repositoryName, Revision revision, Query<T> query); @Override CompletableFuture<Map<String, Entry<?>>> getFiles(
            String projectName, String repositoryName, Revision revision, String pathPattern); @Override CompletableFuture<MergedEntry<T>> mergeFiles(
            String projectName, String repositoryName, Revision revision,
            MergeQuery<T> mergeQuery); @Override CompletableFuture<List<Commit>> getHistory(
            String projectName, String repositoryName, Revision from,
            Revision to, String pathPattern); @Override CompletableFuture<Change<T>> getDiff(
            String projectName, String repositoryName, Revision from, Revision to, Query<T> query); @Override CompletableFuture<List<Change<?>>> getDiffs(
            String projectName, String repositoryName, Revision from, Revision to, String pathPattern); @Override CompletableFuture<List<Change<?>>> getPreviewDiffs(
            String projectName, String repositoryName, Revision baseRevision,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            String summary, String detail, Markup markup, Iterable<? extends Change<?>> changes); @Override CompletableFuture<PushResult> push(
            String projectName, String repositoryName, Revision baseRevision,
            Author author, String summary, String detail, Markup markup,
            Iterable<? extends Change<?>> changes); @Override CompletableFuture<Revision> watchRepository(
            String projectName, String repositoryName, Revision lastKnownRevision,
            String pathPattern, long timeoutMillis); @Override CompletableFuture<Entry<T>> watchFile(
            String projectName, String repositoryName, Revision lastKnownRevision,
            Query<T> query, long timeoutMillis);  }