Skip to content

Commit 1562e09

Browse files
Merge pull request #444 from iExecBlockchainComputing/hotfix/initialization-checks
Hotfix/initialization checks
2 parents d32a577 + 6a7ea64 commit 1562e09

File tree

8 files changed

+50
-75
lines changed

8 files changed

+50
-75
lines changed

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version=6.1.4
1+
version=6.1.5
22
iexecCommonVersion=5.5.1
33
nexusUser=fake
44
nexusPassword=fake

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ public void detect() {
5353
Optional<ChainTask> chainTask = iexecHubService.getChainTask(task.getChainTaskId());
5454
if (chainTask.isPresent() && chainTask.get().getStatus().equals(ChainTaskStatus.COMPLETED)) {
5555
log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]",
56-
TaskStatus.FINALIZING, TaskStatus.FINALIZED, task.getChainTaskId());
56+
task.getCurrentStatus(), TaskStatus.FINALIZED, task.getChainTaskId());
5757
taskService.updateTask(task.getChainTaskId());
5858
}
5959
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public void detect() {
5858
ChainTask chainTask = oChainTask.get();
5959
if (chainTask.getStatus().equals(ChainTaskStatus.ACTIVE)) {
6060
log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]",
61-
TaskStatus.REOPENING, TaskStatus.REOPENED, task.getChainTaskId());
61+
task.getCurrentStatus(), TaskStatus.REOPENED, task.getChainTaskId());
6262
taskService.updateTask(task.getChainTaskId());
6363
}
6464
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,15 @@ public void detect() {
4343
List<Task> notYetFinalizingTasks = taskService.findByCurrentStatus(TaskStatus.RESULT_UPLOADED);
4444
for (Task task : notYetFinalizingTasks) {
4545
log.info("Detected confirmed missing update (task) [is:{}, should:{}, chainTaskId:{}]",
46-
TaskStatus.RESULT_UPLOADED, TaskStatus.FINALIZING, task.getChainTaskId());
46+
task.getCurrentStatus(), TaskStatus.FINALIZING, task.getChainTaskId());
4747
taskService.updateTask(task.getChainTaskId());
4848
}
4949

5050
//start initialize when needed
5151
List<Task> notYetInitializedTasks = taskService.getInitializableTasks();
5252
for (Task task : notYetInitializedTasks) {
5353
log.info("Detected confirmed missing update (task) [is:{}, should:{}, chainTaskId:{}]",
54-
TaskStatus.RECEIVED, TaskStatus.INITIALIZING, task.getChainTaskId());
54+
task.getCurrentStatus(), TaskStatus.INITIALIZING, task.getChainTaskId());
5555
taskService.updateTask(task.getChainTaskId());
5656
}
5757
}

src/main/java/com/iexec/core/replicate/ReplicateSupplyService.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,10 @@ Optional<WorkerpoolAuthorization> getAuthOfAvailableReplicate(long workerLastBlo
148148
}
149149
taskService.lockTaskAccessForNewReplicate(chainTaskId);
150150

151-
boolean isFewBlocksAfterInitialization = isFewBlocksAfterInitialization(task);
152151
boolean hasWorkerAlreadyParticipated = replicatesService.hasWorkerAlreadyParticipated(
153152
chainTaskId, walletAddress);
154153

