Skip to content

Commit 3f31f71

Browse files
Merge pull request #358 from iExecBlockchainComputing/release/4.0.1
Release/4.0.1
2 parents 22aabc4 + e2ab909 commit 3f31f71

16 files changed

+118
-75
lines changed

Jenkinsfile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ pipeline {
2222

2323
stage('Upload Jars') {
2424
when {
25-
branch 'master'
25+
anyOf{
26+
branch 'master'
27+
branch 'develop'
28+
}
2629
}
2730
steps {
2831
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'nexus', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PASSWORD']]) {
@@ -32,7 +35,10 @@ pipeline {
3235
}
3336
stage('Build/Upload Docker image') {
3437
when {
35-
branch 'master'
38+
anyOf{
39+
branch 'master'
40+
branch 'develop'
41+
}
3642
}
3743
steps {
3844
withCredentials([[$class: 'UsernamePasswordMultiBinding', credentialsId: 'nexus', usernameVariable: 'NEXUS_USER', passwordVariable: 'NEXUS_PASSWORD']]) {

build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,8 @@ build.dependsOn jacocoTestReport
120120

121121
def gitBranch = 'git name-rev --name-only HEAD'.execute().text.trim()
122122
def isMasterBranch = gitBranch == "master"
123-
def canUploadArchives = isMasterBranch && project.hasProperty("nexusUser") && project.hasProperty("nexusPassword")
123+
def isDevelopBranch = gitBranch == "develop"
124+
def canUploadArchives = (isMasterBranch || isDevelopBranch ) && project.hasProperty("nexusUser") && project.hasProperty("nexusPassword")
124125
def gitShortCommit = 'git rev-parse --short HEAD'.execute().text.trim()
125126
def isSnapshotVersion = project.version.contains("SNAPSHOT")
126127

gradle.properties

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
iexecCommonVersion=4.1.0-SNAPSHOT
1+
iexecCommonVersion=4.0.1
22
nexusUser=fake
33
nexusPassword=fake
4-
version=4.1.0-SNAPSHOT
4+
version=4.0.1

src/main/java/com/iexec/core/chain/IexecHubService.java

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.web3j.protocol.core.DefaultBlockParameter;
1212
import org.web3j.protocol.core.DefaultBlockParameterName;
1313
import org.web3j.protocol.core.RemoteCall;
14+
import org.web3j.protocol.core.methods.response.BaseEventResponse;
1415
import org.web3j.protocol.core.methods.response.TransactionReceipt;
1516

1617
import java.math.BigInteger;
@@ -23,7 +24,8 @@
2324
import java.util.concurrent.Executors;
2425
import java.util.concurrent.ThreadPoolExecutor;
2526

26-
import static com.iexec.common.chain.ChainContributionStatus.*;
27+
import static com.iexec.common.chain.ChainContributionStatus.CONTRIBUTED;
28+
import static com.iexec.common.chain.ChainContributionStatus.REVEALED;
2729
import static com.iexec.common.chain.ChainTaskStatus.ACTIVE;
2830
import static com.iexec.common.chain.ChainTaskStatus.COMPLETED;
2931
import static com.iexec.common.utils.BytesUtils.stringToBytes;
@@ -33,6 +35,8 @@
3335
@Service
3436
public class IexecHubService extends IexecHubAbstractService {
3537

38+
private final static int NB_BLOCKS_TO_WAIT_PER_TRY = 6;
39+
private final static int MAX_TRY = 3;
3640
private final ThreadPoolExecutor executor;
3741
private final CredentialsService credentialsService;
3842
private final Web3jService web3jService;
@@ -49,8 +53,25 @@ public IexecHubService(CredentialsService credentialsService,
4953
this.poolAddress = chainConfig.getPoolAddress();
5054
}
5155

52-
public boolean isStatusTrueOnChain(String chainTaskId, String walletAddress, ChainContributionStatus wishedStatus) {
56+
public boolean repeatIsContributedTrue(String chainTaskId, String walletAddress) {
57+
return web3jService.repeatCheck(NB_BLOCKS_TO_WAIT_PER_TRY, MAX_TRY, "isContributedTrue",
58+
this::isContributedTrue, chainTaskId, walletAddress);
59+
}
5360

61+
public boolean repeatIsRevealedTrue(String chainTaskId, String walletAddress) {
62+
return web3jService.repeatCheck(NB_BLOCKS_TO_WAIT_PER_TRY, MAX_TRY, "isRevealedTrue",
63+
this::isRevealedTrue, chainTaskId, walletAddress);
64+
}
65+
66+
private boolean isContributedTrue(String... args) {
67+
return this.isStatusTrueOnChain(args[0], args[1], CONTRIBUTED);
68+
}
69+
70+
private boolean isRevealedTrue(String... args) {
71+
return this.isStatusTrueOnChain(args[0], args[1], REVEALED);
72+
}
73+
74+
public boolean isStatusTrueOnChain(String chainTaskId, String walletAddress, ChainContributionStatus wishedStatus) {
5475
Optional<ChainContribution> optional = getChainContribution(chainTaskId, walletAddress);
5576
if (!optional.isPresent()) {
5677
return false;
@@ -60,23 +81,14 @@ public boolean isStatusTrueOnChain(String chainTaskId, String walletAddress, Cha
6081
ChainContributionStatus chainStatus = chainContribution.getStatus();
6182
switch (wishedStatus) {
6283
case CONTRIBUTED:
63-
if (chainStatus.equals(UNSET)) {
64-
return false;
65-
} else {
66-
// has at least contributed
67-
return chainStatus.equals(CONTRIBUTED) || chainStatus.equals(REVEALED);
68-
}
84+
// has at least contributed
85+
return chainStatus.equals(CONTRIBUTED) || chainStatus.equals(REVEALED);
6986
case REVEALED:
70-
if (chainStatus.equals(CONTRIBUTED)) {
71-
return false;
72-
} else {
73-
// has at least revealed
74-
return chainStatus.equals(REVEALED);
75-
}
87+
// has at least revealed
88+
return chainStatus.equals(REVEALED);
7689
default:
77-
break;
90+
return false;
7891
}
79-
return false;
8092
}
8193

8294
public boolean canInitialize(String chainDealId, int taskIndex) {
@@ -142,9 +154,7 @@ private Optional<Pair<String, ChainReceipt>> sendInitializeTransaction(String ch
142154
initializeEvent = initializeEvents.get(0);
143155
}
144156

145-
if (initializeEvent != null && initializeEvent.log != null &&
146-
(!initializeEvent.log.getType().equals(PENDING_RECEIPT_STATUS)
147-
|| isStatusValidOnChainAfterPendingReceipt(computedChainTaskId, ACTIVE, this::isTaskStatusValidOnChain))) {
157+
if (isSuccessTx(computedChainTaskId, initializeEvent, ACTIVE)) {
148158
String chainTaskId = BytesUtils.bytesToString(initializeEvent.taskid);
149159

150160
ChainReceipt chainReceipt = ChainUtils.buildChainReceipt(initializeEvent.log, chainTaskId, web3jService.getLatestBlockNumber());
@@ -218,9 +228,7 @@ private Optional<ChainReceipt> sendFinalizeTransaction(String chainTaskId, Strin
218228
finalizeEvent = finalizeEvents.get(0);
219229
}
220230

221-
if (finalizeEvent != null && finalizeEvent.log != null &&
222-
(!finalizeEvent.log.getType().equals(PENDING_RECEIPT_STATUS)
223-
|| isStatusValidOnChainAfterPendingReceipt(chainTaskId, COMPLETED, this::isTaskStatusValidOnChain))) {
231+
if (isSuccessTx(chainTaskId, finalizeEvent, COMPLETED)) {
224232
ChainReceipt chainReceipt = ChainUtils.buildChainReceipt(finalizeEvents.get(0).log, chainTaskId, web3jService.getLatestBlockNumber());
225233

226234
log.info("Finalized [chainTaskId:{}, resultLink:{}, callbackData:{}, shouldSendCallback:{}, gasUsed:{}]", chainTaskId,
@@ -232,6 +240,18 @@ private Optional<ChainReceipt> sendFinalizeTransaction(String chainTaskId, Strin
232240
return Optional.empty();
233241
}
234242

243+
private boolean isSuccessTx(String chainTaskId, BaseEventResponse txEvent, ChainTaskStatus pretendedStatus) {
244+
if (txEvent == null || txEvent.log == null) {
245+
return false;
246+
}
247+
248+
if (txEvent.log.getType() == null || txEvent.log.getType().equals(PENDING_RECEIPT_STATUS)) {
249+
return isStatusValidOnChainAfterPendingReceipt(chainTaskId, pretendedStatus, this::isTaskStatusValidOnChain);
250+
}
251+
252+
return true;
253+
}
254+
235255
public boolean canReopen(String chainTaskId) {
236256
Optional<ChainTask> optional = getChainTask(chainTaskId);
237257
if (!optional.isPresent()) {

src/main/java/com/iexec/core/detector/replicate/ContributionUnnotifiedDetector.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@ public void detectOnchainContributedWhenOffchainContributing() {
6161
public void detectOnchainContributed() {
6262
log.debug("Detect onchain Contributed [retryIn:{}]",
6363
coreConfigurationService.getUnnotifiedContributionDetectorPeriod() * DETECTOR_MULTIPLIER);
64-
6564
dectectOnchainCompleted(dectectWhenOffchainTaskStatuses, offchainCompleting, offchainCompleted, onchainCompleted);
6665
}
6766

src/main/java/com/iexec/core/detector/replicate/RevealUnnotifiedDetector.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public RevealUnnotifiedDetector(TaskService taskService,
4646
@Scheduled(fixedRateString = "#{coreConfigurationService.unnotifiedRevealDetectorPeriod}")
4747
public void detectOnchainRevealedWhenOffchainRevealed() {
4848
log.debug("Detect onchain Revealed (when offchain Revealing) [retryIn:{}]",
49-
coreConfigurationService.getUnnotifiedContributionDetectorPeriod());
49+
coreConfigurationService.getUnnotifiedRevealDetectorPeriod());
5050
dectectOnchainCompletedWhenOffchainCompleting(dectectWhenTaskStatuses, offchainCompleting, offchainCompleted, onchainCompleted);
5151
}
5252

@@ -60,7 +60,7 @@ public void detectOnchainRevealedWhenOffchainRevealed() {
6060
@Scheduled(fixedRateString = "#{coreConfigurationService.unnotifiedRevealDetectorPeriod*" + DETECTOR_MULTIPLIER + "}")
6161
public void detectOnchainRevealed() {
6262
log.debug("Detect onchain Revealed [retryIn:{}]",
63-
coreConfigurationService.getUnnotifiedContributionDetectorPeriod() * DETECTOR_MULTIPLIER);
63+
coreConfigurationService.getUnnotifiedRevealDetectorPeriod() * DETECTOR_MULTIPLIER);
6464
dectectOnchainCompleted(dectectWhenTaskStatuses, offchainCompleting, offchainCompleted, onchainCompleted);
6565
}
6666

src/main/java/com/iexec/core/detector/replicate/UnnotifiedAbstractDetector.java

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.iexec.core.detector.replicate;
22

3+
import com.iexec.common.chain.ChainContribution;
34
import com.iexec.common.chain.ChainContributionStatus;
45
import com.iexec.common.chain.ChainReceipt;
56
import com.iexec.common.replicate.ReplicateStatus;
@@ -11,15 +12,15 @@
1112
import com.iexec.core.task.Task;
1213
import com.iexec.core.task.TaskService;
1314
import com.iexec.core.task.TaskStatus;
14-
import org.springframework.stereotype.Service;
15+
import lombok.extern.slf4j.Slf4j;
1516

1617
import java.util.List;
1718
import java.util.Optional;
1819

1920
import static com.iexec.common.replicate.ReplicateStatus.WORKER_LOST;
2021
import static com.iexec.common.replicate.ReplicateStatus.getMissingStatuses;
2122

22-
@Service
23+
@Slf4j
2324
public abstract class UnnotifiedAbstractDetector {
2425

2526

@@ -42,22 +43,18 @@ void dectectOnchainCompletedWhenOffchainCompleting(List<TaskStatus> dectectWhenO
4243
ReplicateStatus offchainCompleting,
4344
ReplicateStatus offchainCompleted,
4445
ChainContributionStatus onchainCompleted) {
45-
4646
for (Task task : taskService.findByCurrentStatus(dectectWhenOffchainTaskStatuses)) {
4747
for (Replicate replicate : replicatesService.getReplicates(task.getChainTaskId())) {
4848
Optional<ReplicateStatus> lastRelevantStatus = replicate.getLastRelevantStatus();
49-
50-
if (!lastRelevantStatus.isPresent()) {
49+
if (!lastRelevantStatus.isPresent() || !lastRelevantStatus.get().equals(offchainCompleting)) {
5150
continue;
5251
}
5352

54-
boolean isReplicateStatusCompleting = lastRelevantStatus.get().equals(offchainCompleting);
55-
56-
boolean isReplicateStatusCompletingAndStatusTrueOnchain = isReplicateStatusCompleting &&
57-
iexecHubService.isStatusTrueOnChain(task.getChainTaskId(), replicate.getWalletAddress(),
58-
onchainCompleted);
53+
boolean statusTrueOnChain = iexecHubService.isStatusTrueOnChain(task.getChainTaskId(), replicate.getWalletAddress(), onchainCompleted);
5954

60-
if (isReplicateStatusCompletingAndStatusTrueOnchain) {
55+
if (statusTrueOnChain) {
56+
log.info("Detected confirmed missing update (replicate) [is:{}, should:{}, taskId:{}]",
57+
lastRelevantStatus.get(), onchainCompleted, task.getChainTaskId());
6158
updateReplicateStatuses(task.getChainTaskId(), replicate, offchainCompleted);
6259
}
6360
}
@@ -72,19 +69,32 @@ void dectectOnchainCompleted(List<TaskStatus> dectectWhenOffchainTaskStatuses,
7269
for (Replicate replicate : replicatesService.getReplicates(task.getChainTaskId())) {
7370
Optional<ReplicateStatus> lastRelevantStatus = replicate.getLastRelevantStatus();
7471

75-
if (!lastRelevantStatus.isPresent()) {
72+
if (!lastRelevantStatus.isPresent() || lastRelevantStatus.get().equals(offchainCompleted)) {
7673
continue;
7774
}
7875

79-
boolean isNotOffChainCompleted = !lastRelevantStatus.get().equals(offchainCompleted);//avoid eth node call if already contributed
76+
boolean statusTrueOnChain = iexecHubService.isStatusTrueOnChain(task.getChainTaskId(), replicate.getWalletAddress(), onchainCompleted);
8077

81-
if (isNotOffChainCompleted && iexecHubService.isStatusTrueOnChain(task.getChainTaskId(), replicate.getWalletAddress(), onchainCompleted)) {
78+
if (statusTrueOnChain) {
79+
log.info("Detected confirmed missing update (replicate) [is:{}, should:{}, taskId:{}]",
80+
lastRelevantStatus.get(), onchainCompleted, task.getChainTaskId());
8281
updateReplicateStatuses(task.getChainTaskId(), replicate, offchainCompleted);
8382
}
8483
}
8584
}
8685
}
8786

87+
/*
88+
* Usage: printLogsUncertainMissingUpdate(task, replicate, lastRelevantStatus.get(), statusTrueOnChain);
89+
* */
90+
private void printLogsUncertainMissingUpdate(Task task, Replicate replicate, ReplicateStatus lastRelevantStatus, boolean statusTrueOnChain) {
91+
ChainContributionStatus chainContributionStatus = iexecHubService.getChainContribution(task.getChainTaskId(), replicate.getWalletAddress())
92+
.map(ChainContribution::getStatus)
93+
.orElse(null);
94+
log.info("Detected uncertain missing update (replicate) [off:{}, on:{}, statusTrueOnChain:{}, taskId:{}]",
95+
lastRelevantStatus, chainContributionStatus, statusTrueOnChain, task.getChainTaskId());
96+
}
97+
8898
/*
8999
* This method should stay private. We need to insure that
90100
* it is only called by the POOL_MANAGER.
@@ -110,7 +120,7 @@ private void updateReplicateStatuses(String chainTaskId, Replicate replicate, Re
110120
// retrieve the contribution block for that wallet
111121
ChainReceipt contributedBlock = iexecHubService.getContributionBlock(chainTaskId,
112122
wallet, web3jService.getLatestBlockNumber());
113-
long contributedBlockNumber = contributedBlock != null ? contributedBlock.getBlockNumber(): 0;
123+
long contributedBlockNumber = contributedBlock != null ? contributedBlock.getBlockNumber() : 0;
114124
replicatesService.updateReplicateStatus(chainTaskId, wallet,
115125
statusToUpdate, new ReplicateStatusDetails(contributedBlockNumber));
116126
break;

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public class FinalizedTaskDetector implements Detector {
2323
private IexecHubService iexecHubService;
2424

2525
public FinalizedTaskDetector(TaskService taskService,
26-
TaskExecutorEngine taskExecutorEngine,
27-
IexecHubService iexecHubService) {
26+
TaskExecutorEngine taskExecutorEngine,
27+
IexecHubService iexecHubService) {
2828
this.taskService = taskService;
2929
this.taskExecutorEngine = taskExecutorEngine;
3030
this.iexecHubService = iexecHubService;
@@ -40,6 +40,8 @@ public void detect() {
4040
for (Task task : taskService.findByCurrentStatus(TaskStatus.FINALIZING)) {
4141
Optional<ChainTask> chainTask = iexecHubService.getChainTask(task.getChainTaskId());
4242
if (chainTask.isPresent() && chainTask.get().getStatus().equals(ChainTaskStatus.COMPLETED)) {
43+
log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]",
44+
TaskStatus.FINALIZING, TaskStatus.FINALIZED, task.getChainTaskId());
4345
taskExecutorEngine.updateTask(task.getChainTaskId());
4446
}
4547
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,9 @@ public void detect() {
3939
log.debug("Trying to detect initialized tasks");
4040
for (Task task : taskService.findByCurrentStatus(TaskStatus.INITIALIZING)) {
4141
Optional<ChainTask> chainTask = iexecHubService.getChainTask(task.getChainTaskId());
42-
if(chainTask.isPresent() && !chainTask.get().getStatus().equals(ChainTaskStatus.UNSET)) {
42+
if (chainTask.isPresent() && !chainTask.get().getStatus().equals(ChainTaskStatus.UNSET)) {
43+
log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]",
44+
TaskStatus.INITIALIZING, TaskStatus.INITIALIZED, task.getChainTaskId());
4345
taskExecutorEngine.updateTask(task.getChainTaskId());
4446
}
4547
}

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,14 @@ public void detect() {
3939
log.debug("Trying to detect reopened tasks");
4040
for (Task task : taskService.findByCurrentStatus(TaskStatus.REOPENING)) {
4141
Optional<ChainTask> oChainTask = iexecHubService.getChainTask(task.getChainTaskId());
42-
if (!oChainTask.isPresent()){
42+
if (!oChainTask.isPresent()) {
4343
continue;
4444
}
4545

4646
ChainTask chainTask = oChainTask.get();
4747
if (chainTask.getStatus().equals(ChainTaskStatus.ACTIVE)) {
48+
log.info("Detected confirmed missing update (task) [is:{}, should:{}, taskId:{}]",
49+
TaskStatus.REOPENING, TaskStatus.REOPENED, task.getChainTaskId());
4850
taskExecutorEngine.updateTask(task.getChainTaskId());
4951
}
5052
}

0 commit comments

Comments
 (0)