in api/service/src/main/java/org/apache/airavata/mft/api/handler/MFTApiHandler.java [156:236]
public void getTransferStateSummary(TransferStateApiRequest request, StreamObserver<TransferStateSummaryResponse> responseObserver) {
try {
TransferStateSummaryResponse.Builder stateBuilder = TransferStateSummaryResponse.newBuilder().setPercentage(0);
List<TransferState> transferStates = mftConsulClient.getTransferStates(request.getTransferId());
List<TransferState> mainTransferStatus = transferStates.stream().filter(st -> st.getChildId() == null)
.sorted((st1, st2) -> Long.compare(st2.getUpdateTimeMils(), st1.getUpdateTimeMils()))
.collect(Collectors.toList());
Optional<TransferApiRequest> processedTransferOp = mftConsulClient.getProcessedTransfer(request.getTransferId());
if (processedTransferOp.isPresent()) {
Set<String> completedFiles = new HashSet<>();
Set<String> failedFiles = new HashSet<>();
transferStates.stream().filter(st -> st.getChildId() != null).forEach(st -> {
if (st.getState().equals("COMPLETED")) {
completedFiles.add(st.getChildId());
} else if (st.getState().equals("FAILED")) {
failedFiles.add(st.getChildId());
}
});
Set<String> pendingFiles = processedTransferOp.get().getEndpointPathsList()
.stream().map(ep -> mftConsulClient.getEndpointPathHash(ep))
.filter(key -> !completedFiles.contains(key) && !failedFiles.contains(key)).collect(Collectors.toSet());
stateBuilder.addAllCompleted(completedFiles);
stateBuilder.addAllFailed(failedFiles);
stateBuilder.addAllProcessing(pendingFiles);
if (!pendingFiles.isEmpty()) {
stateBuilder.setState("IN PROGRESS");
stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
(completedFiles.size() + failedFiles.size() + pendingFiles.size()));
stateBuilder.setDescription("Transfer is in progress");
} else {
if (!failedFiles.isEmpty() && !completedFiles.isEmpty()) {
stateBuilder.setState("PARTIAL FAILURE");
stateBuilder.setDescription("Some file transfers failed");
stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
(completedFiles.size() + failedFiles.size() + pendingFiles.size()));
} else if (!failedFiles.isEmpty()) {
stateBuilder.setState("FAILED");
stateBuilder.setDescription("All file transfers failed");
stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
(completedFiles.size() + failedFiles.size() + pendingFiles.size()));
} else if (!completedFiles.isEmpty()) {
stateBuilder.setState("COMPLETED");
stateBuilder.setDescription("All file transfers completed");
stateBuilder.setPercentage((completedFiles.size() + failedFiles.size()) * 1.0 /
(completedFiles.size() + failedFiles.size() + pendingFiles.size()));
}
}
responseObserver.onNext(stateBuilder.build());
responseObserver.onCompleted();
} else if (!mainTransferStatus.isEmpty()){
stateBuilder.setState(mainTransferStatus.get(0).getState());
stateBuilder.setPercentage(0);
stateBuilder.setDescription(mainTransferStatus.get(0).getDescription());
responseObserver.onNext(stateBuilder.build());
responseObserver.onCompleted();
} else {
logger.error("There is processed transfer with id {}", request.getTransferId());
responseObserver.onError(Status.NOT_FOUND
.withDescription("There is no processed transfer with id " + request.getTransferId())
.asRuntimeException());
}
} catch (Exception e) {
logger.error("Error in fetching transfer state", e);
responseObserver.onError(Status.INTERNAL
.withDescription("Failed to retrieve transfer state. " + e.getMessage())
.asException());
}
}