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
103 changes: 72 additions & 31 deletions src/main/java/com/iexec/common/replicate/ReplicateStatus.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2020-2023 IEXEC BLOCKCHAIN TECH
* Copyright 2020-2025 IEXEC BLOCKCHAIN TECH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -22,7 +22,6 @@
import java.util.Arrays;
import java.util.List;


public enum ReplicateStatus {

CREATED,
Expand Down Expand Up @@ -60,37 +59,69 @@ public enum ReplicateStatus {
RECOVERING,
WORKER_LOST;


public static boolean isSuccess(ReplicateStatus status) {
return getSuccessStatuses().contains(status);
}

/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static boolean isFailure(ReplicateStatus status) {
return getFailureStatuses().contains(status);
}

/**
* @deprecated Use non-static method on Enum member instead
*/
@Deprecated(forRemoval = true)
public static boolean isFailedBeforeComputed(ReplicateStatus status) {
return status.ordinal() < COMPUTED.ordinal() && getFailureStatuses().contains(status);
}

/**
* Covers START_FAILED, APP_DOWNLOAD_FAILED, DATA_DOWNLOAD_FAILED and COMPUTE_FAILED
*
* @return {@literal true} if the status is in the list, {@literal false} otherwise
*/
public boolean isFailedBeforeComputed() {
return this.ordinal() < COMPUTED.ordinal() && getFailureStatuses().contains(this);
}

/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static boolean isCompletable(ReplicateStatus status) {
return getCompletableStatuses().contains(status);
}

/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static boolean isFailable(ReplicateStatus status) {
return getFailableStatuses().contains(status);
}

/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static boolean isAbortable(ReplicateStatus status) {
return getAbortableStatuses().contains(status);
}

/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static boolean isRecoverable(ReplicateStatus status) {
return true; // just temporary
}

public static List<ReplicateStatus> getSuccessStatuses() {
return new ArrayList<>(Arrays.asList(
return List.of(
CREATED,
STARTING,
STARTED,
Expand All @@ -107,11 +138,11 @@ public static List<ReplicateStatus> getSuccessStatuses() {
CONTRIBUTE_AND_FINALIZE_ONGOING,
CONTRIBUTE_AND_FINALIZE_DONE,
COMPLETING,
COMPLETED));
COMPLETED);
}

public static List<ReplicateStatus> getFailureStatuses() {
return Arrays.asList(
return List.of(
START_FAILED,
APP_DOWNLOAD_FAILED,
DATA_DOWNLOAD_FAILED,
Expand All @@ -121,13 +152,13 @@ public static List<ReplicateStatus> getFailureStatuses() {
RESULT_UPLOAD_FAILED,
CONTRIBUTE_AND_FINALIZE_FAILED,
COMPLETE_FAILED,
FAILED);
FAILED); // FAILED can be set from ReplicateListener in scheduler
}

/*
* Statuses that should be updated
* to COMPLETED at the end of a task.
/**
* @deprecated not used in other projects
*/
@Deprecated(forRemoval = true)
public static List<ReplicateStatus> getCompletableStatuses() {
return Arrays.asList(
REVEALED,
Expand All @@ -140,12 +171,11 @@ public static List<ReplicateStatus> getCompletableStatuses() {
COMPLETE_FAILED);
}

/*
* Statuses that should be updated
* to FAILED at the end of a task.
/**
* Statuses that should be updated to FAILED at the end of a task.
*/
public static List<ReplicateStatus> getFailableStatuses() {
return Arrays.asList(
return List.of(
CREATED,
STARTING,
START_FAILED,
Expand All @@ -169,21 +199,20 @@ public static List<ReplicateStatus> getFailableStatuses() {
ABORTED);
}

/*
* Statuses that can be updated
* to ABORTED by the worker.
/**
* Statuses that can be updated to ABORTED by the worker.
*/
public static List<ReplicateStatus> getAbortableStatuses() {
List<ReplicateStatus> nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses());
final List<ReplicateStatus> nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses());
nonFinal.add(WORKER_LOST);
return nonFinal;
return List.copyOf(nonFinal);
}

/*
* Statuses that can be recovered by the worker
/**
* Statuses that can be recovered by the worker
*/
public static List<ReplicateStatus> getRecoverableStatuses() {
return Arrays.asList(
return List.of(
CREATED,
STARTING,
STARTED,
Expand Down Expand Up @@ -215,14 +244,14 @@ public static List<ReplicateStatus> getRecoverableStatuses() {
* CREATED -> COMPLETED/FAILED
*/
public static List<ReplicateStatus> getWorkflowStatuses() {
List<ReplicateStatus> nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses());
final List<ReplicateStatus> nonFinal = new ArrayList<>(getNonFinalWorkflowStatuses());
nonFinal.add(COMPLETED);
nonFinal.add(FAILED);
return nonFinal;
return List.copyOf(nonFinal);
}

public static List<ReplicateStatus> getFinalStatuses() {
return Arrays.asList(
return List.of(
COMPLETED,
FAILED);
}
Expand All @@ -232,7 +261,7 @@ public static List<ReplicateStatus> getFinalStatuses() {
* CREATED -> COMPLETING/COMPLETE_FAILED
*/
public static List<ReplicateStatus> getNonFinalWorkflowStatuses() {
return Arrays.asList(
return List.of(
CREATED,
STARTING,
START_FAILED,
Expand Down Expand Up @@ -263,6 +292,10 @@ public static List<ReplicateStatus> getNonFinalWorkflowStatuses() {
COMPLETE_FAILED);
}

/**
* @deprecated unused in other projects
*/
@Deprecated(forRemoval = true)
public static ChainContributionStatus getChainStatus(ReplicateStatus replicateStatus) {
switch (replicateStatus) {
case CONTRIBUTED:
Expand All @@ -274,6 +307,10 @@ public static ChainContributionStatus getChainStatus(ReplicateStatus replicateSt
}
}

/**
* @deprecated unused in other projects
*/
@Deprecated(forRemoval = true)
public static List<ReplicateStatus> getStatusesBeforeContributed() {
return Arrays.asList(
CREATED,
Expand All @@ -294,18 +331,22 @@ public static List<ReplicateStatus> getStatusesBeforeContributed() {
}

public static List<ReplicateStatus> getMissingStatuses(ReplicateStatus from, ReplicateStatus to) {
List<ReplicateStatus> statuses = getSuccessStatuses();
final List<ReplicateStatus> statuses = getSuccessStatuses();
if (!statuses.contains(from) || !statuses.contains(to)) {
return new ArrayList<>();
return List.of();
}

if (statuses.indexOf(from) >= statuses.indexOf(to)) {
return new ArrayList<>();
return List.of();
}

return statuses.subList(statuses.indexOf(from) + 1, statuses.indexOf(to) + 1);
return List.copyOf(statuses.subList(statuses.indexOf(from) + 1, statuses.indexOf(to) + 1));
}

/**
* @deprecated called once from a scheduler method itself never used
*/
@Deprecated(forRemoval = true)
public static List<ReplicateStatus> getSuccessStatusesBeforeComputed() {
return Arrays.asList(
CREATED,
Expand All @@ -319,7 +360,7 @@ public static List<ReplicateStatus> getSuccessStatusesBeforeComputed() {
}

public static List<ReplicateStatus> getUncompletableStatuses() {
return Arrays.asList(
return List.of(
CONTRIBUTE_FAILED,
REVEAL_FAILED,
CONTRIBUTE_AND_FINALIZE_FAILED
Expand Down
36 changes: 30 additions & 6 deletions src/test/java/com/iexec/common/replicate/ReplicateStatusTests.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright 2020 IEXEC BLOCKCHAIN TECH
* Copyright 2020-2025 IEXEC BLOCKCHAIN TECH
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -18,16 +18,29 @@

import org.junit.jupiter.api.Test;

import java.util.ArrayList;
import java.util.List;

import static com.iexec.common.replicate.ReplicateStatus.*;
import static org.assertj.core.api.Assertions.assertThat;

class ReplicateStatusTests {

// region getWorkflowStatus
@Test
void checkWorkflowStatuses() {
final List<ReplicateStatus> finalStatuses = getFinalStatuses();
final List<ReplicateStatus> nonFinalStatuses = getNonFinalWorkflowStatuses();
final List<ReplicateStatus> expectedStatuses = new ArrayList<>(nonFinalStatuses);
expectedStatuses.addAll(finalStatuses);
assertThat(getWorkflowStatuses()).isEqualTo(expectedStatuses);
}
// endregion

// region getMissingStatuses
@Test
void shouldGetMissingStatuses() {
List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTING);
final List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTING);

assertThat(missingStatuses).hasSize(7);
assertThat(missingStatuses.get(0)).isEqualTo(STARTING);
Expand All @@ -41,21 +54,22 @@ void shouldGetMissingStatuses() {

@Test
void shouldNotGetMissingStatusesWhenFromGreaterThanTo() {
List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(COMPUTING, CREATED);
final List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(COMPUTING, CREATED);
assertThat(missingStatuses).isEmpty();
}

@Test
void shouldNotGetMissingStatusesWhenFromEqualsTo() {
List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, CREATED);
final List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, CREATED);
assertThat(missingStatuses).isEmpty();
}

@Test
void shouldNotGetMissingStatusesIfFromOrToIsNotInSuccessList() {
List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTE_FAILED);
final List<ReplicateStatus> missingStatuses = ReplicateStatus.getMissingStatuses(CREATED, COMPUTE_FAILED);
assertThat(missingStatuses).isEmpty();
}
// endregion

@Test
void shouldBeFailedBeforeComputed() {
Expand Down Expand Up @@ -94,7 +108,17 @@ void shouldBeFailedBeforeComputed() {
WORKER_LOST
);

runningFailures .forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isTrue());
runningFailures.forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isTrue());
notRunningFailures.forEach(status -> assertThat(ReplicateStatus.isFailedBeforeComputed(status)).isFalse());
runningFailures.forEach(status -> assertThat(status.isFailedBeforeComputed()).isTrue());
notRunningFailures.forEach(status -> assertThat(status.isFailedBeforeComputed()).isFalse());
}

// region getUnCompletableStatuses
@Test
void checkUncompletableStatuses() {
assertThat(ReplicateStatus.getUncompletableStatuses())
.isEqualTo(List.of(CONTRIBUTE_FAILED, REVEAL_FAILED, CONTRIBUTE_AND_FINALIZE_FAILED));
}
// endregion
}