mirror of
https://github.com/sasjs/core.git
synced 2026-01-18 14:00:05 +00:00
feat: early exit, with syscc, when submitted jobs fail within a flow
This commit is contained in:
@@ -13,7 +13,7 @@
|
||||
@li FLOW_ID - Numeric value, provides sequential ordering capability. Is
|
||||
optional, will default to 0 if not provided.
|
||||
@li _CONTEXTNAME - Dictates which context should be used to run the job. If
|
||||
blank (or not provided), will default to `SAS Job Execution compute context`.
|
||||
blank (or not provided), it defaults to `SAS Job Execution compute context`.
|
||||
|
||||
Any additional variables provided in this table are converted into macro
|
||||
variables and passed into the relevant job.
|
||||
@@ -97,17 +97,21 @@
|
||||
run;
|
||||
|
||||
|
||||
@param [in] access_token_var= The global macro variable to contain the access token
|
||||
@param [in] access_token_var= The global macro variable to contain the
|
||||
access token
|
||||
@param [in] grant_type= valid values:
|
||||
@li password
|
||||
@li authorization_code
|
||||
@li detect - will check if access_token exists, if not will use sas_services if
|
||||
a SASStudioV session else authorization_code. Default option.
|
||||
@li detect - will check if access_token exists, if not will use
|
||||
sas_services if a SASStudioV session else authorization_code.
|
||||
Default option.
|
||||
@li sas_services - will use oauth_bearer=sas_services
|
||||
@param [in] inds= The input dataset containing a list of jobs and parameters
|
||||
@param [in] maxconcurrency= The max number of parallel jobs to run. Default=8.
|
||||
@param [in] raise_err=0 Set to 1 to raise SYSCC when a job does not complete
|
||||
succcessfully
|
||||
@param [in] inds= The input dataset containing a list of jobs and
|
||||
parameters
|
||||
@param [in] maxconcurrency= The max number of parallel jobs to run.
|
||||
Default=8.
|
||||
@param [in] raise_err=0 Set to 1 to raise SYSCC when a job does not
|
||||
complete succcessfully
|
||||
@param [in] mdebug= set to 1 to enable DEBUG messages
|
||||
@param [out] outds= The output dataset containing the results
|
||||
@param [out] outref= The output fileref to which to append the log file(s).
|
||||
@@ -228,6 +232,9 @@ data;run;%let jdswaitfor=&syslast;
|
||||
|
||||
/* start loop */
|
||||
%do fid=1 %to &flowcnt;
|
||||
|
||||
%if not ( &raise_err and &syscc ) %then %do;
|
||||
|
||||
%put preparing job attributes for flow &&flow&fid;
|
||||
%local jds jcnt;
|
||||
data &jds(drop=_contextName _program);
|
||||
@@ -280,11 +287,18 @@ data;run;%let jdswaitfor=&syslast;
|
||||
%end;
|
||||
%end;
|
||||
|
||||
/* check if job was triggered and if so, if we have enough slots to run */
|
||||
%if "&&jobuid&jid"="0" and &concurrency<&maxconcurrency %then %do;
|
||||
/* check if job was triggered and, if
|
||||
so, if we have enough slots to run? */
|
||||
%if ("&&jobuid&jid"="0") and (&concurrency<&maxconcurrency) %then %do;
|
||||
|
||||
/* But only start if no issues detected so far */
|
||||
%if not ( &raise_err and &syscc ) %then %do;
|
||||
|
||||
%local jobname jobpath;
|
||||
%let jobname=%scan(&&job&jid,-1,/);
|
||||
%let jobpath=%substr(&&job&jid,1,%length(&&job&jid)-%length(&jobname)-1);
|
||||
%let jobpath=
|
||||
%substr(&&job&jid,1,%length(&&job&jid)-%length(&jobname)-1);
|
||||
|
||||
%put executing &jobpath/&jobname with paramstring &&jparams&jid;
|
||||
%mv_jobexecute(path=&jobpath
|
||||
,name=&jobname
|
||||
@@ -306,12 +320,22 @@ data;run;%let jdswaitfor=&syslast;
|
||||
data _null_;
|
||||
call sleep(1,1);
|
||||
run;
|
||||
|
||||
%end;
|
||||
%else %do; /* Job was skipped due to problems */
|
||||
|
||||
%put jobid &&job&jid in flow &fid skipped due to SYSCC (&syscc);
|
||||
%let completed = %eval(&completed+1);
|
||||
%let job&jid=0; /* Indicate job has finished */
|
||||
|
||||
%end;
|
||||
|
||||
%end;
|
||||
%end;
|
||||
%if &jid=&jcnt %then %do;
|
||||
/* we are at the end of the loop - time to see which jobs have finished */
|
||||
/* we are at the end of the loop - check which jobs have finished */
|
||||
%mv_jobwaitfor(ANY,inds=&jdsrunning,outds=&jdswaitfor,outref=&outref
|
||||
,raise_err=&raise_err)
|
||||
,raise_err=&raise_err,mdebug=&mdebug)
|
||||
%local done;
|
||||
%let done=%mf_nobs(&jdswaitfor);
|
||||
%if &done>0 %then %do;
|
||||
@@ -334,10 +358,18 @@ data;run;%let jdswaitfor=&syslast;
|
||||
/* loop again if jobs are left */
|
||||
%if &completed < &jcnt %then %do;
|
||||
%let jid=0;
|
||||
%put looping flow &fid again - &completed of &jcnt jobs completed, &concurrency jobs running;
|
||||
%put looping flow &fid again;
|
||||
%put &completed of &jcnt jobs completed, &concurrency jobs running;
|
||||
%end;
|
||||
%end;
|
||||
%end;
|
||||
|
||||
%end;
|
||||
%else %do;
|
||||
|
||||
%put Flow &&flow&fid skipped due to SYSCC (&syscc);
|
||||
|
||||
%end;
|
||||
/* back up and execute the next flow */
|
||||
%end;
|
||||
|
||||
@@ -345,4 +377,4 @@ data;run;%let jdswaitfor=&syslast;
|
||||
%put _local_;
|
||||
%end;
|
||||
|
||||
%mend;
|
||||
%mend mv_jobflow;
|
||||
|
||||
Reference in New Issue
Block a user