use of com.hedera.mirror.monitor.NodeValidationProperties in project hedera-mirror-node by hashgraph.
the class TransactionPublisher method getClients.
private synchronized Flux<Client> getClients() {
NodeValidationProperties validationProperties = monitorProperties.getNodeValidation();
var configuredNodes = monitorProperties.getNodes();
Map<String, AccountId> nodeMap = configuredNodes.stream().collect(Collectors.toMap(NodeProperties::getEndpoint, p -> AccountId.fromString(p.getAccountId())));
this.nodes.addAll(configuredNodes);
Client client = toClient(nodeMap);
client.setMaxAttempts(validationProperties.getMaxAttempts());
client.setMaxBackoff(validationProperties.getMaxBackoff());
client.setMinBackoff(validationProperties.getMinBackoff());
client.setRequestTimeout(validationProperties.getRequestTimeout());
this.validationClient.set(client);
if (validationProperties.isEnabled() && nodeValidator.get() == null) {
int nodeCount = configuredNodes.size();
int parallelism = Math.min(nodeCount, validationProperties.getMaxThreads());
var scheduler = Schedulers.newParallel("validator", parallelism + 1);
var disposable = Flux.interval(Duration.ZERO, validationProperties.getFrequency(), scheduler).filter(// In case it's later disabled
i -> validationProperties.isEnabled()).flatMap(i -> Flux.fromIterable(configuredNodes)).parallel(parallelism).runOn(scheduler).map(this::validateNode).sequential().buffer(nodeCount).doOnNext(i -> log.info("{} of {} nodes are functional", nodes.size(), nodeCount)).doOnSubscribe(s -> log.info("Starting node validation")).onErrorContinue((e, i) -> log.error("Exception validating nodes: ", e)).subscribe();
nodeValidator.set(disposable);
}
return Flux.range(0, publishProperties.getClients()).flatMap(i -> Mono.defer(() -> Mono.just(toClient(nodeMap))));
}
Aggregations