1616
1717package com .iexec .worker .compute ;
1818
19- import com .iexec .common .replicate .ReplicateStatusCause ;
20- import lombok .extern .slf4j .Slf4j ;
19+ import java .util .ArrayList ;
20+ import java .util .HashMap ;
21+ import java .util .List ;
22+ import java .util .Map ;
23+
2124import org .springframework .stereotype .Service ;
2225
23- import java .util .HashMap ;
26+ import com .iexec .common .replicate .ReplicateStatusCause ;
27+
28+ import lombok .extern .slf4j .Slf4j ;
2429
2530
2631@ Slf4j
2732@ Service
2833public class ComputeExitCauseService {
2934
35+ /**
36+ * @deprecated Use {@link #bulkExitCauseMap} instead
37+ */
38+ @ Deprecated (since = "v9.0.1" , forRemoval = true )
3039 private final HashMap <String , ReplicateStatusCause > exitCauseMap = new HashMap <>();
3140
41+ private final Map <String , List <ReplicateStatusCause >> bulkExitCauseMap = new HashMap <>();
42+
3243 /**
3344 * Report failure exit cause from pre-compute or post-compute enclave.
3445 *
3546 * @param computeStage pre-compute or post-compute-stage label
3647 * @param chainTaskId task ID
3748 * @param exitCause root cause of the failure
3849 * @return true if exit cause is reported
50+ * @deprecated Use {@link #setBulkExitCausesForGivenComputeStage(ComputeStage, String, List)}
51+ * for bulk exit cause reporting instead
3952 */
53+ @ Deprecated (since = "v9.0.1" , forRemoval = true )
4054 boolean setExitCause (ComputeStage computeStage ,
4155 String chainTaskId ,
4256 ReplicateStatusCause exitCause ) {
@@ -58,7 +72,9 @@ boolean setExitCause(ComputeStage computeStage,
5872 *
5973 * @param chainTaskId task ID
6074 * @return exit cause
75+ * @deprecated Use {@link #getExitCauseAndPruneForGivenComputeStage(ComputeStage, String)} instead
6176 */
77+ @ Deprecated (since = "v9.0.1" , forRemoval = true )
6278 ReplicateStatusCause getReplicateStatusCause (ComputeStage computeStage ,
6379 String chainTaskId ) {
6480 return exitCauseMap .get (buildKey (computeStage , chainTaskId ));
@@ -69,7 +85,10 @@ ReplicateStatusCause getReplicateStatusCause(ComputeStage computeStage,
6985 *
7086 * @param chainTaskId task ID
7187 * @return exit cause
88+ * @deprecated Use {@link #getExitCauseAndPruneForGivenComputeStage(ComputeStage, String)}
89+ * with ComputeStage.PRE instead
7290 */
91+ @ Deprecated (since = "v9.0.1" , forRemoval = true )
7392 public ReplicateStatusCause getPreComputeExitCauseAndPrune (String chainTaskId ) {
7493 ComputeStage stage = ComputeStage .PRE ;
7594 ReplicateStatusCause cause = getReplicateStatusCause (stage , chainTaskId );
@@ -82,7 +101,10 @@ public ReplicateStatusCause getPreComputeExitCauseAndPrune(String chainTaskId) {
82101 *
83102 * @param chainTaskId task ID
84103 * @return exit cause
104+ * @deprecated Use {@link #getExitCauseAndPruneForGivenComputeStage(ComputeStage, String)}
105+ * with ComputeStage.POST instead
85106 */
107+ @ Deprecated (since = "v9.0.1" , forRemoval = true )
86108 public ReplicateStatusCause getPostComputeExitCauseAndPrune (String chainTaskId ) {
87109 ComputeStage stage = ComputeStage .POST ;
88110 ReplicateStatusCause cause = getReplicateStatusCause (stage , chainTaskId );
@@ -111,4 +133,53 @@ private void pruneExitCause(ComputeStage computeStage, String chainTaskId) {
111133 exitCauseMap .remove (buildKey (computeStage , chainTaskId ));
112134 }
113135
114- }
136+ /**
137+ * Store bulk exit causes for a specific compute stage.
138+ * If causes already exist for this compute stage and task, the new causes will be added to the existing list.
139+ *
140+ * @param computeStage compute stage
141+ * @param chainTaskId task ID
142+ * @param causes list of exit causes
143+ * @return true if causes were stored successfully
144+ */
145+ public boolean setBulkExitCausesForGivenComputeStage (ComputeStage computeStage , String chainTaskId , List <ReplicateStatusCause > causes ) {
146+ if (causes == null || causes .isEmpty ()) {
147+ log .error ("Cannot set bulk exit causes with null or empty list [computeStage:{}, chainTaskId:{}]" ,
148+ computeStage , chainTaskId );
149+ return false ;
150+ }
151+
152+ final String key = buildKey (computeStage , chainTaskId );
153+ bulkExitCauseMap .compute (key , (k , existingCauses ) -> {
154+ if (existingCauses == null ) {
155+ log .info ("Added bulk exit causes [computeStage:{}, chainTaskId:{}, causeCount:{}]" ,
156+ computeStage , chainTaskId , causes .size ());
157+ return List .copyOf (causes );
158+ } else {
159+ log .info ("Appended bulk exit causes to existing list [computeStage:{}, chainTaskId:{}, newCauseCount:{}, totalCauseCount:{}]" ,
160+ computeStage , chainTaskId , causes .size (), existingCauses .size () + causes .size ());
161+ final List <ReplicateStatusCause > combinedCauses = new ArrayList <>(existingCauses );
162+ combinedCauses .addAll (causes );
163+ return combinedCauses ;
164+ }
165+ });
166+ return true ;
167+ }
168+
169+ /**
170+ * Get bulk exit causes for a specific compute stage and prune them.
171+ *
172+ * @param computeStage compute stage
173+ * @param chainTaskId task ID
174+ * @return list of exit causes, or null if not found
175+ */
176+ public List <ReplicateStatusCause > getBulkExitCausesAndPruneForGivenComputeStage (ComputeStage computeStage , String chainTaskId ) {
177+ final String key = buildKey (computeStage , chainTaskId );
178+ final List <ReplicateStatusCause > causes = bulkExitCauseMap .remove (key );
179+ if (causes != null ) {
180+ log .debug ("Retrieved and pruned bulk exit causes [computeStage:{}, chainTaskId:{}, causeCount:{}]" ,
181+ computeStage , chainTaskId , causes .size ());
182+ }
183+ return causes ;
184+ }
185+ }
0 commit comments