int add_node_names( alps_reservation *ar, job *pjob) { char *exec_str = strdup(pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str); char *host_tok; char *str_ptr = exec_str; char *slash; int rc = PBSE_NONE; char *prev_node = NULL; ar->ar_node_names = initialize_resizable_array(INITIAL_NODE_LIST_SIZE); while ((host_tok = threadsafe_tokenizer(&str_ptr, "+")) != NULL) { if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; if ((prev_node == NULL) || (strcmp(prev_node, host_tok))) { if ((rc = insert_thing(ar->ar_node_names, host_tok)) < 0) break; else rc = PBSE_NONE; } prev_node = host_tok; } return(rc); } /* END add_node_names() */
int add_node_names( alps_reservation *ar, job *pjob) { if (!pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str) { if (LOGLEVEL >= 7) { char log_buf[PBS_MAXSVRJOBID + 512]; snprintf(log_buf, sizeof(log_buf), "Job %s exec list was null", pjob->ji_qs.ji_jobid); log_event(PBSEVENT_JOB, PBS_EVENTCLASS_JOB, __func__, log_buf); } return -1; } char *exec_str = strdup(pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str); char *host_tok; char *str_ptr = exec_str; char *slash; while ((host_tok = threadsafe_tokenizer(&str_ptr, "+")) != NULL) { if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; ar->ar_node_names.push_back(std::string(host_tok)); } return(PBSE_NONE); } /* END add_node_names() */
int is_ms_on_server( const job *pjob) { char mom_fullhostname[PBS_MAXHOSTNAME + 1]; int ms_on_server = 0; char *exec_hosts = pjob->ji_wattr[JOB_ATR_exec_host].at_val.at_str; if (exec_hosts) { char *host_tok = threadsafe_tokenizer(&exec_hosts, "+"); if (host_tok) { char *slash; if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; snprintf(mom_fullhostname, sizeof(mom_fullhostname), "%s", host_tok); if (strstr(server_host, ".")) if (strstr(host_tok, ".") == NULL) get_fullhostname(host_tok, mom_fullhostname, sizeof(mom_fullhostname), NULL); ms_on_server = strcmp(server_host, mom_fullhostname) == 0; } } return(ms_on_server); } /* is_ms_on_server */
int num_array_jobs( char *req_str) /* I */ { int num_jobs = 0; int start; int end; char *delim = ","; char *ptr; char *dash; char *tmp_ptr; char tmp_str[MAXPATHLEN]; if (req_str == NULL) return(-1); snprintf(tmp_str, sizeof(tmp_str), "%s", req_str); tmp_ptr = tmp_str; ptr = threadsafe_tokenizer(&tmp_ptr, delim); while (ptr != NULL) { if ((dash = strchr(ptr,'-')) != NULL) { /* this is a range */ start = atoi(ptr); end = atoi(dash+1); /* check for invalid range */ if (end < start) return(-1); num_jobs += end - start + 1; } else { /* just one job */ num_jobs++; } ptr = threadsafe_tokenizer(&tmp_ptr, delim); } return(num_jobs); } /* END num_array_jobs */
int create_reserve_params_from_multi_req_list( char *multi_req_list, /* I */ char *apbasil_protocol, /* I */ int nppcu, /* I */ int mppdepth, /* I */ dynamic_string *command) /* O */ { dynamic_string *node_list = get_dynamic_string(-1, NULL); char *tok; char *str = multi_req_list; int node_count; char *comma; unsigned int width; unsigned int nppn; while ((tok = threadsafe_tokenizer(&str, "*")) != NULL) { node_count = 1; clear_dynamic_string(node_list); append_dynamic_string(node_list, tok); comma = tok; while ((comma = strchr(comma+1, ',')) != NULL) node_count++; tok = threadsafe_tokenizer(&str, "|"); nppn = atoi(tok); width = nppn * node_count; adjust_for_depth(width, nppn, mppdepth); save_current_reserve_param(command, apbasil_protocol, node_list, width, nppn, nppcu, mppdepth); } if (node_list != NULL) free(node_list); return(PBSE_NONE); } /* END create_reserve_params_from_multi_req_list() */
int create_reserve_params_from_multi_req_list( char *multi_req_list, /* I */ char *apbasil_protocol, /* I */ int nppcu, /* I */ int mppdepth, /* I */ std::string& command, /* O */ std::string& cray_frequency) /* I */ { std::string node_list = ""; char *tok; char *str = multi_req_list; int node_count; char *comma; unsigned int width; unsigned int nppn; while ((tok = threadsafe_tokenizer(&str, "*")) != NULL) { node_count = 1; node_list.clear(); node_list += tok; comma = tok; while ((comma = strchr(comma+1, ',')) != NULL) node_count++; tok = threadsafe_tokenizer(&str, "|"); nppn = atoi(tok); width = nppn * node_count; adjust_for_depth(width, nppn, mppdepth); save_current_reserve_param(command, apbasil_protocol, node_list, width, nppn, nppcu, mppdepth, cray_frequency); } return(PBSE_NONE); } /* END create_reserve_params_from_multi_req_list() */
int handle_level( char *level_iter, int path_index, int &level_index) { const char *delims = ","; char *host_tok; level_index++; /* find each hostname */ host_tok = threadsafe_tokenizer(&level_iter, delims); while (host_tok != NULL) { struct addrinfo *addr_info = NULL; char *colon; unsigned short rm_port; host_tok = trim(host_tok); if ((colon = strchr(host_tok, ':')) != NULL) { *colon = '\0'; rm_port = strtol(colon+1, NULL, 10); } else rm_port = PBS_MANAGER_SERVICE_PORT; if (pbs_getaddrinfo(host_tok, NULL, &addr_info) == 0) add_network_entry(mh, host_tok, addr_info, rm_port, path_index, level_index); host_tok = threadsafe_tokenizer(&level_iter, delims); } return(PBSE_NONE); } /* END handle_level() */
void change_restart_comment_if_needed( struct job *pjob) { if ((pjob->ji_wattr[JOB_ATR_start_count].at_val.at_long > 1) && (pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_flags & ATR_VFLAG_SET)) { char *token1 = NULL; char *token2 = NULL; char *comment_ptr; char commentMsg[25]; char *ptr; snprintf(commentMsg, sizeof(commentMsg), "%s", pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_val.at_str); comment_ptr = commentMsg; token1 = threadsafe_tokenizer(&comment_ptr, " "); if (token1 != NULL) token2 = threadsafe_tokenizer(&comment_ptr, " "); if ((token2 != NULL) && ((memcmp(token2,"failure",7) == 0) || (memcmp(token2,"restarted",9) == 0))) { ptr = pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_val.at_str; if (isupper(*ptr)) { *ptr = tolower(*ptr); pjob->ji_wattr[JOB_ATR_checkpoint_restart_status].at_flags |= ATR_VFLAG_SET; pjob->ji_modified = 1; } } } return; } /* change_restart_comment_if_needed() */
long count_proc( char *param_spec) { long num_nodes = 0; long num_procs = 0; long total_procs = 0; char *substr; char *ppnloc; char *spec; char *spec_ptr; // if we get a null param spec, just return 0 procs if (param_spec == NULL) return(0); if ((spec = strdup(param_spec)) == NULL) return(-1); spec_ptr = spec; /* split on + */ while ((substr = threadsafe_tokenizer(&spec_ptr, "+")) != NULL) { num_nodes = atoi(substr); if (num_nodes == 0) /* no number */ num_nodes = 1; ppnloc = strstr(substr, ":ppn="); if (ppnloc == NULL) num_procs = 1; else num_procs = atoi(ppnloc + 5); total_procs += num_procs * num_nodes; } free(spec); return(total_procs); } /* END count_proc */
resizable_array *parse_exec_hosts( char *exec_hosts_param) { char *slash; char *host_tok; char *exec_hosts = strdup(exec_hosts_param); char *str_ptr = exec_hosts; char *delims = "+"; char *prev_host_tok = NULL; host_req *hr; resizable_array *host_req_list = initialize_resizable_array(100); while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL) { if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; /* skip this host - the login shouldn't be part of the alps reservation */ if ((strcmp(mom_host, host_tok)) && (strcmp(mom_alias, host_tok))) { if ((prev_host_tok != NULL) && (!strcmp(prev_host_tok, host_tok))) { hr = (host_req *)host_req_list->slots[host_req_list->last].item; hr->ppn += 1; } else { prev_host_tok = host_tok; hr = get_host_req(host_tok); insert_thing(host_req_list, hr); } } } free(exec_hosts); return(host_req_list); } /* END parse_exec_hosts() */
host_req_list *parse_exec_hosts( char *exec_hosts_param, const char *mppnodes) { char *slash; char *host_tok; char *exec_hosts = strdup(exec_hosts_param); char *str_ptr = exec_hosts; const char *delims = "+"; char *prev_host_tok = NULL; host_req *hr; host_req_list *list = new host_req_list(); while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL) { if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; /* skip this host - the login shouldn't be part of the alps reservation */ if ((strcmp(mom_host, host_tok)) && (strcmp(mom_alias, host_tok))) { if ((prev_host_tok != NULL) && (!strcmp(prev_host_tok, host_tok))) { hr = list->back(); hr->ppn += 1; } else { prev_host_tok = host_tok; hr = get_host_req(host_tok); list->push_back(hr); } } } free(exec_hosts); return(sort_exec_hosts(list,mppnodes)); } /* END parse_exec_hosts() */
host_req_list *parse_exec_hosts( char *exec_hosts_param, const char *mppnodes) { char *slash; char *host_tok; char *exec_hosts = strdup(exec_hosts_param); char *str_ptr = exec_hosts; const char *delims = "+"; host_req *hr; host_req_list *list = new host_req_list(); while ((host_tok = threadsafe_tokenizer(&str_ptr, delims)) != NULL) { if ((slash = strchr(host_tok, '/')) != NULL) *slash = '\0'; /* skip this host - the login shouldn't be part of the alps reservation */ if ((strcmp(mom_host, host_tok)) && (strcmp(mom_alias, host_tok))) { std::vector<int> indices; if (slash != NULL) { translate_range_string_to_vector(slash + 1, indices); hr = get_host_req(host_tok, indices.size()); } else hr = get_host_req(host_tok, 1); list->push_back(hr); } } free(exec_hosts); return(sort_exec_hosts(list,mppnodes)); } /* END parse_exec_hosts() */
resizable_array *sort_exec_hosts( resizable_array *exec_hosts, const char *mppnodes) { if(mppnodes == NULL) { return exec_hosts; } char *tmp = strdup(mppnodes); char *tmp_str = tmp; resizable_array *tmp_host_list = initialize_resizable_array(100); char *tok; int iter; host_req *pHr; while((tok = threadsafe_tokenizer(&tmp_str,",")) != NULL) { iter = -1; while((pHr = (host_req *)next_thing_from_back(exec_hosts,&iter)) != NULL) { if(strcmp(pHr->hostname,tok) == 0) { insert_thing(tmp_host_list,pHr); remove_thing(exec_hosts,pHr); break; } } } iter = -1; while((pHr = (host_req *)next_thing_from_back(exec_hosts,&iter)) != NULL) { insert_thing(tmp_host_list,pHr); } free_resizable_array(exec_hosts); free(tmp); return tmp_host_list; }
host_req_list *sort_exec_hosts( host_req_list *exec_hosts, const char *mppnodes) { if(mppnodes == NULL) { return exec_hosts; } char *tmp = strdup(mppnodes); char *tmp_str = tmp; host_req_list *tmp_host_list = new host_req_list(); char *tok; host_req *pHr; while((tok = threadsafe_tokenizer(&tmp_str,",")) != NULL) { for(int i = exec_hosts->size() - 1;i >= 0;i--) { pHr = exec_hosts->at(i); if(strcmp(pHr->hostname,tok) == 0) { tmp_host_list->push_back(pHr); exec_hosts->erase(exec_hosts->begin() + i); break; } } } while(exec_hosts->size() != 0) { tmp_host_list->push_back(exec_hosts->back()); exec_hosts->pop_back(); } delete exec_hosts; free(tmp); return tmp_host_list; }
void update_job_data( struct pbsnode *np, /* I */ const char *jobstring_in) /* I (changed attributes sent by mom) */ { char *jobdata; char *jobdata_ptr; char *jobidstr; char *attr_name; char *attr_value; char log_buf[LOCAL_LOG_BUF_SIZE]; job *pjob = NULL; int on_node = FALSE; if ((jobstring_in == NULL) || (!isdigit(*jobstring_in))) { /* NO-OP */ return; } /* FORMAT <JOBID>:<atrtributename=value>,<atrtributename=value>... */ jobdata = strdup(jobstring_in); jobdata_ptr = jobdata; jobidstr = threadsafe_tokenizer(&jobdata_ptr, ":"); if ((jobidstr != NULL) && isdigit(*jobidstr)) { if (strstr(jobidstr, server_name) != NULL) { on_node = is_job_on_node(np, job_mapper.get_id(jobidstr)); pjob = svr_find_job(jobidstr, TRUE); if (pjob != NULL) { int bad; svrattrl tA; mutex_mgr job_mutex(pjob->ji_mutex, true); /* job exists, so get the attributes and update them */ attr_name = threadsafe_tokenizer(&jobdata_ptr, "="); while (attr_name != NULL) { attr_value = threadsafe_tokenizer(&jobdata_ptr, ","); if (LOGLEVEL >= 9) { sprintf(log_buf, "Mom sent changed attribute %s value %s for job %s", attr_name, attr_value, pjob->ji_qs.ji_jobid); log_event(PBSEVENT_JOB,PBS_EVENTCLASS_JOB,pjob->ji_qs.ji_jobid,log_buf); } memset(&tA, 0, sizeof(tA)); tA.al_name = attr_name; tA.al_resc = (char *)""; tA.al_value = attr_value; tA.al_op = SET; modify_job_attr( pjob, &tA, /* I: ATTR_sched_hint - svrattrl */ ATR_DFLAG_MGWR | ATR_DFLAG_SvWR, &bad); attr_name = threadsafe_tokenizer(&jobdata_ptr, "="); } } if (on_node == FALSE) { /* job is reported by mom but server has no record of job */ sprintf(log_buf, "stray job %s reported on %s", jobidstr, np->nd_name); log_err(-1, __func__, log_buf); } } } free(jobdata); } /* END update_job_data() */