int IntStateQuery() { /* qstat -f Job Id: 11.cream-12.pd.infn.it Job_Name = cream_579184706 job_state = R ctime = Wed Apr 23 11:39:55 2008 exec_host = cream-wn-029.pn.pd.infn.it/0 */ /* Filled entries: batch_id wn_addr status udate Filled by submit script: blah_id Unfilled entries: exitreason */ FILE *fp; char *line=NULL; char **token; int maxtok_t=0; job_registry_entry en; int ret; char *timestamp; time_t tmstampepoch; char *batch_str=NULL; char *wn_str=NULL; char *twn_str=NULL; char *status_str=NULL; char *ex_str=NULL; int ex_code=0; char *cp=NULL; char *command_string=NULL; job_registry_entry *ren=NULL; int first=TRUE; time_t now; char *string_now=NULL; command_string=make_message("%s%s/qstat -f",batch_command,pbs_binpath); fp = popen(command_string,"r"); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; bupdater_free_active_jobs(&bact); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } do_log(debuglogfile, debug, 3, "%s: line in IntStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); if(line && strstr(line,"Job Id: ")){ if(!first && en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.wn_addr,en.status); } } if (remupd_conf != NULL){ if (ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL)<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } en.status = UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; } maxtok_t = strtoken(line, ':', &token); batch_str=strdel(token[1]," "); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,batch_str); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); en.exitcode=-1; bupdater_push_active_job(&bact, en.batch_id); free(batch_str); freetoken(&token,maxtok_t); if(!first) free(ren); if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error for %s ",en.batch_id); perror(""); } first=FALSE; }else if(line && strstr(line,"job_state = ")){ maxtok_t = strtoken(line, '=', &token); status_str=strdel(token[1]," "); if(status_str && strcmp(status_str,"Q")==0){ en.status=IDLE; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); }else if(status_str && strcmp(status_str,"W")==0){ en.status=IDLE; en.exitcode=-1; }else if(status_str && strcmp(status_str,"R")==0){ en.status=RUNNING; en.exitcode=-1; }else if(status_str && strcmp(status_str,"C")==0){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); }else if(status_str && strcmp(status_str,"H")==0){ en.status=HELD; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); } free(status_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"unable to run job")){ en.status=IDLE; en.exitcode=-1; }else if(line && strstr(line,"exit_status = ")){ maxtok_t = strtoken(line, '=', &token); ex_str=strdel(token[1]," "); ex_code=atoi(ex_str); if(ex_code==0){ en.exitcode=0; }else if(ex_code==271){ en.status=REMOVED; en.exitcode=-999; }else{ en.exitcode=ex_code; } free(ex_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"exec_host = ")){ maxtok_t = strtoken(line, '=', &token); twn_str=strdup(token[1]); if(twn_str == NULL){ sysfatal("strdup failed for twn_str in IntStateQuery: %r"); } freetoken(&token,maxtok_t); maxtok_t = strtoken(twn_str, '/', &token); wn_str=strdel(token[0]," "); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,wn_str); free(twn_str); free(wn_str); freetoken(&token,maxtok_t); }else if(line && strstr(line,"mtime = ")){ maxtok_t = strtoken(line, ' ', &token); timestamp=make_message("%s %s %s %s %s",token[2],token[3],token[4],token[5],token[6]); tmstampepoch=str2epoch(timestamp,"L"); free(timestamp); en.udate=tmstampepoch; freetoken(&token,maxtok_t); } free(line); free(string_now); } pclose(fp); } if(en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.wn_addr,en.status); } } if (remupd_conf != NULL){ if (ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL)<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } free(ren); free(command_string); return 0; }
int ReceiveUpdateFromNetwork() { char *proxy_path, *proxy_subject; int timeout_ms = 0; int ent, ret, prret, rhret; job_registry_entry *nen; job_registry_entry *ren; proxy_path = NULL; proxy_subject = NULL; while (nen = job_registry_receive_update(remupd_pollset, remupd_nfds,timeout_ms, &proxy_subject, &proxy_path)){ JOB_REGISTRY_ASSIGN_ENTRY(nen->subject_hash,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(nen->proxy_link,"\0"); if ((ren=job_registry_get(rha, nen->batch_id)) == NULL){ if ((ret=job_registry_append(rha, nen)) < 0){ fprintf(stderr,"%s: Warning: job_registry_append returns %d: ",argv0,ret); perror(""); } }else{ if(ren->subject_hash!=NULL && strlen(ren->subject_hash) && ren->proxy_link!=NULL && strlen(ren->proxy_link)){ JOB_REGISTRY_ASSIGN_ENTRY(nen->subject_hash,ren->subject_hash); JOB_REGISTRY_ASSIGN_ENTRY(nen->proxy_link,ren->proxy_link); }else{ if (proxy_path != NULL && strlen(proxy_path) > 0){ prret = job_registry_set_proxy(rha, nen, proxy_path); if (prret < 0){ do_log(debuglogfile, debug, 1, "%s: warning: setting proxy to %s\n",argv0,proxy_path); fprintf(stderr,"%s: warning: setting proxy to %s: ",argv0,proxy_path); perror(""); /* Make sure we don't renew non-existing proxies */ nen->renew_proxy = 0; } free(proxy_path); nen->subject_hash[0] = '\000'; if (proxy_subject != NULL && strlen(proxy_subject) > 0){ job_registry_compute_subject_hash(nen, proxy_subject); rhret = job_registry_record_subject_hash(rha, nen->subject_hash, proxy_subject, TRUE); if (rhret < 0){ do_log(debuglogfile, debug, 1, "%s: warning: recording proxy subject %s (hash %s)\n",argv0, proxy_subject, nen->subject_hash); fprintf(stderr,"%s: warning: recording proxy subject %s (hash %s): ",argv0, proxy_subject, nen->subject_hash); perror(""); } } free(proxy_subject); } } if(job_registry_need_update(ren,nen,JOB_REGISTRY_UPDATE_ALL)){ if ((ret=job_registry_update(rha, nen)) < 0){ fprintf(stderr,"%s: Warning: job_registry_update returns %d: ",argv0,ret); perror(""); } } } free(nen); } return 0; }
int FinalStateQuery(time_t start_date, int logs_to_read) { FILE *fp; char *line=NULL; char **token; char **token_l; int maxtok_t=0; int maxtok_l=0; job_registry_entry en; int ret; time_t tmstampepoch; char *cp=NULL; char *command_string=NULL; time_t now; char *string_now=NULL; job_registry_entry *ren=NULL; command_string=make_message("%s/sacct -nap -o JobID,JobName,State,ExitCode,submit,start,end 2>/dev/null",slurm_binpath); fp = popen(command_string,"r"); do_log(debuglogfile, debug, 3, "%s: command_string in FinalStateQuery is:%s\n",argv0,command_string); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } en.status=UNDEFINED; do_log(debuglogfile, debug, 3, "%s: line in FinalStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); maxtok_t = strtoken(line, '|', &token); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,token[0]); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); if(token[2] && strstr(token[2],"COMPLETED")){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token[2] && strstr(token[2],"CANCELLED")){ en.status=REMOVED; en.exitcode=-999; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token[2] && strstr(token[2],"FAILED")){ en.status=COMPLETED; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); } if(!(token[6] && strstr(token[6],"Unknown"))){ tmstampepoch=str2epoch(token[6],"N"); en.udate=tmstampepoch; } if(en.status==COMPLETED){ maxtok_l = strtoken(token[3], ':', &token_l); en.exitcode=atoi(token_l[0]); freetoken(&token_l,maxtok_l); } if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error "); perror(""); } if(en.status!=UNDEFINED && en.status!=IDLE && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_select(rha, &en, JOB_REGISTRY_UPDATE_UDATE | JOB_REGISTRY_UPDATE_STATUS | JOB_REGISTRY_UPDATE_UPDATER_INFO | JOB_REGISTRY_UPDATE_EXITCODE | JOB_REGISTRY_UPDATE_EXITREASON )) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { do_log(debuglogfile, debug, 2, "%s: f registry update in FinalStateQuery for: jobid=%s creamjobid=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.status); if (en.status == REMOVED || en.status == COMPLETED){ job_registry_unlink_proxy(rha, &en); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in FinalStateQuery\n",argv0); } } } } free(string_now); free(line); freetoken(&token,maxtok_t); free(ren); } pclose(fp); } free(command_string); return 0; }
int PollDB() { FILE *fd; job_registry_entry *en; job_registry_handle *rha; job_registry_handle *rhc; char *buffer=NULL; char *cdate=NULL; time_t now; int maxtok,i,maxtokl,j; char **tbuf; char **lbuf; int len=0,flen=0; struct stat sbuf; int rc; char *regfile; char *cp=NULL; int to_sleep=FALSE; int skip_reg_open=FALSE; int ret; rha=job_registry_init(registry_file, BY_BATCH_ID); if (rha == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } for(;;){ now=time(NULL); to_sleep=TRUE; /* cycle over connections: sleep if startnotify, startnotifyjob and sentendonce are not set. If startnotifyjob is set the conn is served. */ for(i=0; i<MAX_CONNECTIONS; i++){ if(!connections[i].startnotify && !connections[i].startnotifyjob && !(connections[i].firstnotify && connections[i].sentendonce)) continue; if(connections[i].startnotify) to_sleep=FALSE; if(connections[i].startnotifyjob){ to_sleep=FALSE; rhc=job_registry_init(registry_file, BY_USER_PREFIX); if (rhc == NULL){ do_log(debuglogfile, debug, 1, "%s: Error initialising job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error initialising job registry %s :",argv0,registry_file); perror(""); } do_log(debuglogfile, debug, 2, "%s:Job list for notification:%s\n",argv0,connections[i].joblist_string); maxtok=strtoken(connections[i].joblist_string,',',&tbuf); for(j=0;j<maxtok;j++){ if ((en=job_registry_get(rhc, tbuf[j])) != NULL){ buffer=ComposeClassad(en); }else{ if(remupd_conf == NULL){ cdate=iepoch2str(now); maxtokl=strtoken(tbuf[j],'_',&lbuf); if(lbuf[1]){ if ((cp = strrchr (lbuf[1], '\n')) != NULL){ *cp = '\0'; } if ((cp = strrchr (lbuf[1], '\r')) != NULL){ *cp = '\0'; } buffer=make_message("[BlahJobName=\"%s\"; ClientJobId=\"%s\"; JobStatus=4; JwExitCode=999; ExitReason=\"BUpdater is not able to find the job anymore\"; Reason=\"BUpdater is not able to find the job anymore\"; ChangeTime=\"%s\"; ]\n",tbuf[j],lbuf[1],cdate); } freetoken(&lbuf,maxtokl); free(cdate); }else{ maxtokl=strtoken(tbuf[j],':',&lbuf); JOB_REGISTRY_ASSIGN_ENTRY(en->batch_id,lbuf[0]); JOB_REGISTRY_ASSIGN_ENTRY(en->blah_id,lbuf[1]); freetoken(&lbuf,maxtokl); en->status = 0; if ((ret=job_registry_append(rhc, en))<0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } }else{ if(ret==JOB_REGISTRY_SUCCESS){ do_log(debuglogfile, debug, 2, "%s: registry append in PollDB for: jobid=%s blahjobid=%s\n",argv0,en->batch_id,en->blah_id); } } } } free(en); len=strlen(buffer); if(connections[i].finalbuffer != NULL){ flen=strlen(connections[i].finalbuffer); }else{ flen=0; } connections[i].finalbuffer = realloc(connections[i].finalbuffer,flen+len+2); if (connections[i].finalbuffer == NULL){ sysfatal("can't realloc finalbuffer in PollDB: %r"); } if(flen==0){ connections[i].finalbuffer[0]='\000'; } strcat(connections[i].finalbuffer,buffer); free(buffer); } freetoken(&tbuf,maxtok); if(connections[i].finalbuffer != NULL){ if(NotifyCream(connections[i].finalbuffer,&connections[i])!=-1){ /* change last notification time */ connections[i].lastnotiftime=now; connections[i].startnotifyjob=FALSE; } free(connections[i].finalbuffer); connections[i].finalbuffer=NULL; } job_registry_destroy(rhc); } if(connections[i].firstnotify && connections[i].sentendonce){ to_sleep=FALSE; if(NotifyCream("NTFDATE/END\n",&connections[i])!=-1){ connections[i].startnotify=TRUE; connections[i].sentendonce=FALSE; connections[i].firstnotify=FALSE; connections[i].startnotifyjob=FALSE; } } } if(to_sleep){ sleep(loop_interval); continue; } regfile=make_message("%s/registry",registry_file); rc=stat(regfile,&sbuf); free(regfile); skip_reg_open=TRUE; for(i=0; i<MAX_CONNECTIONS; i++){ if(sbuf.st_mtime>=connections[i].lastnotiftime){ skip_reg_open=FALSE; break; } } if(skip_reg_open){ do_log(debuglogfile, debug, 3, "Skip registry opening: mtime:%d lastn:%d\n",sbuf.st_mtime,connections[i].lastnotiftime); sleep(loop_interval); continue; } do_log(debuglogfile, debug, 3, "Normal registry opening\n"); fd = job_registry_open(rha, "r"); if (fd == NULL) { do_log(debuglogfile, debug, 1, "%s: Error opening job registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error opening job registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } if (job_registry_rdlock(rha, fd) < 0) { do_log(debuglogfile, debug, 1, "%s: Error read locking registry %s\n",argv0,registry_file); fprintf(stderr,"%s: Error read locking registry %s :",argv0,registry_file); perror(""); sleep(loop_interval); continue; } while ((en = job_registry_get_next(rha, fd)) != NULL) { for(i=0; i<MAX_CONNECTIONS; i++){ if(connections[i].creamfilter==NULL) continue; if(en->mdate >= connections[i].lastnotiftime && en->mdate < now && en->user_prefix && strstr(en->user_prefix,connections[i].creamfilter)!=NULL && strlen(en->updater_info)>0) { buffer=ComposeClassad(en); len=strlen(buffer); if(connections[i].finalbuffer != NULL){ flen=strlen(connections[i].finalbuffer); }else{ flen=0; } connections[i].finalbuffer = realloc(connections[i].finalbuffer,flen+len+2); if (connections[i].finalbuffer == NULL){ sysfatal("can't realloc finalbuffer in PollDB: %r"); } if(flen==0){ connections[i].finalbuffer[0]='\000'; } strcat(connections[i].finalbuffer,buffer); free(buffer); } } free(en); } for(i=0; i<MAX_CONNECTIONS; i++){ if(connections[i].finalbuffer != NULL){ if(NotifyCream(connections[i].finalbuffer,&connections[i])!=-1){ /* change last notification time */ connections[i].lastnotiftime=now; } free(connections[i].finalbuffer); connections[i].finalbuffer=NULL; } } fclose(fd); sleep(loop_interval); } job_registry_destroy(rha); return 0; }
int IntStateQuery() { FILE *fp; char *line=NULL; char **token; char **token_l; char **token_e; int maxtok_t=0; int maxtok_l=0; int maxtok_e=0; job_registry_entry en; int ret; time_t tmstampepoch; char *cp=NULL; char *batch_str=NULL; char *command_string=NULL; job_registry_entry *ren=NULL; int isresumed=FALSE; int first=TRUE; time_t now; char *string_now=NULL; command_string=make_message("%s/scontrol -a show jobid",slurm_binpath); fp = popen(command_string,"r"); en.status=UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); en.exitcode=-1; bupdater_free_active_jobs(&bact); if(fp!=NULL){ while(!feof(fp) && (line=get_line(fp))){ if(line && strlen(line)==0){ free(line); continue; } if ((cp = strrchr (line, '\n')) != NULL){ *cp = '\0'; } do_log(debuglogfile, debug, 3, "%s: line in IntStateQuery is:%s\n",argv0,line); now=time(0); string_now=make_message("%d",now); maxtok_t = strtoken(line, ' ', &token); if(line && strstr(line,"JobId=")){ isresumed=FALSE; if(!first && en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } en.status = UNDEFINED; JOB_REGISTRY_ASSIGN_ENTRY(en.exitreason,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,"\0"); JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,"\0"); en.exitcode=-1; } en.status = UNDEFINED; maxtok_l = strtoken(token[0], '=', &token_l); batch_str=strdup(token_l[1]); JOB_REGISTRY_ASSIGN_ENTRY(en.batch_id,batch_str); JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); en.exitcode=-1; bupdater_push_active_job(&bact, en.batch_id); do_log(debuglogfile, debug, 4, "%s: bupdater_push_active_job done for %s\n",argv0,en.batch_id); free(batch_str); freetoken(&token_l,maxtok_l); if(!first) free(ren); if ((ren=job_registry_get(rha, en.batch_id)) == NULL){ fprintf(stderr,"Get of record returns error "); perror(""); } if(ren){ if(strlen(ren->updater_info)>0){ en.udate=ren->udate; }else{ en.udate=time(0); } } first=FALSE; }else if(line && strstr(line," JobState=")){ if(token[0] && strstr(line,"JobState=")){ maxtok_l = strtoken(token[0], '=', &token_l); if(token_l[1] && strstr(token_l[1],"PENDING")){ en.status=IDLE; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"RUNNING")){ en.status=RUNNING; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"COMPLETED")){ en.status=COMPLETED; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"CANCELLED")){ en.status=REMOVED; en.exitcode=-999; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"FAILED")){ en.status=COMPLETED; en.exitcode=0; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"SUSPENDED")){ en.status=HELD; en.exitcode=-1; JOB_REGISTRY_ASSIGN_ENTRY(en.updater_info,string_now); }else if(token_l[1] && strstr(token_l[1],"COMPLETING")){ bupdater_remove_active_job(&bact, en.batch_id); } freetoken(&token_l,maxtok_l); } }else if(line && strstr(line," BatchHost=")){ if(token[0] && strstr(line,"BatchHost=")){ maxtok_l = strtoken(token[0], '=', &token_l); if(en.status!=IDLE){ JOB_REGISTRY_ASSIGN_ENTRY(en.wn_addr,token_l[1]); } freetoken(&token_l,maxtok_l); } }else if(line && strstr(line," ExitCode=")){ if(token[3] && strstr(line,"ExitCode=")){ maxtok_l = strtoken(token[3], '=', &token_l); maxtok_e = strtoken(token_l[1], ':', &token_e); if(en.status==COMPLETED){ en.exitcode=atoi(token_e[0]); } freetoken(&token_l,maxtok_l); freetoken(&token_e,maxtok_e); } }else if(line && strstr(line," SubmitTime=")){ if(en.status==IDLE){ if(token[0] && strstr(line,"SubmitTime=")){ maxtok_l = strtoken(token[0], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } }else if(line && strstr(line," StartTime=")){ if(en.status==RUNNING){ if(token[0] && strstr(line,"StartTime=")){ maxtok_l = strtoken(token[0], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } if(en.status==COMPLETED || en.status==REMOVED){ if(token[1] && strstr(line,"EndTime=")){ maxtok_l = strtoken(token[1], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } }else if(line && strstr(line," SuspendTime=")){ if(en.status==HELD){ if(token[1] && strstr(line,"SuspendTime=")){ maxtok_l = strtoken(token[1], '=', &token_l); tmstampepoch=str2epoch(token_l[1],"N"); en.udate=tmstampepoch; freetoken(&token_l,maxtok_l); } } } free(line); free(string_now); freetoken(&token,maxtok_t); } pclose(fp); } if(en.status!=UNDEFINED && ren && ren->status!=REMOVED && ren->status!=COMPLETED){ if ((ret=job_registry_update_recn_select(rha, &en, ren->recnum, JOB_REGISTRY_UPDATE_WN_ADDR| JOB_REGISTRY_UPDATE_STATUS| JOB_REGISTRY_UPDATE_UDATE| JOB_REGISTRY_UPDATE_UPDATER_INFO| JOB_REGISTRY_UPDATE_EXITCODE| JOB_REGISTRY_UPDATE_EXITREASON)) < 0){ if(ret != JOB_REGISTRY_NOT_FOUND){ fprintf(stderr,"Update of record returns %d: ",ret); perror(""); } } else { if(ret==JOB_REGISTRY_SUCCESS){ if (en.status == REMOVED || en.status == COMPLETED) { do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d exitcode=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status,en.exitcode); job_registry_unlink_proxy(rha, &en); }else{ do_log(debuglogfile, debug, 2, "%s: registry update in IntStateQuery for: jobid=%s creamjobid=%s wn=%s status=%d\n",argv0,en.batch_id,en.user_prefix,en.wn_addr,en.status); } if (remupd_conf != NULL){ if ((ret=job_registry_send_update(remupd_head_send,&en,NULL,NULL))<=0){ do_log(debuglogfile, debug, 2, "%s: Error creating endpoint in IntStateQuery\n",argv0); } } } } } free(ren); free(command_string); return 0; }