+
+ @Override
+ public ListenableFuture<RpcResult<GetKnownClientsForAllShardsOutput>> getKnownClientsForAllShards(
+ final GetKnownClientsForAllShardsInput input) {
+ final ImmutableMap<ShardIdentifier, ListenableFuture<GetKnownClientsReply>> allShardReplies =
+ getAllShardLeadersClients();
+ return Futures.whenAllComplete(allShardReplies.values()).call(() -> processReplies(allShardReplies),
+ MoreExecutors.directExecutor());
+ }
+
+ private static RpcResult<GetKnownClientsForAllShardsOutput> processReplies(
+ final ImmutableMap<ShardIdentifier, ListenableFuture<GetKnownClientsReply>> allShardReplies) {
+ final Map<ShardResultKey, ShardResult> result = Maps.newHashMapWithExpectedSize(allShardReplies.size());
+ for (Entry<ShardIdentifier, ListenableFuture<GetKnownClientsReply>> entry : allShardReplies.entrySet()) {
+ final ListenableFuture<GetKnownClientsReply> future = entry.getValue();
+ final ShardResultBuilder builder = new ShardResultBuilder()
+ .setDataStoreType(entry.getKey().getDataStoreType())
+ .setShardName(entry.getKey().getShardName());
+
+ final GetKnownClientsReply reply;
+ try {
+ reply = Futures.getDone(future);
+ } catch (ExecutionException e) {
+ LOG.debug("Shard {} failed to answer", entry.getKey(), e);
+ final ShardResult sr = builder
+ .setSucceeded(Boolean.FALSE)
+ .setErrorMessage(e.getCause().getMessage())
+ .build();
+ result.put(sr.key(), sr);
+ continue;
+ }
+
+ final ShardResult sr = builder
+ .setSucceeded(Boolean.TRUE)
+ .addAugmentation(new ShardResult1Builder()
+ .setKnownClients(reply.getClients().stream()
+ .map(client -> new KnownClientsBuilder()
+ .setMember(client.getFrontendId().getMemberName().toYang())
+ .setType(client.getFrontendId().getClientType().toYang())
+ .setGeneration(client.getYangGeneration())
+ .build())
+ .collect(Collectors.toMap(KnownClients::key, Function.identity())))
+ .build())
+ .build();
+
+ result.put(sr.key(), sr);
+ }
+
+ return RpcResultBuilder.success(new GetKnownClientsForAllShardsOutputBuilder().setShardResult(result).build())
+ .build();
+ }
+
+ private static ChangeShardMembersVotingStatus toChangeShardMembersVotingStatus(final String shardName,
+ final List<MemberVotingState> memberVotingStatus) {