4545import lombok .extern .slf4j .Slf4j ;
4646import org .springframework .stereotype .Service ;
4747
48+ import java .util .List ;
4849import java .util .Optional ;
4950
5051import static com .iexec .common .replicate .ReplicateStatus .APP_DOWNLOAD_FAILED ;
@@ -95,17 +96,16 @@ public TaskManagerService(
9596
9697 ReplicateActionResponse start (TaskDescription taskDescription ) {
9798 final String chainTaskId = taskDescription .getChainTaskId ();
98- Optional <ReplicateStatusCause > oErrorStatus =
99+ List <ReplicateStatusCause > oErrorStatus =
99100 contributionService .getCannotContributeStatusCause (chainTaskId );
100101 String context = "start" ;
101- if (oErrorStatus .isPresent ()) {
102- return getFailureResponseAndPrintError (oErrorStatus .get (),
103- context , chainTaskId );
102+ if (!oErrorStatus .isEmpty ()) {
103+ return getFailureResponseAndPrintError (oErrorStatus , context , chainTaskId );
104104 }
105105
106106 // result encryption is not supported for standard tasks
107107 if (!taskDescription .isTeeTask () && taskDescription .getDealParams ().isIexecResultEncryption ()) {
108- return getFailureResponseAndPrintError (TASK_DESCRIPTION_INVALID ,
108+ return getFailureResponseAndPrintError (List . of ( TASK_DESCRIPTION_INVALID ) ,
109109 context , chainTaskId );
110110 }
111111
@@ -114,10 +114,10 @@ ReplicateActionResponse start(TaskDescription taskDescription) {
114114 // then we won't be able to run the task.
115115 // So it should be aborted right now.
116116 final TeeService teeService = teeServicesManager .getTeeService (taskDescription .getTeeFramework ());
117- final Optional <ReplicateStatusCause > teePrerequisitesIssue = teeService .areTeePrerequisitesMetForTask (chainTaskId );
118- if (teePrerequisitesIssue . isPresent ()) {
119- log .error ("TEE prerequisites are not met [chainTaskId: {}, issue : {}]" , chainTaskId , teePrerequisitesIssue . get () );
120- return getFailureResponseAndPrintError (teePrerequisitesIssue . get () , context , chainTaskId );
117+ final List <ReplicateStatusCause > teePrerequisitesIssues = teeService .areTeePrerequisitesMetForTask (chainTaskId );
118+ if (! teePrerequisitesIssues . isEmpty ()) {
119+ log .error ("TEE prerequisites are not met [chainTaskId: {}, issues : {}]" , chainTaskId , teePrerequisitesIssues );
120+ return getFailureResponseAndPrintError (teePrerequisitesIssues , context , chainTaskId );
121121 }
122122
123123 final WorkerpoolAuthorization workerpoolAuthorization = contributionService .getWorkerpoolAuthorization (chainTaskId );
@@ -131,12 +131,11 @@ ReplicateActionResponse start(TaskDescription taskDescription) {
131131
132132 ReplicateActionResponse downloadApp (TaskDescription taskDescription ) {
133133 final String chainTaskId = taskDescription .getChainTaskId ();
134- Optional <ReplicateStatusCause > oErrorStatus =
134+ List <ReplicateStatusCause > oErrorStatus =
135135 contributionService .getCannotContributeStatusCause (chainTaskId );
136136 String context = "download app" ;
137- if (oErrorStatus .isPresent ()) {
138- return getFailureResponseAndPrintError (oErrorStatus .get (),
139- context , chainTaskId );
137+ if (!oErrorStatus .isEmpty ()) {
138+ return getFailureResponseAndPrintError (oErrorStatus , context , chainTaskId );
140139 }
141140
142141 if (computeManagerService .downloadApp (taskDescription )) {
@@ -174,12 +173,11 @@ ReplicateActionResponse downloadData(final TaskDescription taskDescription) {
174173 log .info ("Dataset and input files will be downloaded by the pre-compute enclave [chainTaskId:{}]" , chainTaskId );
175174 return ReplicateActionResponse .success ();
176175 }
177- Optional <ReplicateStatusCause > errorStatus =
176+ List <ReplicateStatusCause > errorStatus =
178177 contributionService .getCannotContributeStatusCause (chainTaskId );
179178 String context = "download data" ;
180- if (errorStatus .isPresent ()) {
181- return getFailureResponseAndPrintError (errorStatus .get (),
182- context , chainTaskId );
179+ if (!errorStatus .isEmpty ()) {
180+ return getFailureResponseAndPrintError (errorStatus , context , chainTaskId );
183181 }
184182 try {
185183 // download dataset for standard task
@@ -222,22 +220,21 @@ private ReplicateActionResponse triggerPostComputeHookOnError(String chainTaskId
222220
223221 ReplicateActionResponse compute (TaskDescription taskDescription ) {
224222 final String chainTaskId = taskDescription .getChainTaskId ();
225- final ReplicateStatusCause errorStatus = contributionService .getCannotContributeStatusCause (chainTaskId )
226- .orElse (null );
223+ final List <ReplicateStatusCause > errorStatus = contributionService .getCannotContributeStatusCause (chainTaskId );
227224 final String context = "compute" ;
228- if (errorStatus != null ) {
225+ if (! errorStatus . isEmpty () ) {
229226 return getFailureResponseAndPrintError (errorStatus , context , chainTaskId );
230227 }
231228
232229 if (!computeManagerService .isAppDownloaded (taskDescription .getAppUri ())) {
233- return getFailureResponseAndPrintError (APP_NOT_FOUND_LOCALLY ,
230+ return getFailureResponseAndPrintError (List . of ( APP_NOT_FOUND_LOCALLY ) ,
234231 context , chainTaskId );
235232 }
236233
237234 if (taskDescription .isTeeTask ()) {
238235 TeeService teeService = teeServicesManager .getTeeService (taskDescription .getTeeFramework ());
239236 if (!teeService .prepareTeeForTask (chainTaskId )) {
240- return getFailureResponseAndPrintError (TEE_PREPARATION_FAILED ,
237+ return getFailureResponseAndPrintError (List . of ( TEE_PREPARATION_FAILED ) ,
241238 context , chainTaskId );
242239 }
243240 }
@@ -250,7 +247,7 @@ ReplicateActionResponse compute(TaskDescription taskDescription) {
250247 workerpoolAuthorization );
251248 if (!preResponse .isSuccessful ()) {
252249 return getFailureResponseAndPrintError (
253- preResponse .getExitCauses (). get ( 0 ), //TODO: Handle list of causes
250+ preResponse .getExitCauses (),
254251 context ,
255252 chainTaskId
256253 );
@@ -303,14 +300,13 @@ ReplicateActionResponse compute(TaskDescription taskDescription) {
303300 * @return The response of the 'contribute' or 'contributeAndFinalize' action
304301 */
305302 private ReplicateActionResponse contributeOrContributeAndFinalize (String chainTaskId , String context ) {
306- Optional <ReplicateStatusCause > oErrorStatus = contributionService .getCannotContributeStatusCause (chainTaskId );
307- if (oErrorStatus .isPresent ()) {
308- return getFailureResponseAndPrintError (oErrorStatus .get (),
309- context , chainTaskId );
303+ List <ReplicateStatusCause > oErrorStatus = contributionService .getCannotContributeStatusCause (chainTaskId );
304+ if (!oErrorStatus .isEmpty ()) {
305+ return getFailureResponseAndPrintError (oErrorStatus , context , chainTaskId );
310306 }
311307
312308 if (!hasEnoughGas ()) {
313- return getFailureResponseAndPrintError (OUT_OF_GAS , context , chainTaskId );
309+ return getFailureResponseAndPrintError (List . of ( OUT_OF_GAS ) , context , chainTaskId );
314310 }
315311
316312 ComputedFile computedFile = resultService .getComputedFile (chainTaskId );
@@ -335,9 +331,8 @@ private ReplicateActionResponse contributeOrContributeAndFinalize(String chainTa
335331 }
336332 } else if (context .equals (CONTRIBUTE_AND_FINALIZE )) {
337333 oErrorStatus = contributionService .getCannotContributeAndFinalizeStatusCause (chainTaskId );
338- if (oErrorStatus .isPresent ()) {
339- return getFailureResponseAndPrintError (oErrorStatus .get (),
340- context , chainTaskId );
334+ if (!oErrorStatus .isEmpty ()) {
335+ return getFailureResponseAndPrintError (oErrorStatus , context , chainTaskId );
341336 }
342337
343338 final WorkerpoolAuthorization workerpoolAuthorization = contributionService .getWorkerpoolAuthorization (chainTaskId );
@@ -370,7 +365,7 @@ ReplicateActionResponse reveal(String chainTaskId,
370365 TaskNotificationExtra extra ) {
371366 String context = "reveal" ;
372367 if (extra == null || extra .getBlockNumber () == 0 ) {
373- return getFailureResponseAndPrintError (CONSENSUS_BLOCK_MISSING , context , chainTaskId );
368+ return getFailureResponseAndPrintError (List . of ( CONSENSUS_BLOCK_MISSING ) , context , chainTaskId );
374369 }
375370 long consensusBlock = extra .getBlockNumber ();
376371
@@ -384,12 +379,12 @@ ReplicateActionResponse reveal(String chainTaskId,
384379 }
385380
386381 if (!revealService .isConsensusBlockReached (chainTaskId , consensusBlock )) {
387- return getFailureResponseAndPrintError (BLOCK_NOT_REACHED , context , chainTaskId
382+ return getFailureResponseAndPrintError (List . of ( BLOCK_NOT_REACHED ) , context , chainTaskId
388383 );
389384 }
390385
391386 if (!revealService .repeatCanReveal (chainTaskId , resultDigest )) {
392- return getFailureResponseAndPrintError (CANNOT_REVEAL , context , chainTaskId );
387+ return getFailureResponseAndPrintError (List . of ( CANNOT_REVEAL ) , context , chainTaskId );
393388 }
394389
395390 if (!hasEnoughGas ()) {
@@ -402,7 +397,7 @@ ReplicateActionResponse reveal(String chainTaskId,
402397 revealService .reveal (chainTaskId , resultDigest );
403398 if (oChainReceipt .isEmpty () ||
404399 !isValidChainReceipt (chainTaskId , oChainReceipt .get ())) {
405- return getFailureResponseAndPrintError (CHAIN_RECEIPT_NOT_VALID ,
400+ return getFailureResponseAndPrintError (List . of ( CHAIN_RECEIPT_NOT_VALID ) ,
406401 context , chainTaskId
407402 );
408403 }
@@ -415,7 +410,7 @@ ReplicateActionResponse uploadResult(String chainTaskId) {
415410 String resultLink = resultService .uploadResultAndGetLink (workerpoolAuthorization );
416411 String context = "upload result" ;
417412 if (resultLink .isEmpty ()) {
418- return getFailureResponseAndPrintError (RESULT_LINK_MISSING ,
413+ return getFailureResponseAndPrintError (List . of ( RESULT_LINK_MISSING ) ,
419414 context , chainTaskId
420415 );
421416 }
@@ -494,9 +489,13 @@ boolean isValidChainReceipt(String chainTaskId,
494489 return true ;
495490 }
496491
497- private ReplicateActionResponse getFailureResponseAndPrintError (ReplicateStatusCause cause , String context , String chainTaskId ) {
498- logError (cause , context , chainTaskId );
499- return ReplicateActionResponse .failure (cause );
492+ private ReplicateActionResponse getFailureResponseAndPrintError (List <ReplicateStatusCause > causes , String context , String chainTaskId ) {
493+ if (causes == null || causes .isEmpty ()) {
494+ log .error ("Failed to {} [chainTaskId:'{}', cause:'UNKNOWN']" , context , chainTaskId );
495+ return ReplicateActionResponse .failure ();
496+ }
497+ causes .forEach (cause -> logError (cause , context , chainTaskId ));
498+ return ReplicateActionResponse .failure (causes .get (0 ));
500499 }
501500
502501 /**
0 commit comments