diff --git a/CHANGELOG.md b/CHANGELOG.md index 0993da211..2617f5832 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ All notable changes to this project will be documented in this file. ### Bug Fixes - Filter out `CONTRIBUTE_AND_FINALIZE` tasks when detecting missed `REVEALED` status update. (#658) +- Fetch `results` on-chain when updating a replicate status. (#659) ## [[8.3.0]](https://github.com/iExecBlockchainComputing/iexec-core/releases/tag/v8.3.0) 2024-01-11 diff --git a/src/main/java/com/iexec/core/replicate/ReplicatesService.java b/src/main/java/com/iexec/core/replicate/ReplicatesService.java index d9a88d45b..1c9044933 100644 --- a/src/main/java/com/iexec/core/replicate/ReplicatesService.java +++ b/src/main/java/com/iexec/core/replicate/ReplicatesService.java @@ -19,6 +19,7 @@ import com.iexec.common.replicate.*; import com.iexec.common.utils.ContextualLockRunner; import com.iexec.commons.poco.chain.ChainContribution; +import com.iexec.commons.poco.chain.ChainTask; import com.iexec.commons.poco.notification.TaskNotificationType; import com.iexec.commons.poco.task.TaskDescription; import com.iexec.core.chain.IexecHubService; @@ -34,6 +35,7 @@ import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; +import org.web3j.utils.Numeric; import java.util.Collections; import java.util.List; @@ -101,26 +103,16 @@ public Optional getReplicatesList(String chainTaskId) { } public List getReplicates(String chainTaskId) { - Optional optionalList = getReplicatesList(chainTaskId); - if (optionalList.isEmpty()) { - return Collections.emptyList(); - } - return optionalList.get().getReplicates(); + return getReplicatesList(chainTaskId) + .map(ReplicatesList::getReplicates) + .orElse(Collections.emptyList()); } public Optional getReplicate(String chainTaskId, String walletAddress) { - Optional optional = getReplicatesList(chainTaskId); - if (optional.isEmpty()) { - return Optional.empty(); - } - - for (Replicate replicate : optional.get().getReplicates()) { - if (replicate.getWalletAddress().equals(walletAddress)) { - return Optional.of(replicate); - } - } - - return Optional.empty(); + return getReplicates(chainTaskId) + .stream() + .filter(replicate -> replicate.getWalletAddress().equals(walletAddress)) + .findFirst(); } public int getNbReplicatesWithCurrentStatus(String chainTaskId, ReplicateStatus... listStatus) { @@ -244,10 +236,15 @@ public UpdateReplicateStatusArgs computeUpdateReplicateStatusArgs(String chainTa if (statusUpdate.getStatus() == RESULT_UPLOADED || statusUpdate.getStatus() == CONTRIBUTE_AND_FINALIZE_DONE) { final ReplicateStatusDetails details = statusUpdate.getDetails(); + // TODO fetch chainCallbackData from chainTask when using latest ABI if (details != null) { - resultLink = details.getResultLink(); chainCallbackData = details.getChainCallbackData(); } + resultLink = iexecHubService.getChainTask(chainTaskId) + .map(ChainTask::getResults) + .map(Numeric::hexStringToByteArray) + .map(String::new) + .orElse(null); } return UpdateReplicateStatusArgs.builder() diff --git a/src/test/java/com/iexec/core/replicate/ReplicateServiceTests.java b/src/test/java/com/iexec/core/replicate/ReplicateServiceTests.java index 7b1413521..9884ed04b 100644 --- a/src/test/java/com/iexec/core/replicate/ReplicateServiceTests.java +++ b/src/test/java/com/iexec/core/replicate/ReplicateServiceTests.java @@ -18,6 +18,7 @@ import com.iexec.common.replicate.*; import com.iexec.commons.poco.chain.ChainContribution; +import com.iexec.commons.poco.chain.ChainTask; import com.iexec.commons.poco.notification.TaskNotificationType; import com.iexec.commons.poco.task.TaskDescription; import com.iexec.commons.poco.utils.BytesUtils; @@ -31,7 +32,9 @@ import org.junit.jupiter.api.Test; import org.mockito.*; import org.springframework.context.ApplicationEventPublisher; +import org.web3j.utils.Numeric; +import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.IntStream; @@ -1373,9 +1376,14 @@ void computeUpdateReplicateStatusArgsResultUploaded() { .status(RESULT_UPLOADED) .details(details) .build(); + final ChainTask chainTask = ChainTask.builder() + .chainTaskId(CHAIN_TASK_ID) + .results(Numeric.toHexString(expectedResultLink.getBytes(StandardCharsets.UTF_8))) + .build(); when(iexecHubService.getTaskDescription(CHAIN_TASK_ID)) .thenReturn(expectedTaskDescription); + when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask)); final UpdateReplicateStatusArgs actualResult = replicatesService.computeUpdateReplicateStatusArgs(CHAIN_TASK_ID, WALLET_WORKER_1, statusUpdate); @@ -1407,11 +1415,16 @@ void computeUpdateReplicateStatusArgsContributeAndFinalizeDone() { .status(CONTRIBUTE_AND_FINALIZE_DONE) .details(details) .build(); + final ChainTask chainTask = ChainTask.builder() + .chainTaskId(CHAIN_TASK_ID) + .results(Numeric.toHexString(expectedResultLink.getBytes(StandardCharsets.UTF_8))) + .build(); when(iexecHubService.getTaskDescription(CHAIN_TASK_ID)).thenReturn(expectedTaskDescription); when(iexecHubService.getWorkerWeight(WALLET_WORKER_1)).thenReturn(expectedWorkerWeight); when(iexecHubService.getChainContribution(CHAIN_TASK_ID, WALLET_WORKER_1)) .thenReturn(Optional.of(expectedChainContribution)); + when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask)); assertThat(replicatesService.computeUpdateReplicateStatusArgs(CHAIN_TASK_ID, WALLET_WORKER_1, statusUpdate)) .isEqualTo(UpdateReplicateStatusArgs.builder()