/* * If the node list supplied is a file name, translate that into * a list of nodes, we orphan the data pointed to * RET true if the node list is a valid one */ bool verify_node_list(char **node_list_pptr, enum task_dist_states dist, int task_count) { char *nodelist = NULL; xassert (node_list_pptr); xassert (*node_list_pptr); if (strchr(*node_list_pptr, '/') == NULL) return true; /* not a file name */ /* If we are using Arbitrary grab count out of the hostfile using them exactly the way we read it in since we are saying, lay it out this way! */ if(dist == SLURM_DIST_ARBITRARY) nodelist = slurm_read_hostfile(*node_list_pptr, task_count); else nodelist = slurm_read_hostfile(*node_list_pptr, NO_VAL); if (!nodelist) return false; xfree(*node_list_pptr); *node_list_pptr = xstrdup(nodelist); free(nodelist); return true; }
/* * verify that a node count in arg is of a known form (count or min-max) * OUT min, max specified minimum and maximum node counts * RET true if valid */ bool verify_node_count(const char *arg, int *min_nodes, int *max_nodes) { char *ptr, *min_str, *max_str; char *leftover; /* Does the string contain a "-" character? If so, treat as a range. * otherwise treat as an absolute node count. */ if ((ptr = index(arg, '-')) != NULL) { min_str = xstrndup(arg, ptr-arg); *min_nodes = _str_to_nodes(min_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", min_str); xfree(min_str); return false; } xfree(min_str); #ifdef HAVE_ALPS_CRAY if (*min_nodes < 0) { #else if (*min_nodes == 0) { #endif *min_nodes = 1; } max_str = xstrndup(ptr+1, strlen(arg)-((ptr+1)-arg)); *max_nodes = _str_to_nodes(max_str, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", max_str); xfree(max_str); return false; } xfree(max_str); } else { *min_nodes = *max_nodes = _str_to_nodes(arg, &leftover); if (!xstring_is_whitespace(leftover)) { error("\"%s\" is not a valid node count", arg); return false; } #ifdef HAVE_ALPS_CRAY if (*min_nodes < 0) { #else if (*min_nodes == 0) { #endif /* whitespace does not a valid node count make */ error("\"%s\" is not a valid node count", arg); return false; } } if ((*max_nodes != 0) && (*max_nodes < *min_nodes)) { error("Maximum node count %d is less than" " minimum node count %d", *max_nodes, *min_nodes); return false; } return true; } /* * If the node list supplied is a file name, translate that into * a list of nodes, we orphan the data pointed to * RET true if the node list is a valid one */ bool verify_node_list(char **node_list_pptr, enum task_dist_states dist, int task_count) { char *nodelist = NULL; xassert (node_list_pptr); xassert (*node_list_pptr); if (strchr(*node_list_pptr, '/') == NULL) return true; /* not a file name */ /* If we are using Arbitrary grab count out of the hostfile using them exactly the way we read it in since we are saying, lay it out this way! */ if ((dist & SLURM_DIST_STATE_BASE) == SLURM_DIST_ARBITRARY) nodelist = slurm_read_hostfile(*node_list_pptr, task_count); else nodelist = slurm_read_hostfile(*node_list_pptr, NO_VAL); if (!nodelist) return false; xfree(*node_list_pptr); *node_list_pptr = xstrdup(nodelist); free(nodelist); return true; }
/* _filter_job_records - filtering job information per user specification * RET Count of job's filtered out OTHER than for job ID value */ static int _filter_job_records (void) { int filter_cnt = 0; int i; job_info_t *job_ptr = NULL; uint32_t job_base_state; job_ptr = job_buffer_ptr->job_array; for (i = 0; i < job_buffer_ptr->record_count; i++, job_ptr++) { if (IS_JOB_FINISHED(job_ptr)) job_ptr->job_id = 0; if (job_ptr->job_id == 0) continue; job_base_state = job_ptr->job_state & JOB_STATE_BASE; if ((job_base_state != JOB_PENDING) && (job_base_state != JOB_RUNNING) && (job_base_state != JOB_SUSPENDED)) { job_ptr->job_id = 0; filter_cnt++; continue; } if (opt.account != NULL && xstrcmp(job_ptr->account, opt.account)) { job_ptr->job_id = 0; filter_cnt++; continue; } if (opt.job_name != NULL && xstrcmp(job_ptr->name, opt.job_name)) { job_ptr->job_id = 0; filter_cnt++; continue; } if ((opt.partition != NULL) && xstrcmp(job_ptr->partition, opt.partition)) { job_ptr->job_id = 0; filter_cnt++; continue; } if ((opt.qos != NULL) && xstrcmp(job_ptr->qos, opt.qos)) { job_ptr->job_id = 0; filter_cnt++; continue; } if ((opt.reservation != NULL) && xstrcmp(job_ptr->resv_name, opt.reservation)) { job_ptr->job_id = 0; filter_cnt++; continue; } if ((opt.state != JOB_END) && (job_ptr->job_state != opt.state)) { job_ptr->job_id = 0; filter_cnt++; continue; } if ((opt.user_name != NULL) && (job_ptr->user_id != opt.user_id)) { job_ptr->job_id = 0; filter_cnt++; continue; } if (opt.nodelist != NULL) { /* If nodelist contains a '/', treat it as a file name */ if (strchr(opt.nodelist, '/') != NULL) { char *reallist; reallist = slurm_read_hostfile(opt.nodelist, NO_VAL); if (reallist) { xfree(opt.nodelist); opt.nodelist = reallist; } } hostset_t hs = hostset_create(job_ptr->nodes); if (!hostset_intersects(hs, opt.nodelist)) { job_ptr->job_id = 0; filter_cnt++; hostset_destroy(hs); continue; } else { hostset_destroy(hs); } } if (opt.wckey != NULL) { char *job_key = job_ptr->wckey; /* * A wckey that begins with '*' indicates that the wckey * was applied by default. When the --wckey option does * not begin with a '*', act on all wckeys with the same * name, default or not. */ if ((opt.wckey[0] != '*') && (job_key[0] == '*')) job_key++; if (xstrcmp(job_key, opt.wckey) != 0) { job_ptr->job_id = 0; filter_cnt++; continue; } } } return filter_cnt; }