use of com.couchbase.client.core.cnc.events.config.IndividualGlobalConfigLoadFailedEvent in project couchbase-jvm-clients by couchbase.
the class DefaultConfigurationProvider method loadAndRefreshGlobalConfig.
@Override
public Mono<Void> loadAndRefreshGlobalConfig() {
return Mono.defer(() -> {
if (!shutdown.get()) {
globalConfigLoadInProgress = true;
boolean tls = core.context().environment().securityConfig().tlsEnabled();
int kvPort = tls ? DEFAULT_KV_TLS_PORT : DEFAULT_KV_PORT;
final AtomicBoolean hasErrored = new AtomicBoolean();
return Flux.range(1, Math.min(MAX_PARALLEL_LOADERS, currentSeedNodes().size())).flatMap(index -> Flux.fromIterable(currentSeedNodes()).take(Math.min(index, currentSeedNodes().size())).last().flatMap(seed -> {
long start = System.nanoTime();
if (!currentSeedNodes().contains(seed)) {
// node we are about to load is still part of the list.
return Mono.empty();
}
NodeIdentifier identifier = new NodeIdentifier(seed.address(), seed.clusterManagerPort().orElse(DEFAULT_MANAGER_PORT));
return globalLoader.load(identifier, seed.kvPort().orElse(kvPort)).doOnError(throwable -> core.context().environment().eventBus().publish(new IndividualGlobalConfigLoadFailedEvent(Duration.ofNanos(System.nanoTime() - start), core.context(), throwable, seed.address())));
}).retryWhen(Retry.from(companion -> companion.flatMap(rs -> {
Throwable f = rs.failure();
if (shutdown.get()) {
return Mono.error(new AlreadyShutdownException());
}
if (f instanceof UnsupportedConfigMechanismException) {
return Mono.error(Exceptions.propagate(f));
}
Duration delay = Duration.ofMillis(1);
eventBus.publish(new GlobalConfigRetriedEvent(delay, core.context(), f));
return Mono.just(rs.totalRetries()).delayElement(delay, core.context().environment().scheduler());
}))).onErrorResume(throwable -> {
if (hasErrored.compareAndSet(false, true)) {
return Mono.error(throwable);
}
return Mono.empty();
})).take(1).switchIfEmpty(Mono.error(new ConfigException("Could not locate a single global configuration"))).map(ctx -> {
proposeGlobalConfig(ctx);
return ctx;
}).then(globalRefresher.start()).doOnTerminate(() -> globalConfigLoadInProgress = false);
} else {
return Mono.error(new AlreadyShutdownException());
}
});
}
Aggregations