155-
if (isFewBlocksAfterInitialization && !hasWorkerAlreadyParticipated
154+
if (!hasWorkerAlreadyParticipated
156155
&& consensusService.doesTaskNeedMoreContributionsForConsensus(chainTaskId, task.getTrust(), task.getMaxExecutionTime())) {
157156

158157
String enclaveChallenge = smsService.getEnclaveChallenge(chainTaskId, isTeeTask);

src/main/java/com/iexec/core/task/TaskService.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,19 @@ private void initializing2Initialized(Task task) {
370370

371371
private void initializing2Initialized(Task task, ChainReceipt chainReceipt) {
372372
String chainTaskId = task.getChainTaskId();
373+
if (!INITIALIZING.equals(task.getCurrentStatus())){
374+
return;
375+
}
376+
377+
ChainTaskStatus onChainStatus = iexecHubService.getChainTask(chainTaskId)
378+
.map(ChainTask::getStatus)
379+
.orElse(null);
380+
if (!ChainTaskStatus.ACTIVE.equals(onChainStatus)){
381+
log.warn("Cannot upgrade to initialized status [chainTaskId:{}, " +
382+
"onChainStatus{}]", chainTaskId, onChainStatus);
383+
return;
384+
}
385+
373386
long initializationBlock = chainReceipt != null? chainReceipt.getBlockNumber() : 0;
374387
if (initializationBlock == 0){
375388
log.warn("Initialization block is empty, using deal block [chainTaskId:{}" +

src/test/java/com/iexec/core/replicate/ReplicateSupplyServiceTests.java

Lines changed: 1 addition & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,7 @@ public class ReplicateSupplyServiceTests {
6565
private final static String TEE_TAG = "0x0000000000000000000000000000000000000000000000000000000000000001";
6666
private final static String ENCLAVE_CHALLENGE = "dummyEnclave";
6767
private final static long maxExecutionTime = 60000;
68-
long initBlock = 10;
69-
long coreLastBlock = initBlock + 2;
70-
long workerLastBlock = coreLastBlock;
68+
long workerLastBlock = 12;
7169

7270
@Mock private ReplicatesService replicatesService;
7371
@Mock private SignatureService signatureService;
@@ -109,13 +107,11 @@ public void shouldNotGetReplicateSinceWorkerLastBlockNotAvailable() {
109107
.build();
110108

111109
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
112-
runningTask.setInitializationBlockNumber(initBlock);
113110
runningTask.setMaxExecutionTime(maxExecutionTime);
114111
runningTask.changeStatus(RUNNING);
115112
runningTask.setTag(NO_TEE_TAG);
116113

117114
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
118-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
119115
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
120116
when(taskService.getInitializedOrRunningTasks())
121117
.thenReturn(Collections.singletonList(runningTask));
@@ -203,49 +199,6 @@ public void shouldNotGetAnyReplicateSinceWorkerDoesNotHaveEnoughGas() {
203199
assertTaskAccessForNewReplicateLockNeverUsed();
204200
}
205201

206-
@Test
207-
public void shouldNotGetReplicateSinceIsNotFewBlocksAfterInitialization() {
208-
Worker existingWorker = Worker.builder()
209-
.id("1")
210-
.walletAddress(WALLET_WORKER_1)
211-
.cpuNb(2)
212-
.teeEnabled(false)
213-
.lastAliveDate(new Date())
214-
.build();
215-
216-
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
217-
runningTask.setInitializationBlockNumber(initBlock);
218-
runningTask.setMaxExecutionTime(maxExecutionTime);
219-
runningTask.changeStatus(RUNNING);
220-
runningTask.setTag(NO_TEE_TAG);
221-
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
222-
223-
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
224-
when(web3jService.getLatestBlockNumber()).thenReturn(initBlock + 1);//should be 2
225-
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
226-
when(taskService.getInitializedOrRunningTasks())
227-
.thenReturn(Collections.singletonList(runningTask));
228-
when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true);
229-
when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true);
230-
when(replicatesService.hasWorkerAlreadyParticipated(CHAIN_TASK_ID, WALLET_WORKER_1))
231-
.thenReturn(false);
232-
when(consensusService.doesTaskNeedMoreContributionsForConsensus(CHAIN_TASK_ID, runningTask.getTrust(),
233-
runningTask.getMaxExecutionTime())).thenReturn(true);
234-
when(smsService.getEnclaveChallenge(CHAIN_TASK_ID, false)).thenReturn(BytesUtils.EMPTY_ADDRESS);
235-
when(signatureService.createAuthorization(WALLET_WORKER_1, CHAIN_TASK_ID, BytesUtils.EMPTY_ADDRESS))
236-
.thenReturn(new WorkerpoolAuthorization());
237-
238-
Optional<WorkerpoolAuthorization> oAuthorization = replicateSupplyService.getAuthOfAvailableReplicate(workerLastBlock, WALLET_WORKER_1);
239-
240-
assertThat(oAuthorization).isEmpty();
241-
242-
Mockito.verify(replicatesService, Mockito.times(0))
243-
.addNewReplicate(CHAIN_TASK_ID, WALLET_WORKER_1);
244-
Mockito.verify(workerService, Mockito.times(0))
245-
.addChainTaskIdToWorker(CHAIN_TASK_ID, WALLET_WORKER_1);
246-
assertTaskAccessForNewReplicateNotDeadLocking();
247-
}
248-
249202
@Test
250203
public void shouldNotGetAnyReplicateSinceWorkerAlreadyParticipated() {
251204
Worker existingWorker = Worker.builder()
@@ -256,14 +209,12 @@ public void shouldNotGetAnyReplicateSinceWorkerAlreadyParticipated() {
256209
.build();
257210

258211
Task runningTask1 = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
259-
runningTask1.setInitializationBlockNumber(initBlock);
260212
runningTask1.setMaxExecutionTime(maxExecutionTime);
261213
runningTask1.changeStatus(RUNNING);
262214
runningTask1.setTag(NO_TEE_TAG);
263215
runningTask1.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
264216

265217
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
266-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
267218
when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true);
268219
when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true);
269220
when(taskService.getInitializedOrRunningTasks())
@@ -291,13 +242,11 @@ public void shouldNotGetReplicateSinceNeedsMoreContributionsForConsensus() {
291242

292243
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
293244
runningTask.changeStatus(RUNNING);
294-
runningTask.setInitializationBlockNumber(initBlock);
295245
runningTask.setMaxExecutionTime(maxExecutionTime);
296246
runningTask.setTag(NO_TEE_TAG);
297247
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
298248

299249
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
300-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
301250
when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true);
302251
when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true);
303252
when(taskService.getInitializedOrRunningTasks())
@@ -324,14 +273,12 @@ public void shouldNotGetReplicateSinceEnclaveChallengeNeededButNotGenerated() {
324273
.build();
325274

326275
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
327-
runningTask.setInitializationBlockNumber(initBlock);
328276
runningTask.setMaxExecutionTime(maxExecutionTime);
329277
runningTask.changeStatus(RUNNING);
330278
runningTask.setTag(TEE_TAG);
331279
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
332280

333281
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
334-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
335282
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
336283
when(taskService.getInitializedOrRunningTasks())
337284
.thenReturn(Collections.singletonList(runningTask));
@@ -367,14 +314,12 @@ public void shouldGetOnlyOneReplicateSinceOtherOneReachedConsensusDeadline() {
367314
.build();
368315

369316
Task task1 = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
370-
task1.setInitializationBlockNumber(initBlock);
371317
task1.setMaxExecutionTime(maxExecutionTime);
372318
task1.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
373319
task1.changeStatus(RUNNING);
374320
task1.setTag(NO_TEE_TAG);
375321

376322
Task taskDeadlineReached = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
377-
taskDeadlineReached.setInitializationBlockNumber(initBlock);
378323
taskDeadlineReached.setMaxExecutionTime(maxExecutionTime);
379324
taskDeadlineReached.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), -60));
380325
taskDeadlineReached.changeStatus(RUNNING);
@@ -387,7 +332,6 @@ public void shouldGetOnlyOneReplicateSinceOtherOneReachedConsensusDeadline() {
387332
tasks.add(task1);
388333
tasks.add(taskDeadlineReached);
389334
when(taskService.getInitializedOrRunningTasks()).thenReturn(tasks);
390-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
391335
doNothing().when(contributionTimeoutTaskDetector).detect();
392336

393337
replicateSupplyService.getAuthOfAvailableReplicate(workerLastBlock, WALLET_WORKER_1);
@@ -408,14 +352,12 @@ public void shouldNotGetReplicateWhenTaskAlreadyAccessed() {
408352
.build();
409353

410354
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
411-
runningTask.setInitializationBlockNumber(initBlock);
412355
runningTask.setMaxExecutionTime(maxExecutionTime);
413356
runningTask.changeStatus(RUNNING);
414357
runningTask.setTag(NO_TEE_TAG);
415358
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
416359

417360
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(true);
418-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
419361
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
420362
when(taskService.getInitializedOrRunningTasks())
421363
.thenReturn(Collections.singletonList(runningTask));
@@ -450,14 +392,12 @@ public void shouldGetReplicateWithNoTee() {
450392
.build();
451393

452394
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
453-
runningTask.setInitializationBlockNumber(initBlock);
454395
runningTask.setMaxExecutionTime(maxExecutionTime);
455396
runningTask.changeStatus(RUNNING);
456397
runningTask.setTag(NO_TEE_TAG);
457398
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
458399

459400
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
460-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
461401
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
462402
when(taskService.getInitializedOrRunningTasks())
463403
.thenReturn(Collections.singletonList(runningTask));
@@ -493,14 +433,12 @@ public void shouldGetReplicateWithTee() {
493433
.build();
494434

495435
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
496-
runningTask.setInitializationBlockNumber(initBlock);
497436
runningTask.setMaxExecutionTime(maxExecutionTime);
498437
runningTask.changeStatus(RUNNING);
499438
runningTask.setTag(TEE_TAG);
500439
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
501440

502441
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
503-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
504442
when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker));
505443
when(taskService.getInitializedOrRunningTasks())
506444
.thenReturn(Collections.singletonList(runningTask));
@@ -536,14 +474,12 @@ public void shouldTeeNeededTaskNotBeGivenToTeeDisabledWorker() {
536474
.build();
537475

538476
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
539-
runningTask.setInitializationBlockNumber(initBlock);
540477
runningTask.setMaxExecutionTime(maxExecutionTime);
541478
runningTask.changeStatus(RUNNING);
542479
runningTask.setTag(TEE_TAG);
543480
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
544481

545482
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
546-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
547483
when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true);
548484
when(taskService.getInitializedOrRunningTasks())
549485
.thenReturn(Collections.singletonList(runningTask));
@@ -571,14 +507,12 @@ public void shouldTeeNeededTaskBeGivenToTeeEnabledWorker() {
571507
.build();
572508

573509
Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
574-
runningTask.setInitializationBlockNumber(initBlock);
575510
runningTask.setMaxExecutionTime(maxExecutionTime);
576511
runningTask.changeStatus(RUNNING);
577512
runningTask.setTag(TEE_TAG);
578513
runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60));
579514

580515
when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false);
581-
when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock);
582516
when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true);
583517
when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true);
584518
when(taskService.getInitializedOrRunningTasks())
@@ -632,7 +566,6 @@ public void shouldNotGetInterruptedReplicateSinceEnclaveChallengeNeededButNotGen
632566

633567
List<String> ids = Arrays.asList(CHAIN_TASK_ID);
634568
Task teeTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID);
635-
teeTask.setInitializationBlockNumber(initBlock);
636569
Optional<Replicate> noTeeReplicate = getStubReplicate(ReplicateStatus.COMPUTING);
637570
teeTask.setTag(TEE_TAG);
638571

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,35 @@ public void shouldUpdateInitializing2InitailizeFailedSinceChainTaskIdIsEmpty() {
486486
assertThat(task.getCurrentStatus()).isEqualTo(FAILED);
487487
}
488488

