Skip to content

Commit cbde5d2

Browse files
authored
feat: migrate from ReplicateStatusCause to WorkflowError (#662)
1 parent a39f5ce commit cbde5d2

29 files changed

+381
-349
lines changed

src/main/java/com/iexec/worker/chain/ContributionService.java

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616

1717
package com.iexec.worker.chain;
1818

19-
import com.iexec.common.replicate.ReplicateStatusCause;
2019
import com.iexec.common.result.ComputedFile;
2120
import com.iexec.commons.poco.chain.*;
2221
import com.iexec.commons.poco.task.TaskDescription;
2322
import com.iexec.commons.poco.utils.BytesUtils;
2423
import com.iexec.commons.poco.utils.HashUtils;
24+
import com.iexec.worker.workflow.WorkflowError;
2525
import lombok.extern.slf4j.Slf4j;
2626
import org.springframework.stereotype.Service;
2727
import org.web3j.protocol.core.methods.response.Log;
@@ -56,63 +56,63 @@ public boolean isChainTaskInitialized(String chainTaskId) {
5656
return iexecHubService.getTaskDescription(chainTaskId) != null;
5757
}
5858

59-
public List<ReplicateStatusCause> getCannotContributeStatusCause(final String chainTaskId) {
60-
final List<ReplicateStatusCause> causes = new ArrayList<>();
59+
public List<WorkflowError> getCannotContributeStatusCause(final String chainTaskId) {
60+
final List<WorkflowError> errors = new ArrayList<>();
6161

6262
if (!isWorkerpoolAuthorizationPresent(chainTaskId)) {
63-
causes.add(WORKERPOOL_AUTHORIZATION_NOT_FOUND);
63+
errors.add(new WorkflowError(WORKERPOOL_AUTHORIZATION_NOT_FOUND));
6464
}
6565

6666
final TaskDescription taskDescription = iexecHubService.getTaskDescription(chainTaskId);
6767

6868
final ChainTask chainTask = iexecHubService.getChainTask(chainTaskId).orElse(null);
6969
if (chainTask == null) {
70-
causes.add(CHAIN_UNREACHABLE);
71-
return causes;
70+
errors.add(new WorkflowError(CHAIN_UNREACHABLE));
71+
return errors;
7272
}
7373

7474
// No staking in contributeAndFinalize
7575
if (taskDescription != null && !taskDescription.isEligibleToContributeAndFinalize()
7676
&& !hasEnoughStakeToContribute(chainTask)) {
77-
causes.add(STAKE_TOO_LOW);
77+
errors.add(new WorkflowError(STAKE_TOO_LOW));
7878
}
7979

8080
if (chainTask.getStatus() != ChainTaskStatus.ACTIVE) {
81-
causes.add(TASK_NOT_ACTIVE);
81+
errors.add(new WorkflowError(TASK_NOT_ACTIVE));
8282
}
8383

8484
if (chainTask.isContributionDeadlineReached()) {
85-
causes.add(CONTRIBUTION_TIMEOUT);
85+
errors.add(new WorkflowError(CONTRIBUTION_TIMEOUT));
8686
}
8787

8888
if (chainTask.hasContributionFrom(workerWalletAddress)) {
89-
causes.add(CONTRIBUTION_ALREADY_SET);
89+
errors.add(new WorkflowError(CONTRIBUTION_ALREADY_SET));
9090
}
9191

92-
return causes;
92+
return errors;
9393
}
9494

95-
public List<ReplicateStatusCause> getCannotContributeAndFinalizeStatusCause(final String chainTaskId) {
96-
final List<ReplicateStatusCause> causes = new ArrayList<>();
95+
public List<WorkflowError> getCannotContributeAndFinalizeStatusCause(final String chainTaskId) {
96+
final List<WorkflowError> errors = new ArrayList<>();
9797

9898
// check TRUST is 1
9999
final TaskDescription taskDescription = iexecHubService.getTaskDescription(chainTaskId);
100100
if (taskDescription == null || !BigInteger.ONE.equals(taskDescription.getTrust())) {
101-
causes.add(TRUST_NOT_1);
101+
errors.add(new WorkflowError(TRUST_NOT_1));
102102
}
103103

104104
final ChainTask chainTask = iexecHubService.getChainTask(chainTaskId).orElse(null);
105105
if (chainTask == null) {
106-
causes.add(CHAIN_UNREACHABLE);
107-
return causes;
106+
errors.add(new WorkflowError(CHAIN_UNREACHABLE));
107+
return errors;
108108
}
109109

110110
// check TASK_ALREADY_CONTRIBUTED
111111
if (chainTask.hasContributions()) {
112-
causes.add(TASK_ALREADY_CONTRIBUTED);
112+
errors.add(new WorkflowError(TASK_ALREADY_CONTRIBUTED));
113113
}
114114

115-
return causes;
115+
return errors;
116116
}
117117

118118
private boolean isWorkerpoolAuthorizationPresent(String chainTaskId) {

src/main/java/com/iexec/worker/compute/ComputeController.java

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,18 @@
1717
package com.iexec.worker.compute;
1818

1919

20-
import com.iexec.common.replicate.ReplicateStatusCause;
2120
import com.iexec.common.result.ComputedFile;
2221
import com.iexec.common.worker.api.ExitMessage;
2322
import com.iexec.worker.chain.WorkerpoolAuthorizationService;
2423
import com.iexec.worker.result.ResultService;
24+
import com.iexec.worker.workflow.WorkflowError;
2525
import org.springframework.http.HttpStatus;
2626
import org.springframework.http.ResponseEntity;
2727
import org.springframework.web.bind.annotation.*;
2828

2929
import java.util.List;
3030
import java.util.NoSuchElementException;
31+
import java.util.Optional;
3132

3233
import static org.springframework.http.ResponseEntity.ok;
3334

@@ -57,16 +58,19 @@ public ResponseEntity<Void> sendExitCauseForGivenComputeStage(
5758
@PathVariable ComputeStage stage,
5859
@PathVariable String chainTaskId,
5960
@RequestBody ExitMessage exitMessage) {
60-
List<ReplicateStatusCause> causes = exitMessage != null && exitMessage.cause() != null ? List.of(exitMessage.cause()) : List.of();
61-
return sendExitCausesForGivenComputeStage(authorization, stage, chainTaskId, causes);
61+
final List<WorkflowError> errors = Optional.ofNullable(exitMessage)
62+
.map(ExitMessage::cause)
63+
.map(WorkflowError::new)
64+
.stream().toList();
65+
return sendExitCausesForGivenComputeStage(authorization, stage, chainTaskId, errors);
6266
}
6367

6468
@PostMapping("/compute/{stage}/{chainTaskId}/exit-causes")
6569
public ResponseEntity<Void> sendExitCausesForGivenComputeStage(
6670
@RequestHeader("Authorization") String authorization,
6771
@PathVariable ComputeStage stage,
6872
@PathVariable String chainTaskId,
69-
@RequestBody List<ReplicateStatusCause> causes) {
73+
@RequestBody List<WorkflowError> errors) {
7074
try {
7175
if (!workerpoolAuthorizationService.isSignedWithEnclaveChallenge(chainTaskId, authorization)) {
7276
return ResponseEntity
@@ -79,13 +83,13 @@ public ResponseEntity<Void> sendExitCausesForGivenComputeStage(
7983
.build();
8084
}
8185

82-
if (causes == null || causes.isEmpty()) {
86+
if (errors == null || errors.isEmpty()) {
8387
return ResponseEntity
8488
.status(HttpStatus.BAD_REQUEST.value())
8589
.build();
8690
}
8791

88-
final boolean stored = computeStageExitService.setExitCausesForGivenComputeStage(chainTaskId, stage, causes);
92+
final boolean stored = computeStageExitService.setExitCausesForGivenComputeStage(chainTaskId, stage, errors);
8993

9094
if (!stored) {
9195
return ResponseEntity

src/main/java/com/iexec/worker/compute/ComputeExitCauseService.java

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package com.iexec.worker.compute;
1818

19-
import com.iexec.common.replicate.ReplicateStatusCause;
19+
import com.iexec.worker.workflow.WorkflowError;
2020
import lombok.extern.slf4j.Slf4j;
2121
import org.springframework.stereotype.Service;
2222

@@ -28,20 +28,20 @@
2828
@Service
2929
public class ComputeExitCauseService {
3030

31-
private final HashMap<String, List<ReplicateStatusCause>> exitCauseMap = new HashMap<>();
31+
private final HashMap<String, List<WorkflowError>> exitCauseMap = new HashMap<>();
3232

3333
/**
3434
* Report failure exit causes from pre-compute or post-compute enclave.
3535
* Guarantees that exit causes can only be reported once per compute stage and task.
3636
*
3737
* @param computeStage pre-compute or post-compute-stage label
3838
* @param chainTaskId task ID
39-
* @param causes list of root causes of the failure
39+
* @param errors list of workflow errors describing the failure
4040
* @return true if exit causes are reported, false if already reported
4141
*/
4242
boolean setExitCausesForGivenComputeStage(final String chainTaskId,
4343
final ComputeStage computeStage,
44-
final List<ReplicateStatusCause> causes) {
44+
final List<WorkflowError> errors) {
4545
final String key = buildKey(computeStage, chainTaskId);
4646

4747
if (exitCauseMap.containsKey(key)) {
@@ -50,9 +50,9 @@ boolean setExitCausesForGivenComputeStage(final String chainTaskId,
5050
return false;
5151
}
5252

53-
exitCauseMap.put(key, List.copyOf(causes));
53+
exitCauseMap.put(key, List.copyOf(errors));
5454
log.info("Added exit causes [chainTaskId:{}, computeStage:{}, causeCount:{}]",
55-
chainTaskId, computeStage, causes.size());
55+
chainTaskId, computeStage, errors.size());
5656
return true;
5757
}
5858

@@ -62,23 +62,23 @@ boolean setExitCausesForGivenComputeStage(final String chainTaskId,
6262
*
6363
* @param computeStage compute stage
6464
* @param chainTaskId task ID
65-
* @param fallbackCause default cause to return if no specific causes are found
66-
* @return list of exit causes, or default unknown issue if not found
65+
* @param fallbackError default error to return if no specific causes are found
66+
* @return list of workflow errors, or default unknown issue if not found
6767
*/
68-
public List<ReplicateStatusCause> getExitCausesAndPruneForGivenComputeStage(
68+
public List<WorkflowError> getExitCausesAndPruneForGivenComputeStage(
6969
final String chainTaskId,
7070
final ComputeStage computeStage,
71-
final ReplicateStatusCause fallbackCause) {
71+
final WorkflowError fallbackError) {
7272
final String key = buildKey(computeStage, chainTaskId);
73-
final List<ReplicateStatusCause> causes = exitCauseMap.remove(key);
74-
if (causes != null) {
73+
final List<WorkflowError> errors = exitCauseMap.remove(key);
74+
if (errors != null) {
7575
log.info("Retrieved and pruned exit causes [chainTaskId:{} computeStage:{}, causeCount:{}]",
76-
chainTaskId, computeStage, causes.size());
77-
return causes;
76+
chainTaskId, computeStage, errors.size());
77+
return errors;
7878
} else {
7979
log.info("No exit causes found, returning fallback cause [chainTaskId:{}, computeStage:{}]",
8080
chainTaskId, computeStage);
81-
return List.of(fallbackCause);
81+
return List.of(fallbackError);
8282
}
8383
}
8484

src/main/java/com/iexec/worker/compute/ComputeManagerService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import com.iexec.worker.docker.DockerRegistryConfiguration;
3434
import com.iexec.worker.docker.DockerService;
3535
import com.iexec.worker.result.ResultService;
36+
import com.iexec.worker.workflow.WorkflowError;
3637
import lombok.extern.slf4j.Slf4j;
3738
import org.springframework.stereotype.Service;
3839

@@ -230,7 +231,7 @@ public PostComputeResponse runPostCompute(final TaskDescription taskDescription,
230231
postComputeResponse = postComputeService.runTeePostCompute(taskDescription, secureSession);
231232
} else {
232233
postComputeResponse = PostComputeResponse.builder()
233-
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_FAILED_UNKNOWN_ISSUE))
234+
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_FAILED_UNKNOWN_ISSUE)))
234235
.build();
235236
}
236237
if (!postComputeResponse.isSuccessful()) {
@@ -239,15 +240,15 @@ public PostComputeResponse runPostCompute(final TaskDescription taskDescription,
239240
final ComputedFile computedFile = resultService.readComputedFile(chainTaskId);
240241
if (computedFile == null) {
241242
return PostComputeResponse.builder()
242-
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_COMPUTED_FILE_NOT_FOUND))
243+
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_COMPUTED_FILE_NOT_FOUND)))
243244
.stdout(postComputeResponse.getStdout())
244245
.stderr(postComputeResponse.getStderr())
245246
.build();
246247
}
247248
final String resultDigest = resultService.computeResultDigest(computedFile);
248249
if (resultDigest.isEmpty()) {
249250
return PostComputeResponse.builder()
250-
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_RESULT_DIGEST_COMPUTATION_FAILED))
251+
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_RESULT_DIGEST_COMPUTATION_FAILED)))
251252
.stdout(postComputeResponse.getStdout())
252253
.stderr(postComputeResponse.getStderr())
253254
.build();

