Skip to content

Commit 0fe52d6

Browse files
authored
Merge pull request #619 from iExecBlockchainComputing/feature/is-eligible-to-contribute-and-finalize
Add `isEligibleToContributeAndFinalize` method to `Task`
2 parents 307cbfc + b5b4861 commit 0fe52d6

File tree

9 files changed

+62
-8
lines changed

9 files changed

+62
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ All notable changes to this project will be documented in this file.
88
- Add blockchain connection health indicator. (#601)
99
- Block some connections and messages when blockchain connection is down. (#604)
1010
- Block deal watching mechanisms when communication with the blockchain node is lost. (#606)
11+
- Use `isEligibleToContributeAndFinalize` method from `TaskDescription`. (#619)
1112
### Bug Fixes
1213
- Clean call to `iexecHubService#getTaskDescriptionFromChain` in test. (#597)
1314
- Reject deal if TEE tag but trust not in {0,1}. (#598)

src/main/java/com/iexec/core/detector/task/FinalizedTaskDetector.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import com.iexec.common.replicate.ReplicateStatus;
2020
import com.iexec.commons.poco.chain.ChainTask;
2121
import com.iexec.commons.poco.chain.ChainTaskStatus;
22+
import com.iexec.commons.poco.task.TaskDescription;
2223
import com.iexec.core.chain.IexecHubService;
2324
import com.iexec.core.detector.Detector;
2425
import com.iexec.core.replicate.Replicate;
@@ -89,8 +90,8 @@ boolean isChainTaskCompleted(Task task) {
8990
}
9091

9192
boolean isTaskContributeAndFinalizeDone(Task task) {
92-
// Only TEE tasks can follow ContributeAndFinalize workflow
93-
if (!task.isTeeTask()) {
93+
final TaskDescription taskDescription = iexecHubService.getTaskDescription(task.getChainTaskId());
94+
if (!taskDescription.isEligibleToContributeAndFinalize()) {
9495
return false;
9596
}
9697

src/main/java/com/iexec/core/task/update/TaskUpdateManager.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.iexec.commons.poco.chain.ChainReceipt;
2121
import com.iexec.commons.poco.chain.ChainTask;
2222
import com.iexec.commons.poco.chain.ChainTaskStatus;
23+
import com.iexec.commons.poco.task.TaskDescription;
2324
import com.iexec.core.chain.IexecHubService;
2425
import com.iexec.core.chain.adapter.BlockchainAdapterService;
2526
import com.iexec.core.replicate.Replicate;
@@ -331,7 +332,8 @@ void running2Finalized2Completed(Task task) {
331332
boolean isTaskInRunningStatus = task.getCurrentStatus() == RUNNING;
332333
final String chainTaskId = task.getChainTaskId();
333334

334-
if (!task.isTeeTask()) {
335+
final TaskDescription taskDescription = iexecHubService.getTaskDescription(task.getChainTaskId());
336+
if (!taskDescription.isEligibleToContributeAndFinalize()) {
335337
log.debug("Task not running in a TEE, flow running2Finalized2Completed is not possible"
336338
+ " [chainTaskId:{}]", chainTaskId);
337339
return;

src/main/java/com/iexec/core/workflow/ReplicateWorkflow.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,7 +196,7 @@ TaskNotificationType getNextActionWhenStatusAndCause(ReplicateStatus whenStatus,
196196
return PLEASE_ABORT;
197197
}
198198
// We must check CallBack is empty because there is an issue in poco (transaction is revert)
199-
if (taskDescription.isTeeTask() && !taskDescription.containsCallback()) {
199+
if (taskDescription.isEligibleToContributeAndFinalize()) {
200200
return PLEASE_CONTRIBUTE_AND_FINALIZE;
201201
}
202202
}

src/test/java/com/iexec/core/detector/task/FinalizedTaskDetectorTests.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import com.iexec.common.replicate.ReplicateStatusModifier;
2121
import com.iexec.commons.poco.chain.ChainTask;
2222
import com.iexec.commons.poco.chain.ChainTaskStatus;
23+
import com.iexec.commons.poco.task.TaskDescription;
2324
import com.iexec.core.chain.IexecHubService;
2425
import com.iexec.core.replicate.Replicate;
2526
import com.iexec.core.replicate.ReplicatesService;
@@ -32,6 +33,7 @@
3233
import org.junit.jupiter.api.Test;
3334
import org.mockito.*;
3435

36+
import java.math.BigInteger;
3537
import java.util.List;
3638
import java.util.Optional;
3739

@@ -68,6 +70,7 @@ void shouldDetectTasks() {
6870
final String contributedAndFinalizedChainTaskId = "0x75bc5e94ed1486b940bd6cc0013c418efad58a0a52a3d08cee89faaa21970426";
6971
final Task contributeAndFinalizeTask = getContributeAndFinalizeDoneTask(contributedAndFinalizedChainTaskId).build();
7072
when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(contributeAndFinalizeTask));
73+
mockTaskDescriptionFromTask(contributeAndFinalizeTask);
7174

7275
detector.detect();
7376

@@ -106,6 +109,7 @@ void shouldDetectContributeAndFinalizeDoneTask() {
106109
final Task task = getContributeAndFinalizeDoneTask(CHAIN_TASK_ID).build();
107110

108111
when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(task));
112+
mockTaskDescriptionFromTask(task);
109113

110114
detector.detectContributeAndFinalizeDoneTasks();
111115

@@ -117,6 +121,7 @@ void shouldDetectNoContributeAndFinalizeDoneTaskAsTaskIsRevealing() {
117121
final Task task = getOnchainRevealingTask(CHAIN_DEAL_ID).build();
118122

119123
when(taskService.findByCurrentStatus(TaskStatus.RUNNING)).thenReturn(List.of(task));
124+
mockTaskDescriptionFromTask(task);
120125

121126
detector.detectContributeAndFinalizeDoneTasks();
122127

@@ -162,6 +167,7 @@ void shouldChainTaskNotBeCompletedAsChainTaskNotCompleted() {
162167
@Test
163168
void shouldTaskBeContributeAndFinalizeDone() {
164169
final Task task = getContributeAndFinalizeDoneTask(CHAIN_TASK_ID).build();
170+
mockTaskDescriptionFromTask(task);
165171

166172
final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task);
167173

@@ -175,6 +181,7 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsNotTee() {
175181
.currentStatus(TaskStatus.FINALIZING)
176182
.tag(NO_TEE_TAG)
177183
.build();
184+
mockTaskDescriptionFromTask(task);
178185

179186
final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task);
180187

@@ -197,6 +204,7 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsMultipleReplicates() {
197204

198205
when(replicatesService.getReplicates(CHAIN_TASK_ID)).thenReturn(List.of(replicate1, replicate2));
199206
when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask));
207+
mockTaskDescriptionFromTask(task);
200208

201209
final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task);
202210

@@ -214,6 +222,7 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsReplicateNotDone() {
214222
replicate.updateStatus(ReplicateStatus.COMPUTING, ReplicateStatusModifier.WORKER);
215223

216224
when(replicatesService.getReplicates(CHAIN_TASK_ID)).thenReturn(List.of(replicate));
225+
mockTaskDescriptionFromTask(task);
217226

218227
final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task);
219228

@@ -236,6 +245,7 @@ void shouldTaskNotBeContributeAndFinalizeDoneAsChainTaskNotCompleted() {
236245

237246
when(replicatesService.getReplicates(CHAIN_TASK_ID)).thenReturn(List.of(replicate));
238247
when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(chainTask));
248+
mockTaskDescriptionFromTask(task);
239249

240250
final boolean taskContributeAndFinalizeDone = detector.isTaskContributeAndFinalizeDone(task);
241251

@@ -291,7 +301,18 @@ private Task.TaskBuilder getContributeAndFinalizeDoneTask(String chainTaskId) {
291301
when(replicatesService.getReplicates(chainTaskId)).thenReturn(List.of(replicate));
292302

293303
return getOnchainCompletedTask(chainTaskId)
294-
.tag(TEE_TAG);
304+
.tag(TEE_TAG)
305+
.trust(1);
306+
}
307+
308+
private void mockTaskDescriptionFromTask(Task task) {
309+
final TaskDescription taskDescription = TaskDescription.builder()
310+
.chainTaskId(task.getChainTaskId())
311+
.isTeeTask(task.isTeeTask())
312+
.trust(BigInteger.valueOf(task.getTrust()))
313+
.callback("")
314+
.build();
315+
when(iexecHubService.getTaskDescription(task.getChainTaskId())).thenReturn(taskDescription);
295316
}
296317
// endregion
297318
}

src/test/java/com/iexec/core/task/TaskTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
import java.util.Date;
2424
import java.util.List;
2525

26-
import static com.iexec.core.task.TaskStatus.CONSENSUS_REACHED;
2726
import static com.iexec.common.utils.DateTimeUtils.addMinutesToDate;
2827
import static com.iexec.common.utils.DateTimeUtils.now;
28+
import static com.iexec.core.task.TaskStatus.CONSENSUS_REACHED;
2929
import static org.assertj.core.api.Assertions.assertThat;
3030

3131
class TaskTests {

src/test/java/com/iexec/core/task/TaskTestsUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class TaskTestsUtils {
3737
public final static String RESULT_LINK = "/ipfs/the_result_string";
3838

3939
public static Task getStubTask(long maxExecutionTime) {
40-
Task task = new Task(CHAIN_DEAL_ID, 0, DAPP_NAME, COMMAND_LINE, 0, maxExecutionTime, NO_TEE_TAG);
40+
Task task = new Task(CHAIN_DEAL_ID, 0, DAPP_NAME, COMMAND_LINE, 1, maxExecutionTime, NO_TEE_TAG);
4141
task.setFinalDeadline(Date.from(Instant.now().plus(1, ChronoUnit.MINUTES)));
4242
return task;
4343
}

src/test/java/com/iexec/core/task/update/TaskUpdateManagerTest.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.iexec.commons.poco.chain.ChainReceipt;
2424
import com.iexec.commons.poco.chain.ChainTask;
2525
import com.iexec.commons.poco.chain.ChainTaskStatus;
26+
import com.iexec.commons.poco.task.TaskDescription;
2627
import com.iexec.commons.poco.tee.TeeUtils;
2728
import com.iexec.commons.poco.utils.BytesUtils;
2829
import com.iexec.core.chain.IexecHubService;
@@ -48,6 +49,7 @@
4849
import org.mockito.MockitoAnnotations;
4950
import org.springframework.context.ApplicationEventPublisher;
5051

52+
import java.math.BigInteger;
5153
import java.time.Instant;
5254
import java.time.temporal.ChronoUnit;
5355
import java.util.ArrayList;
@@ -689,6 +691,7 @@ void shouldNotUpdateRunning2Finalized2CompletedWhenTaskNotRunning() {
689691
Task task = getStubTask(maxExecutionTime);
690692
task.changeStatus(INITIALIZED);
691693
task.setTag(TeeUtils.TEE_SCONE_ONLY_TAG);
694+
mockTaskDescriptionFromTask(task);
692695

693696
taskUpdateManager.running2Finalized2Completed(task);
694697
assertThat(task.getCurrentStatus()).isEqualTo(INITIALIZED);
@@ -701,6 +704,7 @@ void shouldNotUpdateRunning2Finalized2CompletedWhenNoReplicates() {
701704
task.setTag(TeeUtils.TEE_SCONE_ONLY_TAG);
702705

703706
when(replicatesService.getReplicatesList(CHAIN_TASK_ID)).thenReturn(Optional.empty());
707+
mockTaskDescriptionFromTask(task);
704708

705709
taskUpdateManager.running2Finalized2Completed(task);
706710
assertThat(task.getCurrentStatus()).isEqualTo(RUNNING);
@@ -714,6 +718,7 @@ void shouldNotUpdateRunning2Finalized2CompletedWhenTaskIsNotTee() {
714718
final ReplicatesList replicatesList = Mockito.spy(new ReplicatesList(CHAIN_TASK_ID));
715719

716720
when(replicatesService.getReplicatesList(CHAIN_TASK_ID)).thenReturn(Optional.of(replicatesList));
721+
mockTaskDescriptionFromTask(task);
717722
taskUpdateManager.running2Finalized2Completed(task);
718723
assertThat(task.getCurrentStatus()).isEqualTo(RUNNING);
719724
}
@@ -728,6 +733,7 @@ void shouldNotUpdateRunning2Finalized2CompletedWhenNoReplicatesOnContributeAndFi
728733

729734
when(replicatesService.getReplicatesList(CHAIN_TASK_ID)).thenReturn(Optional.of(replicatesList));
730735
when(replicatesList.getNbReplicatesWithCurrentStatus(ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE)).thenReturn(0);
736+
mockTaskDescriptionFromTask(task);
731737

732738
taskUpdateManager.running2Finalized2Completed(task);
733739
assertThat(task.getCurrentStatus()).isEqualTo(RUNNING);
@@ -744,6 +750,7 @@ void shouldNotUpdateRunning2Finalized2CompletedWhenMoreThanOneReplicatesOnContri
744750
when(replicatesService.getReplicatesList(CHAIN_TASK_ID)).thenReturn(Optional.of(replicatesList));
745751
when(replicatesList.getNbReplicatesWithCurrentStatus(ReplicateStatus.CONTRIBUTE_AND_FINALIZE_DONE)).thenReturn(2);
746752
doNothing().when(applicationEventPublisher).publishEvent(any());
753+
mockTaskDescriptionFromTask(task);
747754

748755
taskUpdateManager.running2Finalized2Completed(task);
749756
assertThat(task.getCurrentStatus()).isEqualTo(FAILED);
@@ -770,6 +777,7 @@ void shouldUpdateRunning2ConsensusReached() {
770777
when(iexecHubService.getConsensusBlock(anyString(), anyLong())).thenReturn(ChainReceipt.builder().blockNumber(1L).build());
771778
doNothing().when(applicationEventPublisher).publishEvent(any());
772779
when(replicatesList.getNbValidContributedWinners(any())).thenReturn(2);
780+
mockTaskDescriptionFromTask(task);
773781

774782
taskUpdateManager.updateTask(task.getChainTaskId());
775783
assertThat(task.getCurrentStatus()).isEqualTo(CONSENSUS_REACHED);
@@ -857,6 +865,7 @@ void shouldUpdateRunning2RunningFailedOn1Worker() {
857865
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
858866
when(workerService.getAliveWorkers()).thenReturn(workersList);
859867
doNothing().when(applicationEventPublisher).publishEvent(any());
868+
mockTaskDescriptionFromTask(task);
860869

861870
taskUpdateManager.updateTask(task.getChainTaskId());
862871
assertThat(task.getDateOfStatus(RUNNING_FAILED)).isPresent();
@@ -893,6 +902,7 @@ void shouldUpdateRunning2RunningFailedOn2Workers() {
893902
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
894903
when(workerService.getAliveWorkers()).thenReturn(workersList);
895904
doNothing().when(applicationEventPublisher).publishEvent(any());
905+
mockTaskDescriptionFromTask(task);
896906

897907
taskUpdateManager.updateTask(task.getChainTaskId());
898908
assertThat(task.getDateOfStatus(RUNNING_FAILED)).isPresent();
@@ -924,6 +934,7 @@ void shouldNotUpdateRunning2RunningFailedOn1WorkerAsNonTeeTask() {
924934
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
925935
when(workerService.getAliveWorkers()).thenReturn(workersList);
926936
doNothing().when(applicationEventPublisher).publishEvent(any());
937+
mockTaskDescriptionFromTask(task);
927938

928939
taskUpdateManager.updateTask(task.getChainTaskId());
929940
assertThat(task.getDateOfStatus(RUNNING)).isPresent();
@@ -959,6 +970,7 @@ void shouldNotUpdateRunning2RunningFailedOn2WorkersAsNonTeeTask() {
959970
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
960971
when(workerService.getAliveWorkers()).thenReturn(workersList);
961972
doNothing().when(applicationEventPublisher).publishEvent(any());
973+
mockTaskDescriptionFromTask(task);
962974

963975
taskUpdateManager.updateTask(task.getChainTaskId());
964976
assertThat(task.getDateOfStatus(RUNNING)).isPresent();
@@ -994,6 +1006,7 @@ void shouldNotUpdateRunning2AllWorkersFailedSinceOneStillComputing() {
9941006
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
9951007
when(workerService.getAliveWorkers()).thenReturn(workersList);
9961008
doNothing().when(applicationEventPublisher).publishEvent(any());
1009+
mockTaskDescriptionFromTask(task);
9971010

9981011
taskUpdateManager.updateTask(task.getChainTaskId());
9991012
assertThat(task.getDateOfStatus(RUNNING_FAILED)).isEmpty();
@@ -1028,6 +1041,7 @@ void shouldNotUpdateRunning2AllWorkersFailedSinceOneHasReachedComputed() {
10281041
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
10291042
when(workerService.getAliveWorkers()).thenReturn(workersList);
10301043
doNothing().when(applicationEventPublisher).publishEvent(any());
1044+
mockTaskDescriptionFromTask(task);
10311045

10321046
taskUpdateManager.updateTask(task.getChainTaskId());
10331047
assertThat(task.getDateOfStatus(RUNNING_FAILED)).isEmpty();
@@ -1058,6 +1072,7 @@ void shouldNotUpdateRunning2AllWorkersFailedSinceOneStillHasToBeLaunched() {
10581072
when(replicatesService.getReplicatesList(task.getChainTaskId())).thenReturn(Optional.of(replicatesList));
10591073
when(workerService.getAliveWorkers()).thenReturn(workersList);
10601074
doNothing().when(applicationEventPublisher).publishEvent(any());
1075+
mockTaskDescriptionFromTask(task);
10611076

10621077
taskUpdateManager.updateTask(task.getChainTaskId());
10631078
assertThat(task.getDateOfStatus(RUNNING_FAILED)).isEmpty();
@@ -1709,6 +1724,7 @@ void shouldUpdateTaskRunning2Finalized2Completed() {
17091724
doNothing().when(applicationEventPublisher).publishEvent(any());
17101725

17111726
when(taskService.getTaskByChainTaskId(CHAIN_TASK_ID)).thenReturn(Optional.of(task));
1727+
mockTaskDescriptionFromTask(task);
17121728

17131729
taskUpdateManager.updateTask(CHAIN_TASK_ID);
17141730
assertThat(task.getCurrentStatus()).isEqualTo(COMPLETED);
@@ -1875,4 +1891,16 @@ void shouldTriggerUpdateTaskAsynchronously() {
18751891
taskUpdateRequestManager.publishRequest(CHAIN_TASK_ID);
18761892
verify(taskUpdateRequestManager).publishRequest(CHAIN_TASK_ID);
18771893
}
1894+
1895+
// region utils
1896+
private void mockTaskDescriptionFromTask(Task task) {
1897+
final TaskDescription taskDescription = TaskDescription.builder()
1898+
.chainTaskId(task.getChainTaskId())
1899+
.isTeeTask(task.isTeeTask())
1900+
.trust(BigInteger.valueOf(task.getTrust()))
1901+
.callback("")
1902+
.build();
1903+
when(iexecHubService.getTaskDescription(task.getChainTaskId())).thenReturn(taskDescription);
1904+
}
1905+
// endregion
18781906
}

src/test/java/com/iexec/core/workflow/ReplicateWorkflowTests.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232

3333
import java.io.File;
3434
import java.io.IOException;
35+
import java.math.BigInteger;
3536
import java.util.HashMap;
3637
import java.util.List;
3738
import java.util.Map;
@@ -166,7 +167,7 @@ void shouldGetNextActionOnComputedWithTeeTaskShouldBePleaseContributeAndFinalize
166167
assertThat(replicateWorkflow
167168
.getNextAction(COMPUTED,
168169
null,
169-
TaskDescription.builder().isTeeTask(true).callback(BytesUtils.EMPTY_ADDRESS).build()))
170+
TaskDescription.builder().isTeeTask(true).trust(BigInteger.ONE).callback(BytesUtils.EMPTY_ADDRESS).build()))
170171
.isEqualTo(PLEASE_CONTRIBUTE_AND_FINALIZE);
171172
}
172173

0 commit comments

Comments
 (0)