489+
@Test
490+
public void shouldPartiallyUpdateForReceived2Initializing2InitializedSinceNotActiveTaskOnChain() {
491+
Task task = getStubTask();
492+
task.changeStatus(RECEIVED);
493+
task.setChainTaskId(CHAIN_TASK_ID);
494+
Pair<String, ChainReceipt> pair = Pair.of(CHAIN_TASK_ID, null);
495+
496+
when(taskRepository.findByChainTaskId(CHAIN_TASK_ID)).thenReturn(Optional.of(task));
497+
when(iexecHubService.hasEnoughGas()).thenReturn(true);
498+
when(iexecHubService.isTaskInUnsetStatusOnChain(CHAIN_DEAL_ID, 0)).thenReturn(true);
499+
when(iexecHubService.isBeforeContributionDeadline(task.getChainDealId()))
500+
.thenReturn(true);
501+
502+
when(taskRepository.save(task)).thenReturn(task);
503+
when(iexecHubService.initialize(CHAIN_DEAL_ID, 0)).thenReturn(Optional.of(pair));
504+
when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(ChainTask.builder()
505+
.build()));
506+
507+
taskService.updateTaskRunnable(CHAIN_TASK_ID);
508+
assertThat(task.getChainDealId()).isEqualTo(CHAIN_DEAL_ID);
509+
assertThat(task.getDateStatusList().get(task.getDateStatusList().size() - 2).getStatus()).isEqualTo(RECEIVED);
510+
assertThat(task.getDateStatusList().get(task.getDateStatusList().size() - 1).getStatus()).isEqualTo(INITIALIZING);
511+
assertThat(task.getCurrentStatus()).isEqualTo(INITIALIZING);
512+
513+
// test that double call doesn't change anything
514+
taskService.updateTaskRunnable(CHAIN_TASK_ID);
515+
assertThat(task.getCurrentStatus()).isEqualTo(INITIALIZING);
516+
}
517+
489518
@Test
490519
public void shouldUpdateReceived2Initializing2Initialized() {
491520
Task task = getStubTask();
@@ -502,6 +531,7 @@ public void shouldUpdateReceived2Initializing2Initialized() {
502531
when(taskRepository.save(task)).thenReturn(task);
503532
when(iexecHubService.initialize(CHAIN_DEAL_ID, 0)).thenReturn(Optional.of(pair));
504533
when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(ChainTask.builder()
534+
.status(ChainTaskStatus.ACTIVE)
505535
.contributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60).getTime())
506536
.build()));
507537

0 commit comments

Comments
 (0)