src/main/java/com/iexec/worker/compute/ComputeResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,13 @@
1616

1717
package com.iexec.worker.compute;
1818

19-
import com.iexec.common.replicate.ReplicateStatusCause;
19+
import com.iexec.worker.workflow.WorkflowError;
2020

2121
import java.util.List;
2222

2323
public interface ComputeResponse {
2424

25-
List<ReplicateStatusCause> getExitCauses();
25+
List<WorkflowError> getExitCauses();
2626

2727
String getStdout();
2828

src/main/java/com/iexec/worker/compute/app/AppComputeResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.iexec.worker.compute.app;
1818

19-
import com.iexec.common.replicate.ReplicateStatusCause;
2019
import com.iexec.worker.compute.ComputeResponse;
20+
import com.iexec.worker.workflow.WorkflowError;
2121
import lombok.Builder;
2222
import lombok.Value;
2323

@@ -28,7 +28,7 @@
2828
public class AppComputeResponse implements ComputeResponse {
2929

3030
@Builder.Default
31-
List<ReplicateStatusCause> exitCauses = List.of();
31+
List<WorkflowError> exitCauses = List.of();
3232
String stdout;
3333
String stderr;
3434
int exitCode;

src/main/java/com/iexec/worker/compute/app/AppComputeService.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.iexec.worker.sgx.SgxService;
3333
import com.iexec.worker.tee.TeeService;
3434
import com.iexec.worker.tee.TeeServicesManager;
35+
import com.iexec.worker.workflow.WorkflowError;
3536
import org.springframework.stereotype.Service;
3637

3738
import java.time.Duration;
@@ -119,10 +120,10 @@ private String getTaskContainerName(final String chainTaskId) {
119120
return workerConfigService.getWorkerName() + "-" + chainTaskId;
120121
}
121122

122-
private List<ReplicateStatusCause> getExitCauseFromFinalStatus(final DockerRunFinalStatus finalStatus) {
123+
private List<WorkflowError> getExitCauseFromFinalStatus(final DockerRunFinalStatus finalStatus) {
123124
return switch (finalStatus) {
124-
case TIMEOUT -> List.of(ReplicateStatusCause.APP_COMPUTE_TIMEOUT);
125-
case FAILED -> List.of(ReplicateStatusCause.APP_COMPUTE_FAILED);
125+
case TIMEOUT -> List.of(new WorkflowError(ReplicateStatusCause.APP_COMPUTE_TIMEOUT));
126+
case FAILED -> List.of(new WorkflowError(ReplicateStatusCause.APP_COMPUTE_FAILED));
126127
default -> List.of();
127128
};
128129
}

src/main/java/com/iexec/worker/compute/post/PostComputeResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616

1717
package com.iexec.worker.compute.post;
1818

19-
import com.iexec.common.replicate.ReplicateStatusCause;
2019
import com.iexec.worker.compute.ComputeResponse;
20+
import com.iexec.worker.workflow.WorkflowError;
2121
import lombok.Builder;
2222
import lombok.Value;
2323

@@ -28,7 +28,7 @@
2828
public class PostComputeResponse implements ComputeResponse {
2929

3030
@Builder.Default
31-
List<ReplicateStatusCause> exitCauses = List.of();
31+
List<WorkflowError> exitCauses = List.of();
3232
String stdout;
3333
String stderr;
3434
}

0 commit comments

Comments
 (0)