Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 18 additions & 18 deletions src/main/java/com/iexec/worker/chain/ContributionService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@

package com.iexec.worker.chain;

import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.common.result.ComputedFile;
import com.iexec.commons.poco.chain.*;
import com.iexec.commons.poco.task.TaskDescription;
import com.iexec.commons.poco.utils.BytesUtils;
import com.iexec.commons.poco.utils.HashUtils;
import com.iexec.worker.workflow.WorkflowError;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.web3j.protocol.core.methods.response.Log;
Expand Down Expand Up @@ -56,63 +56,63 @@ public boolean isChainTaskInitialized(String chainTaskId) {
return iexecHubService.getTaskDescription(chainTaskId) != null;
}

public List<ReplicateStatusCause> getCannotContributeStatusCause(final String chainTaskId) {
final List<ReplicateStatusCause> causes = new ArrayList<>();
public List<WorkflowError> getCannotContributeStatusCause(final String chainTaskId) {
final List<WorkflowError> errors = new ArrayList<>();

if (!isWorkerpoolAuthorizationPresent(chainTaskId)) {
causes.add(WORKERPOOL_AUTHORIZATION_NOT_FOUND);
errors.add(new WorkflowError(WORKERPOOL_AUTHORIZATION_NOT_FOUND));
}

final TaskDescription taskDescription = iexecHubService.getTaskDescription(chainTaskId);

final ChainTask chainTask = iexecHubService.getChainTask(chainTaskId).orElse(null);
if (chainTask == null) {
causes.add(CHAIN_UNREACHABLE);
return causes;
errors.add(new WorkflowError(CHAIN_UNREACHABLE));
return errors;
}

// No staking in contributeAndFinalize
if (taskDescription != null && !taskDescription.isEligibleToContributeAndFinalize()
&& !hasEnoughStakeToContribute(chainTask)) {
causes.add(STAKE_TOO_LOW);
errors.add(new WorkflowError(STAKE_TOO_LOW));
}

if (chainTask.getStatus() != ChainTaskStatus.ACTIVE) {
causes.add(TASK_NOT_ACTIVE);
errors.add(new WorkflowError(TASK_NOT_ACTIVE));
}

if (chainTask.isContributionDeadlineReached()) {
causes.add(CONTRIBUTION_TIMEOUT);
errors.add(new WorkflowError(CONTRIBUTION_TIMEOUT));
}

if (chainTask.hasContributionFrom(workerWalletAddress)) {
causes.add(CONTRIBUTION_ALREADY_SET);
errors.add(new WorkflowError(CONTRIBUTION_ALREADY_SET));
}

return causes;
return errors;
}

public List<ReplicateStatusCause> getCannotContributeAndFinalizeStatusCause(final String chainTaskId) {
final List<ReplicateStatusCause> causes = new ArrayList<>();
public List<WorkflowError> getCannotContributeAndFinalizeStatusCause(final String chainTaskId) {
final List<WorkflowError> errors = new ArrayList<>();

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

final ChainTask chainTask = iexecHubService.getChainTask(chainTaskId).orElse(null);
if (chainTask == null) {
causes.add(CHAIN_UNREACHABLE);
return causes;
errors.add(new WorkflowError(CHAIN_UNREACHABLE));
return errors;
}

// check TASK_ALREADY_CONTRIBUTED
if (chainTask.hasContributions()) {
causes.add(TASK_ALREADY_CONTRIBUTED);
errors.add(new WorkflowError(TASK_ALREADY_CONTRIBUTED));
}

return causes;
return errors;
}

private boolean isWorkerpoolAuthorizationPresent(String chainTaskId) {
Expand Down
16 changes: 10 additions & 6 deletions src/main/java/com/iexec/worker/compute/ComputeController.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,17 +17,18 @@
package com.iexec.worker.compute;


import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.common.result.ComputedFile;
import com.iexec.common.worker.api.ExitMessage;
import com.iexec.worker.chain.WorkerpoolAuthorizationService;
import com.iexec.worker.result.ResultService;
import com.iexec.worker.workflow.WorkflowError;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.NoSuchElementException;
import java.util.Optional;

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

Expand Down Expand Up @@ -57,16 +58,19 @@ public ResponseEntity<Void> sendExitCauseForGivenComputeStage(
@PathVariable ComputeStage stage,
@PathVariable String chainTaskId,
@RequestBody ExitMessage exitMessage) {
List<ReplicateStatusCause> causes = exitMessage != null && exitMessage.cause() != null ? List.of(exitMessage.cause()) : List.of();
return sendExitCausesForGivenComputeStage(authorization, stage, chainTaskId, causes);
final List<WorkflowError> errors = Optional.ofNullable(exitMessage)
.map(ExitMessage::cause)
.map(WorkflowError::new)
.stream().toList();
return sendExitCausesForGivenComputeStage(authorization, stage, chainTaskId, errors);
}

@PostMapping("/compute/{stage}/{chainTaskId}/exit-causes")
public ResponseEntity<Void> sendExitCausesForGivenComputeStage(
@RequestHeader("Authorization") String authorization,
@PathVariable ComputeStage stage,
@PathVariable String chainTaskId,
@RequestBody List<ReplicateStatusCause> causes) {
@RequestBody List<WorkflowError> errors) {
try {
if (!workerpoolAuthorizationService.isSignedWithEnclaveChallenge(chainTaskId, authorization)) {
return ResponseEntity
Expand All @@ -79,13 +83,13 @@ public ResponseEntity<Void> sendExitCausesForGivenComputeStage(
.build();
}

if (causes == null || causes.isEmpty()) {
if (errors == null || errors.isEmpty()) {
return ResponseEntity
.status(HttpStatus.BAD_REQUEST.value())
.build();
}

final boolean stored = computeStageExitService.setExitCausesForGivenComputeStage(chainTaskId, stage, causes);
final boolean stored = computeStageExitService.setExitCausesForGivenComputeStage(chainTaskId, stage, errors);

if (!stored) {
return ResponseEntity
Expand Down
30 changes: 15 additions & 15 deletions src/main/java/com/iexec/worker/compute/ComputeExitCauseService.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

package com.iexec.worker.compute;

import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.worker.workflow.WorkflowError;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

Expand All @@ -28,20 +28,20 @@
@Service
public class ComputeExitCauseService {

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

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

if (exitCauseMap.containsKey(key)) {
Expand All @@ -50,9 +50,9 @@ boolean setExitCausesForGivenComputeStage(final String chainTaskId,
return false;
}

exitCauseMap.put(key, List.copyOf(causes));
exitCauseMap.put(key, List.copyOf(errors));
log.info("Added exit causes [chainTaskId:{}, computeStage:{}, causeCount:{}]",
chainTaskId, computeStage, causes.size());
chainTaskId, computeStage, errors.size());
return true;
}

Expand All @@ -62,23 +62,23 @@ boolean setExitCausesForGivenComputeStage(final String chainTaskId,
*
* @param computeStage compute stage
* @param chainTaskId task ID
* @param fallbackCause default cause to return if no specific causes are found
* @return list of exit causes, or default unknown issue if not found
* @param fallbackError default error to return if no specific causes are found
* @return list of workflow errors, or default unknown issue if not found
*/
public List<ReplicateStatusCause> getExitCausesAndPruneForGivenComputeStage(
public List<WorkflowError> getExitCausesAndPruneForGivenComputeStage(
final String chainTaskId,
final ComputeStage computeStage,
final ReplicateStatusCause fallbackCause) {
final WorkflowError fallbackError) {
final String key = buildKey(computeStage, chainTaskId);
final List<ReplicateStatusCause> causes = exitCauseMap.remove(key);
if (causes != null) {
final List<WorkflowError> errors = exitCauseMap.remove(key);
if (errors != null) {
log.info("Retrieved and pruned exit causes [chainTaskId:{} computeStage:{}, causeCount:{}]",
chainTaskId, computeStage, causes.size());
return causes;
chainTaskId, computeStage, errors.size());
return errors;
} else {
log.info("No exit causes found, returning fallback cause [chainTaskId:{}, computeStage:{}]",
chainTaskId, computeStage);
return List.of(fallbackCause);
return List.of(fallbackError);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import com.iexec.worker.docker.DockerRegistryConfiguration;
import com.iexec.worker.docker.DockerService;
import com.iexec.worker.result.ResultService;
import com.iexec.worker.workflow.WorkflowError;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -230,7 +231,7 @@ public PostComputeResponse runPostCompute(final TaskDescription taskDescription,
postComputeResponse = postComputeService.runTeePostCompute(taskDescription, secureSession);
} else {
postComputeResponse = PostComputeResponse.builder()
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_FAILED_UNKNOWN_ISSUE))
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_FAILED_UNKNOWN_ISSUE)))
.build();
}
if (!postComputeResponse.isSuccessful()) {
Expand All @@ -239,15 +240,15 @@ public PostComputeResponse runPostCompute(final TaskDescription taskDescription,
final ComputedFile computedFile = resultService.readComputedFile(chainTaskId);
if (computedFile == null) {
return PostComputeResponse.builder()
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_COMPUTED_FILE_NOT_FOUND))
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_COMPUTED_FILE_NOT_FOUND)))
.stdout(postComputeResponse.getStdout())
.stderr(postComputeResponse.getStderr())
.build();
}
final String resultDigest = resultService.computeResultDigest(computedFile);
if (resultDigest.isEmpty()) {
return PostComputeResponse.builder()
.exitCauses(List.of(ReplicateStatusCause.POST_COMPUTE_RESULT_DIGEST_COMPUTATION_FAILED))
.exitCauses(List.of(new WorkflowError(ReplicateStatusCause.POST_COMPUTE_RESULT_DIGEST_COMPUTATION_FAILED)))
.stdout(postComputeResponse.getStdout())
.stderr(postComputeResponse.getStderr())
.build();
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/com/iexec/worker/compute/ComputeResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,13 @@

package com.iexec.worker.compute;

import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.worker.workflow.WorkflowError;

import java.util.List;

public interface ComputeResponse {

List<ReplicateStatusCause> getExitCauses();
List<WorkflowError> getExitCauses();

String getStdout();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

package com.iexec.worker.compute.app;

import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.worker.compute.ComputeResponse;
import com.iexec.worker.workflow.WorkflowError;
import lombok.Builder;
import lombok.Value;

Expand All @@ -28,7 +28,7 @@
public class AppComputeResponse implements ComputeResponse {

@Builder.Default
List<ReplicateStatusCause> exitCauses = List.of();
List<WorkflowError> exitCauses = List.of();
String stdout;
String stderr;
int exitCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import com.iexec.worker.sgx.SgxService;
import com.iexec.worker.tee.TeeService;
import com.iexec.worker.tee.TeeServicesManager;
import com.iexec.worker.workflow.WorkflowError;
import org.springframework.stereotype.Service;

import java.time.Duration;
Expand Down Expand Up @@ -119,10 +120,10 @@ private String getTaskContainerName(final String chainTaskId) {
return workerConfigService.getWorkerName() + "-" + chainTaskId;
}

private List<ReplicateStatusCause> getExitCauseFromFinalStatus(final DockerRunFinalStatus finalStatus) {
private List<WorkflowError> getExitCauseFromFinalStatus(final DockerRunFinalStatus finalStatus) {
return switch (finalStatus) {
case TIMEOUT -> List.of(ReplicateStatusCause.APP_COMPUTE_TIMEOUT);
case FAILED -> List.of(ReplicateStatusCause.APP_COMPUTE_FAILED);
case TIMEOUT -> List.of(new WorkflowError(ReplicateStatusCause.APP_COMPUTE_TIMEOUT));
case FAILED -> List.of(new WorkflowError(ReplicateStatusCause.APP_COMPUTE_FAILED));
default -> List.of();
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@

package com.iexec.worker.compute.post;

import com.iexec.common.replicate.ReplicateStatusCause;
import com.iexec.worker.compute.ComputeResponse;
import com.iexec.worker.workflow.WorkflowError;
import lombok.Builder;
import lombok.Value;

Expand All @@ -28,7 +28,7 @@
public class PostComputeResponse implements ComputeResponse {

@Builder.Default
List<ReplicateStatusCause> exitCauses = List.of();
List<WorkflowError> exitCauses = List.of();
String stdout;
String stderr;
}
Loading