From 70bd09cdf035556c7ceb1146b47d3e3fc64b4822 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20James=20Toussaint?= Date: Mon, 18 Oct 2021 09:20:52 +0200 Subject: [PATCH 1/4] Added check before upgrading to initialized --- .../java/com/iexec/core/task/TaskService.java | 13 ++++++++ .../com/iexec/core/task/TaskServiceTests.java | 30 +++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/src/main/java/com/iexec/core/task/TaskService.java b/src/main/java/com/iexec/core/task/TaskService.java index 5f16e30f7..ddf9dfcb4 100644 --- a/src/main/java/com/iexec/core/task/TaskService.java +++ b/src/main/java/com/iexec/core/task/TaskService.java @@ -370,6 +370,19 @@ private void initializing2Initialized(Task task) { private void initializing2Initialized(Task task, ChainReceipt chainReceipt) { String chainTaskId = task.getChainTaskId(); + if (!INITIALIZING.equals(task.getCurrentStatus())){ + return; + } + + ChainTaskStatus onChainStatus = iexecHubService.getChainTask(chainTaskId) + .map(ChainTask::getStatus) + .orElse(null); + if (!ChainTaskStatus.ACTIVE.equals(onChainStatus)){ + log.warn("Cannot upgrade to initialized status [chainTaskId:{}, " + + "onChainStatus{}]", chainTaskId, onChainStatus); + return; + } + long initializationBlock = chainReceipt != null? chainReceipt.getBlockNumber() : 0; if (initializationBlock == 0){ log.warn("Initialization block is empty, using deal block [chainTaskId:{}" + diff --git a/src/test/java/com/iexec/core/task/TaskServiceTests.java b/src/test/java/com/iexec/core/task/TaskServiceTests.java index e8cedc8cc..b048d1dbd 100644 --- a/src/test/java/com/iexec/core/task/TaskServiceTests.java +++ b/src/test/java/com/iexec/core/task/TaskServiceTests.java @@ -486,6 +486,35 @@ public void shouldUpdateInitializing2InitailizeFailedSinceChainTaskIdIsEmpty() { assertThat(task.getCurrentStatus()).isEqualTo(FAILED); } + @Test + public void shouldPartiallyUpdateForReceived2Initializing2InitializedSinceNotActiveTaskOnChain() { + Task task = getStubTask(); + task.changeStatus(RECEIVED); + task.setChainTaskId(CHAIN_TASK_ID); + Pair pair = Pair.of(CHAIN_TASK_ID, null); + + when(taskRepository.findByChainTaskId(CHAIN_TASK_ID)).thenReturn(Optional.of(task)); + when(iexecHubService.hasEnoughGas()).thenReturn(true); + when(iexecHubService.isTaskInUnsetStatusOnChain(CHAIN_DEAL_ID, 0)).thenReturn(true); + when(iexecHubService.isBeforeContributionDeadline(task.getChainDealId())) + .thenReturn(true); + + when(taskRepository.save(task)).thenReturn(task); + when(iexecHubService.initialize(CHAIN_DEAL_ID, 0)).thenReturn(Optional.of(pair)); + when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(ChainTask.builder() + .build())); + + taskService.updateTaskRunnable(CHAIN_TASK_ID); + assertThat(task.getChainDealId()).isEqualTo(CHAIN_DEAL_ID); + assertThat(task.getDateStatusList().get(task.getDateStatusList().size() - 2).getStatus()).isEqualTo(RECEIVED); + assertThat(task.getDateStatusList().get(task.getDateStatusList().size() - 1).getStatus()).isEqualTo(INITIALIZING); + assertThat(task.getCurrentStatus()).isEqualTo(INITIALIZING); + + // test that double call doesn't change anything + taskService.updateTaskRunnable(CHAIN_TASK_ID); + assertThat(task.getCurrentStatus()).isEqualTo(INITIALIZING); + } + @Test public void shouldUpdateReceived2Initializing2Initialized() { Task task = getStubTask(); @@ -502,6 +531,7 @@ public void shouldUpdateReceived2Initializing2Initialized() { when(taskRepository.save(task)).thenReturn(task); when(iexecHubService.initialize(CHAIN_DEAL_ID, 0)).thenReturn(Optional.of(pair)); when(iexecHubService.getChainTask(CHAIN_TASK_ID)).thenReturn(Optional.of(ChainTask.builder() + .status(ChainTaskStatus.ACTIVE) .contributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60).getTime()) .build())); From b7485485adb54289d4d7b112001dd5ffc3d9a618 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20James=20Toussaint?= Date: Mon, 18 Oct 2021 09:26:12 +0200 Subject: [PATCH 2/4] Get consistent task status in detector logs --- .../com/iexec/core/detector/task/FinalizedTaskDetector.java | 2 +- .../com/iexec/core/detector/task/ReopenedTaskDetector.java | 2 +- .../com/iexec/core/detector/task/UnstartedTxDetector.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/iexec/core/detector/task/FinalizedTaskDetector.java b/src/main/java/com/iexec/core/detector/task/FinalizedTaskDetector.java index 25faa1327..53fe7f210 100644 --- a/src/main/java/com/iexec/core/detector/task/FinalizedTaskDetector.java +++ b/src/main/java/com/iexec/core/detector/task/FinalizedTaskDetector.java @@ -53,7 +53,7 @@ public void detect() { Optional chainTask = iexecHubService.getChainTask(task.getChainTaskId()); if (chainTask.isPresent() && chainTask.get().getStatus().equals(ChainTaskStatus.COMPLETED)) { log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]", - TaskStatus.FINALIZING, TaskStatus.FINALIZED, task.getChainTaskId()); + task.getCurrentStatus(), TaskStatus.FINALIZED, task.getChainTaskId()); taskService.updateTask(task.getChainTaskId()); } } diff --git a/src/main/java/com/iexec/core/detector/task/ReopenedTaskDetector.java b/src/main/java/com/iexec/core/detector/task/ReopenedTaskDetector.java index bc60302c1..a6fda4ec0 100644 --- a/src/main/java/com/iexec/core/detector/task/ReopenedTaskDetector.java +++ b/src/main/java/com/iexec/core/detector/task/ReopenedTaskDetector.java @@ -58,7 +58,7 @@ public void detect() { ChainTask chainTask = oChainTask.get(); if (chainTask.getStatus().equals(ChainTaskStatus.ACTIVE)) { log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]", - TaskStatus.REOPENING, TaskStatus.REOPENED, task.getChainTaskId()); + task.getCurrentStatus(), TaskStatus.REOPENED, task.getChainTaskId()); taskService.updateTask(task.getChainTaskId()); } } diff --git a/src/main/java/com/iexec/core/detector/task/UnstartedTxDetector.java b/src/main/java/com/iexec/core/detector/task/UnstartedTxDetector.java index 1f0ca9471..e9a5db8d8 100644 --- a/src/main/java/com/iexec/core/detector/task/UnstartedTxDetector.java +++ b/src/main/java/com/iexec/core/detector/task/UnstartedTxDetector.java @@ -43,7 +43,7 @@ public void detect() { List notYetFinalizingTasks = taskService.findByCurrentStatus(TaskStatus.RESULT_UPLOADED); for (Task task : notYetFinalizingTasks) { log.info("Detected confirmed missing update (task) [is:{}, should:{}, chainTaskId:{}]", - TaskStatus.RESULT_UPLOADED, TaskStatus.FINALIZING, task.getChainTaskId()); + task.getCurrentStatus(), TaskStatus.FINALIZING, task.getChainTaskId()); taskService.updateTask(task.getChainTaskId()); } @@ -51,7 +51,7 @@ public void detect() { List notYetInitializedTasks = taskService.getInitializableTasks(); for (Task task : notYetInitializedTasks) { log.info("Detected confirmed missing update (task) [is:{}, should:{}, chainTaskId:{}]", - TaskStatus.RECEIVED, TaskStatus.INITIALIZING, task.getChainTaskId()); + task.getCurrentStatus(), TaskStatus.INITIALIZING, task.getChainTaskId()); taskService.updateTask(task.getChainTaskId()); } } From d347f1685d2be25295a1f09881db97f817b4b7f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20James=20Toussaint?= Date: Mon, 18 Oct 2021 09:35:47 +0200 Subject: [PATCH 3/4] Removed 2-blocks waiting time before supplying new replicate --- .../replicate/ReplicateSupplyService.java | 3 +- .../ReplicateSupplyServiceTests.java | 69 +------------------ 2 files changed, 2 insertions(+), 70 deletions(-) diff --git a/src/main/java/com/iexec/core/replicate/ReplicateSupplyService.java b/src/main/java/com/iexec/core/replicate/ReplicateSupplyService.java index 99248a758..2842907e2 100644 --- a/src/main/java/com/iexec/core/replicate/ReplicateSupplyService.java +++ b/src/main/java/com/iexec/core/replicate/ReplicateSupplyService.java @@ -148,11 +148,10 @@ Optional getAuthOfAvailableReplicate(long workerLastBlo } taskService.lockTaskAccessForNewReplicate(chainTaskId); - boolean isFewBlocksAfterInitialization = isFewBlocksAfterInitialization(task); boolean hasWorkerAlreadyParticipated = replicatesService.hasWorkerAlreadyParticipated( chainTaskId, walletAddress); - if (isFewBlocksAfterInitialization && !hasWorkerAlreadyParticipated + if (!hasWorkerAlreadyParticipated && consensusService.doesTaskNeedMoreContributionsForConsensus(chainTaskId, task.getTrust(), task.getMaxExecutionTime())) { String enclaveChallenge = smsService.getEnclaveChallenge(chainTaskId, isTeeTask); diff --git a/src/test/java/com/iexec/core/replicate/ReplicateSupplyServiceTests.java b/src/test/java/com/iexec/core/replicate/ReplicateSupplyServiceTests.java index 32f4f0173..92c403188 100644 --- a/src/test/java/com/iexec/core/replicate/ReplicateSupplyServiceTests.java +++ b/src/test/java/com/iexec/core/replicate/ReplicateSupplyServiceTests.java @@ -65,9 +65,7 @@ public class ReplicateSupplyServiceTests { private final static String TEE_TAG = "0x0000000000000000000000000000000000000000000000000000000000000001"; private final static String ENCLAVE_CHALLENGE = "dummyEnclave"; private final static long maxExecutionTime = 60000; - long initBlock = 10; - long coreLastBlock = initBlock + 2; - long workerLastBlock = coreLastBlock; + long workerLastBlock = 12; @Mock private ReplicatesService replicatesService; @Mock private SignatureService signatureService; @@ -109,13 +107,11 @@ public void shouldNotGetReplicateSinceWorkerLastBlockNotAvailable() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(NO_TEE_TAG); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -203,49 +199,6 @@ public void shouldNotGetAnyReplicateSinceWorkerDoesNotHaveEnoughGas() { assertTaskAccessForNewReplicateLockNeverUsed(); } - @Test - public void shouldNotGetReplicateSinceIsNotFewBlocksAfterInitialization() { - Worker existingWorker = Worker.builder() - .id("1") - .walletAddress(WALLET_WORKER_1) - .cpuNb(2) - .teeEnabled(false) - .lastAliveDate(new Date()) - .build(); - - Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); - runningTask.setMaxExecutionTime(maxExecutionTime); - runningTask.changeStatus(RUNNING); - runningTask.setTag(NO_TEE_TAG); - runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); - - when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(initBlock + 1);//should be 2 - when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); - when(taskService.getInitializedOrRunningTasks()) - .thenReturn(Collections.singletonList(runningTask)); - when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true); - when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true); - when(replicatesService.hasWorkerAlreadyParticipated(CHAIN_TASK_ID, WALLET_WORKER_1)) - .thenReturn(false); - when(consensusService.doesTaskNeedMoreContributionsForConsensus(CHAIN_TASK_ID, runningTask.getTrust(), - runningTask.getMaxExecutionTime())).thenReturn(true); - when(smsService.getEnclaveChallenge(CHAIN_TASK_ID, false)).thenReturn(BytesUtils.EMPTY_ADDRESS); - when(signatureService.createAuthorization(WALLET_WORKER_1, CHAIN_TASK_ID, BytesUtils.EMPTY_ADDRESS)) - .thenReturn(new WorkerpoolAuthorization()); - - Optional oAuthorization = replicateSupplyService.getAuthOfAvailableReplicate(workerLastBlock, WALLET_WORKER_1); - - assertThat(oAuthorization).isEmpty(); - - Mockito.verify(replicatesService, Mockito.times(0)) - .addNewReplicate(CHAIN_TASK_ID, WALLET_WORKER_1); - Mockito.verify(workerService, Mockito.times(0)) - .addChainTaskIdToWorker(CHAIN_TASK_ID, WALLET_WORKER_1); - assertTaskAccessForNewReplicateNotDeadLocking(); - } - @Test public void shouldNotGetAnyReplicateSinceWorkerAlreadyParticipated() { Worker existingWorker = Worker.builder() @@ -256,14 +209,12 @@ public void shouldNotGetAnyReplicateSinceWorkerAlreadyParticipated() { .build(); Task runningTask1 = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask1.setInitializationBlockNumber(initBlock); runningTask1.setMaxExecutionTime(maxExecutionTime); runningTask1.changeStatus(RUNNING); runningTask1.setTag(NO_TEE_TAG); runningTask1.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true); when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true); when(taskService.getInitializedOrRunningTasks()) @@ -291,13 +242,11 @@ public void shouldNotGetReplicateSinceNeedsMoreContributionsForConsensus() { Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); runningTask.changeStatus(RUNNING); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.setTag(NO_TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true); when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true); when(taskService.getInitializedOrRunningTasks()) @@ -324,14 +273,12 @@ public void shouldNotGetReplicateSinceEnclaveChallengeNeededButNotGenerated() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -367,14 +314,12 @@ public void shouldGetOnlyOneReplicateSinceOtherOneReachedConsensusDeadline() { .build(); Task task1 = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - task1.setInitializationBlockNumber(initBlock); task1.setMaxExecutionTime(maxExecutionTime); task1.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); task1.changeStatus(RUNNING); task1.setTag(NO_TEE_TAG); Task taskDeadlineReached = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - taskDeadlineReached.setInitializationBlockNumber(initBlock); taskDeadlineReached.setMaxExecutionTime(maxExecutionTime); taskDeadlineReached.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), -60)); taskDeadlineReached.changeStatus(RUNNING); @@ -387,7 +332,6 @@ public void shouldGetOnlyOneReplicateSinceOtherOneReachedConsensusDeadline() { tasks.add(task1); tasks.add(taskDeadlineReached); when(taskService.getInitializedOrRunningTasks()).thenReturn(tasks); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); doNothing().when(contributionTimeoutTaskDetector).detect(); replicateSupplyService.getAuthOfAvailableReplicate(workerLastBlock, WALLET_WORKER_1); @@ -408,14 +352,12 @@ public void shouldNotGetReplicateWhenTaskAlreadyAccessed() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(NO_TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(true); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -450,14 +392,12 @@ public void shouldGetReplicateWithNoTee() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(NO_TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -493,14 +433,12 @@ public void shouldGetReplicateWithTee() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.getWorker(WALLET_WORKER_1)).thenReturn(Optional.of(existingWorker)); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -536,14 +474,12 @@ public void shouldTeeNeededTaskNotBeGivenToTeeDisabledWorker() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true); when(taskService.getInitializedOrRunningTasks()) .thenReturn(Collections.singletonList(runningTask)); @@ -571,14 +507,12 @@ public void shouldTeeNeededTaskBeGivenToTeeEnabledWorker() { .build(); Task runningTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - runningTask.setInitializationBlockNumber(initBlock); runningTask.setMaxExecutionTime(maxExecutionTime); runningTask.changeStatus(RUNNING); runningTask.setTag(TEE_TAG); runningTask.setContributionDeadline(DateTimeUtils.addMinutesToDate(new Date(), 60)); when(taskService.isTaskBeingAccessedForNewReplicate(CHAIN_TASK_ID)).thenReturn(false); - when(web3jService.getLatestBlockNumber()).thenReturn(coreLastBlock); when(workerService.canAcceptMoreWorks(WALLET_WORKER_1)).thenReturn(true); when(web3jService.hasEnoughGas(WALLET_WORKER_1)).thenReturn(true); when(taskService.getInitializedOrRunningTasks()) @@ -632,7 +566,6 @@ public void shouldNotGetInterruptedReplicateSinceEnclaveChallengeNeededButNotGen List ids = Arrays.asList(CHAIN_TASK_ID); Task teeTask = new Task(DAPP_NAME, COMMAND_LINE, 5, CHAIN_TASK_ID); - teeTask.setInitializationBlockNumber(initBlock); Optional noTeeReplicate = getStubReplicate(ReplicateStatus.COMPUTING); teeTask.setTag(TEE_TAG); From 6a7ea6459b69d6d764b81c34740d412d3adec1c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20James=20Toussaint?= Date: Mon, 18 Oct 2021 09:54:57 +0200 Subject: [PATCH 4/4] Bump version to 6.1.5 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 8d5df0149..7d5337ee3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -version=6.1.4 +version=6.1.5 iexecCommonVersion=5.5.1 nexusUser=fake nexusPassword=fake