int xcpuinfo_abs_to_mac(char* lrange,char** prange) { static int total_cores = -1, total_cpus = -1; bitstr_t* absmap = NULL; bitstr_t* macmap = NULL; int icore, ithread; int absid, macid; int rc = SLURM_SUCCESS; if (total_cores == -1) { total_cores = conf->sockets * conf->cores; total_cpus = conf->block_map_size; } /* allocate bitmap */ absmap = bit_alloc(total_cores); macmap = bit_alloc(total_cpus); if (!absmap || !macmap) { rc = SLURM_ERROR; goto end_it; } /* string to bitmap conversion */ if (bit_unfmt(absmap, lrange)) { rc = SLURM_ERROR; goto end_it; } /* mapping abstract id to machine id using conf->block_map */ for (icore = 0; icore < total_cores; icore++) { if (bit_test(absmap, icore)) { for (ithread = 0; ithread<conf->threads; ithread++) { absid = icore*conf->threads + ithread; absid %= total_cpus; macid = conf->block_map[absid]; macid %= total_cpus; bit_set(macmap, macid); } } } /* convert machine cpu bitmap to range string */ *prange = (char*)xmalloc(total_cpus*6); bit_fmt(*prange, total_cpus*6, macmap); /* free unused bitmaps */ end_it: FREE_NULL_BITMAP(absmap); FREE_NULL_BITMAP(macmap); if (rc != SLURM_SUCCESS) info("_abs_to_mac failed"); return rc; }
extern int good_nodes_from_inx(List local_cluster_list, void **object, char *node_inx, int start) { local_cluster_t **curr_cluster = (local_cluster_t **)object; /* check the bitmap to see if this is one of the jobs we are looking for */ if (*curr_cluster) { bitstr_t *job_bitmap = NULL; if (!node_inx || !node_inx[0]) return 0; if ((start < (*curr_cluster)->start) || (start > (*curr_cluster)->end)) { local_cluster_t *local_cluster = NULL; ListIterator itr = list_iterator_create(local_cluster_list); while ((local_cluster = list_next(itr))) { if ((start >= local_cluster->start) && (start <= local_cluster->end)) { *curr_cluster = local_cluster; break; } } list_iterator_destroy(itr); if (!local_cluster) return 0; } job_bitmap = bit_alloc(hostlist_count((*curr_cluster)->hl)); bit_unfmt(job_bitmap, node_inx); if (!bit_overlap((*curr_cluster)->asked_bitmap, job_bitmap)) { FREE_NULL_BITMAP(job_bitmap); return 0; } FREE_NULL_BITMAP(job_bitmap); } return 1; }
/* * good_nodes_from_inx - whether node index is within the used nodes * of specified cluster */ extern int good_nodes_from_inx(cluster_nodes_t *cnodes, char *node_inx, int submit) { bitstr_t *job_bitmap = NULL; if (! cnodes) return 1; if (!node_inx || !node_inx[0]) return 0; if (!cnodes->curr_cluster || (submit < (cnodes->curr_cluster)->start) || (submit > (cnodes->curr_cluster)->end)) { local_cluster_t *local_cluster = NULL; ListIterator itr = list_iterator_create(cnodes->cluster_list); while((local_cluster = list_next(itr))) { if ((submit >= local_cluster->start) && (submit <= local_cluster->end)) { cnodes->curr_cluster = local_cluster; break; } } list_iterator_destroy(itr); if (! local_cluster) return 0; } job_bitmap = bit_alloc(hostlist_count((cnodes->curr_cluster)->hl)); bit_unfmt(job_bitmap, node_inx); if (!bit_overlap((cnodes->curr_cluster)->asked_bitmap, job_bitmap)) { FREE_NULL_BITMAP(job_bitmap); return 0; } FREE_NULL_BITMAP(job_bitmap); return 1; }
/* unpack a select job credential from a buffer * OUT jobinfo - the select job credential read * IN buffer - buffer with select credential read from current pointer loc * IN protocol_version - slurm protocol version of client * RET - slurm error code * NOTE: returned value must be freed using free_jobinfo */ extern int unpack_select_jobinfo(select_jobinfo_t **jobinfo_pptr, Buf buffer, uint16_t protocol_version) { int i; uint32_t uint32_tmp; uint16_t mp_cnode_cnt; int dims = slurmdb_setup_cluster_dims(); select_jobinfo_t *jobinfo = xmalloc(sizeof(struct select_jobinfo)); char *bit_char = NULL; *jobinfo_pptr = jobinfo; jobinfo->magic = JOBINFO_MAGIC; if (protocol_version >= SLURM_2_5_PROTOCOL_VERSION) { safe_unpack16(&jobinfo->dim_cnt, buffer); xassert(jobinfo->dim_cnt); dims = jobinfo->dim_cnt; for (i=0; i<dims; i++) { safe_unpack16(&(jobinfo->geometry[i]), buffer); safe_unpack16(&(jobinfo->conn_type[i]), buffer); safe_unpack16(&(jobinfo->start_loc[i]), buffer); } safe_unpack16(&(jobinfo->reboot), buffer); safe_unpack16(&(jobinfo->rotate), buffer); safe_unpack32(&(jobinfo->block_cnode_cnt), buffer); safe_unpack32(&(jobinfo->cnode_cnt), buffer); safe_unpackstr_xmalloc(&(jobinfo->bg_block_id), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->mp_str), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->ionode_str), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->blrtsimage), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->linuximage), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->mloaderimage), &uint32_tmp, buffer); safe_unpackstr_xmalloc(&(jobinfo->ramdiskimage), &uint32_tmp, buffer); safe_unpack16(&mp_cnode_cnt, buffer); safe_unpackstr_xmalloc(&bit_char, &uint32_tmp, buffer); if (bit_char) { jobinfo->units_avail = bit_alloc(mp_cnode_cnt); bit_unfmt(jobinfo->units_avail, bit_char); xfree(bit_char); } safe_unpackstr_xmalloc(&bit_char, &uint32_tmp, buffer); if (bit_char) { jobinfo->units_used = bit_alloc(mp_cnode_cnt); bit_unfmt(jobinfo->units_used, bit_char); xfree(bit_char); } } else { error("unpack_select_jobinfo: protocol_version " "%hu not supported", protocol_version); } return SLURM_SUCCESS; unpack_error: free_select_jobinfo(jobinfo); *jobinfo_pptr = NULL; return SLURM_ERROR; }
int main(int argc, char *argv[]) { note("Testing static decl"); { bitstr_t bit_decl(bs, 65); /*bitstr_t *bsp = bs;*/ bit_set(bs,9); bit_set(bs,14); TEST(bit_test(bs,9), "bit 9 set"); TEST(!bit_test(bs,12), "bit 12 not set"); TEST(bit_test(bs,14), "bit 14 set" ); /*bit_free(bsp);*/ /* triggers TEST in bit_free - OK */ } note("Testing basic vixie functions"); { bitstr_t *bs = bit_alloc(16), *bs2; /*bit_set(bs, 42);*/ /* triggers TEST in bit_set - OK */ bit_set(bs,9); bit_set(bs,14); TEST(bit_test(bs,9), "bit 9 set"); TEST(!bit_test(bs,12), "bit 12 not set" ); TEST(bit_test(bs,14), "bit 14 set"); bs2 = bit_copy(bs); bit_fill_gaps(bs2); TEST(bit_ffs(bs2) == 9, "first bit set = 9 "); TEST(bit_fls(bs2) == 14, "last bit set = 14"); TEST(bit_set_count(bs2) == 6, "bitstring"); TEST(bit_test(bs2,12), "bitstring"); TEST(bit_super_set(bs,bs2) == 1, "bitstring"); TEST(bit_super_set(bs2,bs) == 0, "bitstring"); bit_clear(bs,14); TEST(!bit_test(bs,14), "bitstring"); bit_nclear(bs,9,14); TEST(!bit_test(bs,9), "bitstring"); TEST(!bit_test(bs,12), "bitstring"); TEST(!bit_test(bs,14), "bitstring"); bit_nset(bs,9,14); TEST(bit_test(bs,9), "bitstring"); TEST(bit_test(bs,12), "bitstring"); TEST(bit_test(bs,14), "bitstring"); TEST(bit_ffs(bs) == 9, "ffs"); TEST(bit_ffc(bs) == 0, "ffc"); bit_nset(bs,0,8); TEST(bit_ffc(bs) == 15, "ffc"); bit_free(bs); /*bit_set(bs,9); */ /* triggers TEST in bit_set - OK */ } note("Testing and/or/not"); { bitstr_t *bs1 = bit_alloc(128); bitstr_t *bs2 = bit_alloc(128); bit_set(bs1, 100); bit_set(bs1, 104); bit_set(bs2, 100); bit_and(bs1, bs2); TEST(bit_test(bs1, 100), "and"); TEST(!bit_test(bs1, 104), "and"); bit_set(bs2, 110); bit_set(bs2, 111); bit_set(bs2, 112); bit_or(bs1, bs2); TEST(bit_test(bs1, 100), "or"); TEST(bit_test(bs1, 110), "or"); TEST(bit_test(bs1, 111), "or"); TEST(bit_test(bs1, 112), "or"); bit_not(bs1); TEST(!bit_test(bs1, 100), "not"); TEST(bit_test(bs1, 12), "not"); bit_free(bs1); bit_free(bs2); } note("testing bit selection"); { bitstr_t *bs1 = bit_alloc(128), *bs2; bit_set(bs1, 21); bit_set(bs1, 100); bit_fill_gaps(bs1); bs2 = bit_pick_cnt(bs1,20); if (bs2) { TEST(bit_set_count(bs2) == 20, "pick"); TEST(bit_ffs(bs2) == 21, "pick"); TEST(bit_fls(bs2) == 40, "pick"); bit_free(bs2); } else TEST(0, "alloc fail"); bit_free(bs1); } note("Testing realloc"); { bitstr_t *bs = bit_alloc(1); TEST(bit_ffs(bs) == -1, "bitstring"); bit_set(bs,0); /*bit_set(bs, 1000);*/ /* triggers TEST in bit_set - OK */ bs = bit_realloc(bs,1048576); bit_set(bs,1000); bit_set(bs,1048575); TEST(bit_test(bs, 0), "bitstring"); TEST(bit_test(bs, 1000), "bitstring"); TEST(bit_test(bs, 1048575), "bitstring"); TEST(bit_set_count(bs) == 3, "bitstring"); bit_clear(bs,0); bit_clear(bs,1000); TEST(bit_set_count(bs) == 1, "bitstring"); TEST(bit_ffs(bs) == 1048575, "bitstring"); bit_free(bs); } note("Testing bit_fmt"); { char tmpstr[1024]; bitstr_t *bs = bit_alloc(1024); TEST(!strcmp(bit_fmt(tmpstr,sizeof(tmpstr),bs), ""), "bitstring"); bit_set(bs,42); TEST(!strcmp(bit_fmt(tmpstr,sizeof(tmpstr),bs), "42"), "bitstring"); bit_set(bs,102); TEST(!strcmp(bit_fmt(tmpstr,sizeof(tmpstr),bs), "42,102"), "bitstring"); bit_nset(bs,9,14); TEST(!strcmp(bit_fmt(tmpstr,sizeof(tmpstr), bs), "9-14,42,102"), "bitstring"); } note("Testing bit_nffc/bit_nffs"); { bitstr_t *bs = bit_alloc(1024); bit_set(bs, 2); bit_set(bs, 6); bit_set(bs, 7); bit_nset(bs,12,1018); TEST(bit_nffc(bs, 2) == 0, "bitstring"); TEST(bit_nffc(bs, 3) == 3, "bitstring"); TEST(bit_nffc(bs, 4) == 8, "bitstring"); TEST(bit_nffc(bs, 5) == 1019, "bitstring"); TEST(bit_nffc(bs, 6) == -1, "bitstring"); TEST(bit_nffs(bs, 1) == 2, "bitstring"); TEST(bit_nffs(bs, 2) == 6, "bitstring"); TEST(bit_nffs(bs, 100) == 12, "bitstring"); TEST(bit_nffs(bs, 1023) == -1, "bitstring"); bit_free(bs); } note("Testing bit_unfmt"); { bitstr_t *bs = bit_alloc(1024); bitstr_t *bs2 = bit_alloc(1024); char tmpstr[4096]; bit_set(bs,1); bit_set(bs,3); bit_set(bs,30); bit_nset(bs,42,64); bit_nset(bs,97,1000); bit_fmt(tmpstr, sizeof(tmpstr), bs); TEST(bit_unfmt(bs2, tmpstr) != -1, "bitstring"); TEST(bit_equal(bs, bs2), "bitstring"); } totals(); return failed; }
extern List as_mysql_get_qos(mysql_conn_t *mysql_conn, uid_t uid, slurmdb_qos_cond_t *qos_cond) { char *query = NULL; char *extra = NULL; char *tmp = NULL; List qos_list = NULL; ListIterator itr = NULL; char *object = NULL; int set = 0; int i=0; MYSQL_RES *result = NULL; MYSQL_ROW row; /* if this changes you will need to edit the corresponding enum */ char *qos_req_inx[] = { "name", "description", "id", "flags", "grace_time", "grp_cpu_mins", "grp_cpu_run_mins", "grp_cpus", "grp_jobs", "grp_nodes", "grp_submit_jobs", "grp_wall", "max_cpu_mins_per_job", "max_cpu_run_mins_per_user", "max_cpus_per_job", "max_jobs_per_user", "max_nodes_per_job", "max_submit_jobs_per_user", "max_wall_duration_per_job", "preempt", "preempt_mode", "priority", "usage_factor", "usage_thres", }; enum { QOS_REQ_NAME, QOS_REQ_DESC, QOS_REQ_ID, QOS_REQ_FLAGS, QOS_REQ_GRACE, QOS_REQ_GCM, QOS_REQ_GCRM, QOS_REQ_GC, QOS_REQ_GJ, QOS_REQ_GN, QOS_REQ_GSJ, QOS_REQ_GW, QOS_REQ_MCMPJ, QOS_REQ_MCRM, QOS_REQ_MCPJ, QOS_REQ_MJPU, QOS_REQ_MNPJ, QOS_REQ_MSJPU, QOS_REQ_MWPJ, QOS_REQ_PREE, QOS_REQ_PREEM, QOS_REQ_PRIO, QOS_REQ_UF, QOS_REQ_UT, QOS_REQ_COUNT }; if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!qos_cond) { xstrcat(extra, "where deleted=0"); goto empty; } if (qos_cond->with_deleted) xstrcat(extra, "where (deleted=0 || deleted=1)"); else xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } empty: xfree(tmp); xstrfmtcat(tmp, "%s", qos_req_inx[i]); for(i=1; i<QOS_REQ_COUNT; i++) { xstrfmtcat(tmp, ", %s", qos_req_inx[i]); } query = xstrdup_printf("select %s from %s %s", tmp, qos_table, extra); xfree(tmp); xfree(extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } xfree(query); qos_list = list_create(slurmdb_destroy_qos_rec); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos = xmalloc(sizeof(slurmdb_qos_rec_t)); list_append(qos_list, qos); if (row[QOS_REQ_DESC] && row[QOS_REQ_DESC][0]) qos->description = xstrdup(row[QOS_REQ_DESC]); qos->id = slurm_atoul(row[QOS_REQ_ID]); qos->flags = slurm_atoul(row[QOS_REQ_FLAGS]); if (row[QOS_REQ_NAME] && row[QOS_REQ_NAME][0]) qos->name = xstrdup(row[QOS_REQ_NAME]); if (row[QOS_REQ_GRACE]) qos->grace_time = slurm_atoul(row[QOS_REQ_GRACE]); else qos->grace_time = (uint32_t)NO_VAL; if (row[QOS_REQ_GCM]) qos->grp_cpu_mins = slurm_atoull(row[QOS_REQ_GCM]); else qos->grp_cpu_mins = INFINITE; if (row[QOS_REQ_GCRM]) qos->grp_cpu_run_mins = slurm_atoull(row[QOS_REQ_GCRM]); else qos->grp_cpu_run_mins = INFINITE; if (row[QOS_REQ_GC]) qos->grp_cpus = slurm_atoul(row[QOS_REQ_GC]); else qos->grp_cpus = INFINITE; if (row[QOS_REQ_GJ]) qos->grp_jobs = slurm_atoul(row[QOS_REQ_GJ]); else qos->grp_jobs = INFINITE; if (row[QOS_REQ_GN]) qos->grp_nodes = slurm_atoul(row[QOS_REQ_GN]); else qos->grp_nodes = INFINITE; if (row[QOS_REQ_GSJ]) qos->grp_submit_jobs = slurm_atoul(row[QOS_REQ_GSJ]); else qos->grp_submit_jobs = INFINITE; if (row[QOS_REQ_GW]) qos->grp_wall = slurm_atoul(row[QOS_REQ_GW]); else qos->grp_wall = INFINITE; if (row[QOS_REQ_MCMPJ]) qos->max_cpu_mins_pj = slurm_atoull(row[QOS_REQ_MCMPJ]); else qos->max_cpu_mins_pj = (uint64_t)INFINITE; if (row[QOS_REQ_MCRM]) qos->max_cpu_run_mins_pu = slurm_atoull(row[QOS_REQ_MCRM]); else qos->max_cpu_run_mins_pu = (uint64_t)INFINITE; if (row[QOS_REQ_MCPJ]) qos->max_cpus_pj = slurm_atoul(row[QOS_REQ_MCPJ]); else qos->max_cpus_pj = INFINITE; if (row[QOS_REQ_MJPU]) qos->max_jobs_pu = slurm_atoul(row[QOS_REQ_MJPU]); else qos->max_jobs_pu = INFINITE; if (row[QOS_REQ_MNPJ]) qos->max_nodes_pj = slurm_atoul(row[QOS_REQ_MNPJ]); else qos->max_nodes_pj = INFINITE; if (row[QOS_REQ_MSJPU]) qos->max_submit_jobs_pu = slurm_atoul(row[QOS_REQ_MSJPU]); else qos->max_submit_jobs_pu = INFINITE; if (row[QOS_REQ_MWPJ]) qos->max_wall_pj = slurm_atoul(row[QOS_REQ_MWPJ]); else qos->max_wall_pj = INFINITE; if (row[QOS_REQ_PREE] && row[QOS_REQ_PREE][0]) { if (!qos->preempt_bitstr) qos->preempt_bitstr = bit_alloc(g_qos_count); bit_unfmt(qos->preempt_bitstr, row[QOS_REQ_PREE]+1); } if (row[QOS_REQ_PREEM]) qos->preempt_mode = slurm_atoul(row[QOS_REQ_PREEM]); if (row[QOS_REQ_PRIO]) qos->priority = slurm_atoul(row[QOS_REQ_PRIO]); if (row[QOS_REQ_UF]) qos->usage_factor = atof(row[QOS_REQ_UF]); if (row[QOS_REQ_UT]) qos->usage_thres = atof(row[QOS_REQ_UT]); else qos->usage_thres = (double)INFINITE; } mysql_free_result(result); return qos_list; }
extern List as_mysql_modify_qos(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_qos_cond_t *qos_cond, slurmdb_qos_rec_t *qos) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; char *tmp_char1=NULL, *tmp_char2=NULL; bitstr_t *preempt_bitstr = NULL; char *added_preempt = NULL; if (!qos_cond || !qos) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } _setup_qos_limits(qos, &tmp_char1, &tmp_char2, &vals, &added_preempt, 0); if (added_preempt) { preempt_bitstr = bit_alloc(g_qos_count); bit_unfmt(preempt_bitstr, added_preempt+1); xfree(added_preempt); } xfree(tmp_char1); xfree(tmp_char2); if (!extra || !vals) { errno = SLURM_NO_CHANGE_IN_DATA; FREE_NULL_BITMAP(preempt_bitstr); error("Nothing to change"); return NULL; } query = xstrdup_printf("select name, preempt, id from %s %s;", qos_table, extra); xfree(extra); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); FREE_NULL_BITMAP(preempt_bitstr); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos_rec = NULL; uint32_t id = slurm_atoul(row[2]); if (preempt_bitstr) { if (_preemption_loop(mysql_conn, id, preempt_bitstr)) break; } object = xstrdup(row[0]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } qos_rec = xmalloc(sizeof(slurmdb_qos_rec_t)); qos_rec->name = xstrdup(object); qos_rec->id = id; qos_rec->flags = qos->flags; qos_rec->grp_cpus = qos->grp_cpus; qos_rec->grace_time = qos->grace_time; qos_rec->grp_cpu_mins = qos->grp_cpu_mins; qos_rec->grp_cpu_run_mins = qos->grp_cpu_run_mins; qos_rec->grp_jobs = qos->grp_jobs; qos_rec->grp_nodes = qos->grp_nodes; qos_rec->grp_submit_jobs = qos->grp_submit_jobs; qos_rec->grp_wall = qos->grp_wall; qos_rec->max_cpus_pj = qos->max_cpus_pj; qos_rec->max_cpu_mins_pj = qos->max_cpu_mins_pj; qos_rec->max_cpu_run_mins_pu = qos->max_cpu_run_mins_pu; qos_rec->max_jobs_pu = qos->max_jobs_pu; qos_rec->max_nodes_pj = qos->max_nodes_pj; qos_rec->max_submit_jobs_pu = qos->max_submit_jobs_pu; qos_rec->max_wall_pj = qos->max_wall_pj; qos_rec->preempt_mode = qos->preempt_mode; qos_rec->priority = qos->priority; if (qos->preempt_list) { ListIterator new_preempt_itr = list_iterator_create(qos->preempt_list); char *new_preempt = NULL; qos_rec->preempt_bitstr = bit_alloc(g_qos_count); if (row[1] && row[1][0]) bit_unfmt(qos_rec->preempt_bitstr, row[1]+1); while ((new_preempt = list_next(new_preempt_itr))) { bool cleared = 0; if (new_preempt[0] == '-') { bit_clear(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else if (new_preempt[0] == '+') { bit_set(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else { if (!cleared) { cleared = 1; bit_nclear( qos_rec->preempt_bitstr, 0, g_qos_count-1); } bit_set(qos_rec->preempt_bitstr, atol(new_preempt)); } } list_iterator_destroy(new_preempt_itr); } qos_rec->usage_factor = qos->usage_factor; qos_rec->usage_thres = qos->usage_thres; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_QOS, qos_rec) != SLURM_SUCCESS) slurmdb_destroy_qos_rec(qos_rec); } mysql_free_result(result); FREE_NULL_BITMAP(preempt_bitstr); if (row) { xfree(vals); xfree(name_char); xfree(query); list_destroy(ret_list); ret_list = NULL; errno = ESLURM_QOS_PREEMPTION_LOOP; return ret_list; } if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; debug3("didn't effect anything\n%s", query); xfree(vals); xfree(query); return ret_list; } xfree(query); xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_QOS, now, user_name, qos_table, name_char, vals, NULL); xfree(user_name); xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify qos"); list_destroy(ret_list); ret_list = NULL; } return ret_list; }
extern int as_mysql_add_qos(mysql_conn_t *mysql_conn, uint32_t uid, List qos_list) { ListIterator itr = NULL; int rc = SLURM_SUCCESS; slurmdb_qos_rec_t *object = NULL; char *cols = NULL, *extra = NULL, *vals = NULL, *query = NULL, *tmp_extra = NULL; time_t now = time(NULL); char *user_name = NULL; int affect_rows = 0; int added = 0; char *added_preempt = NULL; if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; user_name = uid_to_string((uid_t) uid); itr = list_iterator_create(qos_list); while ((object = list_next(itr))) { if (!object->name || !object->name[0]) { error("We need a qos name to add."); rc = SLURM_ERROR; continue; } xstrcat(cols, "creation_time, mod_time, name"); xstrfmtcat(vals, "%ld, %ld, '%s'", now, now, object->name); xstrfmtcat(extra, ", mod_time=%ld", now); _setup_qos_limits(object, &cols, &vals, &extra, &added_preempt, 1); if (added_preempt) { object->preempt_bitstr = bit_alloc(g_qos_count); bit_unfmt(object->preempt_bitstr, added_preempt+1); xfree(added_preempt); } xstrfmtcat(query, "insert into %s (%s) values (%s) " "on duplicate key update deleted=0, " "id=LAST_INSERT_ID(id)%s;", qos_table, cols, vals, extra); debug3("%d(%s:%d) query\n%s", mysql_conn->conn, THIS_FILE, __LINE__, query); object->id = mysql_db_insert_ret_id(mysql_conn, query); xfree(query); if (!object->id) { error("Couldn't add qos %s", object->name); added=0; xfree(cols); xfree(extra); xfree(vals); break; } affect_rows = last_affected_rows(mysql_conn); if (!affect_rows) { debug2("nothing changed %d", affect_rows); xfree(cols); xfree(extra); xfree(vals); continue; } /* we always have a ', ' as the first 2 chars */ tmp_extra = slurm_add_slash_to_quotes(extra+2); xstrfmtcat(query, "insert into %s " "(timestamp, action, name, actor, info) " "values (%ld, %u, '%s', '%s', '%s');", txn_table, now, DBD_ADD_QOS, object->name, user_name, tmp_extra); xfree(tmp_extra); xfree(cols); xfree(extra); xfree(vals); debug4("query\n%s",query); rc = mysql_db_query(mysql_conn, query); xfree(query); if (rc != SLURM_SUCCESS) { error("Couldn't add txn"); } else { if (addto_update_list(mysql_conn->update_list, SLURMDB_ADD_QOS, object) == SLURM_SUCCESS) list_remove(itr); added++; } } list_iterator_destroy(itr); xfree(user_name); if (!added) { reset_mysql_conn(mysql_conn); } return rc; }
/* * parse_command_line, fill in params data structure with data */ extern void parse_command_line(int argc, char *argv[]) { int opt_char; int option_index; int tmp = 0; static struct option long_options[] = { {"commandline", no_argument, 0, 'c'}, {"display", required_argument, 0, 'D'}, {"noheader", no_argument, 0, 'h'}, {"iterate", required_argument, 0, 'i'}, {"ionodes", required_argument, 0, 'I'}, {"cluster", required_argument, 0, 'M'}, {"clusters",required_argument, 0, 'M'}, {"nodes", required_argument, 0, 'n'}, {"quiet", no_argument, 0, 'Q'}, {"resolve", required_argument, 0, 'R'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, OPT_LONG_HELP}, {"usage", no_argument, 0, OPT_LONG_USAGE}, {"show_hidden", no_argument, 0, 'H'}, {NULL, 0, 0, 0} }; memset(¶ms, 0, sizeof(params)); while ((opt_char = getopt_long(argc, argv, "cD:hi:I:Hn:M:QR:vV", long_options, &option_index)) != -1) { switch (opt_char) { case '?': fprintf(stderr, "Try \"smap --help\" for more information\n"); exit(1); break; case 'c': params.commandline = TRUE; break; case 'D': if (!strcmp(optarg, "j")) tmp = JOBS; else if (!strcmp(optarg, "s")) tmp = SLURMPART; else if (!strcmp(optarg, "b")) tmp = BGPART; else if (!strcmp(optarg, "c")) tmp = COMMANDS; else if (!strcmp(optarg, "r")) tmp = RESERVATIONS; params.display = tmp; break; case 'h': params.no_header = true; break; case 'H': params.all_flag = true; break; case 'i': params.iterate = atoi(optarg); if (params.iterate <= 0) { error("Error: --iterate=%s", optarg); exit(1); } break; case 'I': /* * confirm valid ionodelist entry (The 128 is * a large number here to avoid having to do a * lot more querying to figure out the correct * pset size. This number should be large enough. */ params.io_bit = bit_alloc(128); if(bit_unfmt(params.io_bit, optarg) == -1) { error("'%s' invalid entry for --ionodes", optarg); exit(1); } break; case 'M': if(params.clusters) list_destroy(params.clusters); if(!(params.clusters = slurmdb_get_info_cluster(optarg))) { error("'%s' invalid entry for --cluster", optarg); exit(1); } working_cluster_rec = list_peek(params.clusters); break; case 'n': /* * confirm valid nodelist entry */ params.hl = hostlist_create(optarg); if (!params.hl) { error("'%s' invalid entry for --nodes", optarg); exit(1); } break; case 'Q': quiet_flag = 1; break; case 'R': params.commandline = TRUE; params.resolve = xstrdup(optarg); break; case 'v': params.verbose++; break; case 'V': print_slurm_version(); exit(0); case OPT_LONG_HELP: _help(); exit(0); case OPT_LONG_USAGE: _usage(); exit(0); } } params.cluster_dims = slurmdb_setup_cluster_dims(); if (params.cluster_dims > 4) fatal("smap is unable to support more than four dimensions"); params.cluster_base = hostlist_get_base(params.cluster_dims); params.cluster_flags = slurmdb_setup_cluster_flags(); }
extern List as_mysql_modify_qos(mysql_conn_t *mysql_conn, uint32_t uid, slurmdb_qos_cond_t *qos_cond, slurmdb_qos_rec_t *qos) { ListIterator itr = NULL; List ret_list = NULL; int rc = SLURM_SUCCESS; char *object = NULL; char *vals = NULL, *extra = NULL, *query = NULL, *name_char = NULL; time_t now = time(NULL); char *user_name = NULL; int set = 0, i; MYSQL_RES *result = NULL; MYSQL_ROW row; char *tmp_char1=NULL, *tmp_char2=NULL; bitstr_t *preempt_bitstr = NULL; char *added_preempt = NULL; uint32_t qos_cnt; assoc_mgr_lock_t locks = { NO_LOCK, NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK, NO_LOCK, NO_LOCK }; if (!qos_cond || !qos) { error("we need something to change"); return NULL; } if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!is_user_min_admin_level(mysql_conn, uid, SLURMDB_ADMIN_SUPER_USER)) { errno = ESLURM_ACCESS_DENIED; return NULL; } xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } _setup_qos_limits(qos, &tmp_char1, &tmp_char2, &vals, &added_preempt, 0); assoc_mgr_lock(&locks); qos_cnt = g_qos_count; assoc_mgr_unlock(&locks); if (added_preempt) { preempt_bitstr = bit_alloc(qos_cnt); bit_unfmt(preempt_bitstr, added_preempt+1); xfree(added_preempt); } xfree(tmp_char1); xfree(tmp_char2); if (!extra || !vals) { errno = SLURM_NO_CHANGE_IN_DATA; FREE_NULL_BITMAP(preempt_bitstr); error("Nothing to change"); return NULL; } object = xstrdup(mqos_req_inx[0]); for (i = 1; i < MQOS_COUNT; i++) xstrfmtcat(object, ", %s", mqos_req_inx[i]); query = xstrdup_printf("select %s from %s %s;", object, qos_table, extra); xfree(extra); xfree(object); if (!(result = mysql_db_query_ret(mysql_conn, query, 0))) { xfree(query); FREE_NULL_BITMAP(preempt_bitstr); return NULL; } rc = 0; ret_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos_rec = NULL; uint32_t id = slurm_atoul(row[MQOS_ID]); if (preempt_bitstr) { if (_preemption_loop(mysql_conn, id, preempt_bitstr)) break; } object = xstrdup(row[MQOS_NAME]); list_append(ret_list, object); if (!rc) { xstrfmtcat(name_char, "(name='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); } qos_rec = xmalloc(sizeof(slurmdb_qos_rec_t)); qos_rec->name = xstrdup(object); qos_rec->id = id; qos_rec->flags = qos->flags; qos_rec->grace_time = qos->grace_time; mod_tres_str(&qos_rec->grp_tres, qos->grp_tres, row[MQOS_GT], NULL, "grp_tres", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->grp_tres_mins, qos->grp_tres_mins, row[MQOS_GTM], NULL, "grp_tres_mins", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->grp_tres_run_mins, qos->grp_tres_run_mins, row[MQOS_GTRM], NULL, "grp_tres_run_mins", &vals, qos_rec->id, 0); qos_rec->grp_jobs = qos->grp_jobs; qos_rec->grp_submit_jobs = qos->grp_submit_jobs; qos_rec->grp_wall = qos->grp_wall; mod_tres_str(&qos_rec->max_tres_pa, qos->max_tres_pa, row[MQOS_MTPA], NULL, "max_tres_pa", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pj, qos->max_tres_pj, row[MQOS_MTPJ], NULL, "max_tres_pj", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pn, qos->max_tres_pn, row[MQOS_MTPN], NULL, "max_tres_pn", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_pu, qos->max_tres_pu, row[MQOS_MTPU], NULL, "max_tres_pu", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_mins_pj, qos->max_tres_mins_pj, row[MQOS_MTMPJ], NULL, "max_tres_mins_pj", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_run_mins_pa, qos->max_tres_run_mins_pa, row[MQOS_MTRM], NULL, "max_tres_run_mins_pa", &vals, qos_rec->id, 0); mod_tres_str(&qos_rec->max_tres_run_mins_pu, qos->max_tres_run_mins_pu, row[MQOS_MTRM], NULL, "max_tres_run_mins_pu", &vals, qos_rec->id, 0); qos_rec->max_jobs_pa = qos->max_jobs_pa; qos_rec->max_jobs_pu = qos->max_jobs_pu; qos_rec->max_submit_jobs_pa = qos->max_submit_jobs_pa; qos_rec->max_submit_jobs_pu = qos->max_submit_jobs_pu; qos_rec->max_wall_pj = qos->max_wall_pj; mod_tres_str(&qos_rec->min_tres_pj, qos->min_tres_pj, row[MQOS_MITPJ], NULL, "min_tres_pj", &vals, qos_rec->id, 0); qos_rec->preempt_mode = qos->preempt_mode; qos_rec->priority = qos->priority; if (qos->preempt_list) { ListIterator new_preempt_itr = list_iterator_create(qos->preempt_list); char *new_preempt = NULL; bool cleared = 0; qos_rec->preempt_bitstr = bit_alloc(qos_cnt); if (row[MQOS_PREEMPT] && row[MQOS_PREEMPT][0]) bit_unfmt(qos_rec->preempt_bitstr, row[MQOS_PREEMPT]+1); while ((new_preempt = list_next(new_preempt_itr))) { if (new_preempt[0] == '-') { bit_clear(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else if (new_preempt[0] == '+') { bit_set(qos_rec->preempt_bitstr, atol(new_preempt+1)); } else { if (!cleared) { cleared = 1; bit_nclear( qos_rec->preempt_bitstr, 0, qos_cnt-1); } bit_set(qos_rec->preempt_bitstr, atol(new_preempt)); } } list_iterator_destroy(new_preempt_itr); } qos_rec->usage_factor = qos->usage_factor; qos_rec->usage_thres = qos->usage_thres; if (addto_update_list(mysql_conn->update_list, SLURMDB_MODIFY_QOS, qos_rec) != SLURM_SUCCESS) slurmdb_destroy_qos_rec(qos_rec); } mysql_free_result(result); FREE_NULL_BITMAP(preempt_bitstr); if (row) { xfree(vals); xfree(name_char); xfree(query); FREE_NULL_LIST(ret_list); ret_list = NULL; errno = ESLURM_QOS_PREEMPTION_LOOP; return ret_list; } if (!list_count(ret_list)) { errno = SLURM_NO_CHANGE_IN_DATA; if (debug_flags & DEBUG_FLAG_DB_QOS) DB_DEBUG(mysql_conn->conn, "didn't effect anything\n%s", query); xfree(vals); xfree(query); return ret_list; } xfree(query); xstrcat(name_char, ")"); user_name = uid_to_string((uid_t) uid); rc = modify_common(mysql_conn, DBD_MODIFY_QOS, now, user_name, qos_table, name_char, vals, NULL); xfree(user_name); xfree(name_char); xfree(vals); if (rc == SLURM_ERROR) { error("Couldn't modify qos"); FREE_NULL_LIST(ret_list); ret_list = NULL; } return ret_list; }
extern List as_mysql_get_qos(mysql_conn_t *mysql_conn, uid_t uid, slurmdb_qos_cond_t *qos_cond) { char *query = NULL; char *extra = NULL; char *tmp = NULL; List qos_list = NULL; ListIterator itr = NULL; char *object = NULL; int set = 0; int i=0; MYSQL_RES *result = NULL; MYSQL_ROW row; uint32_t qos_cnt; assoc_mgr_lock_t locks = { NO_LOCK, NO_LOCK, READ_LOCK, NO_LOCK, NO_LOCK, NO_LOCK, NO_LOCK }; /* if this changes you will need to edit the corresponding enum */ char *qos_req_inx[] = { "name", "description", "id", "flags", "grace_time", "grp_tres_mins", "grp_tres_run_mins", "grp_tres", "grp_jobs", "grp_submit_jobs", "grp_wall", "max_tres_mins_pj", "max_tres_run_mins_pa", "max_tres_run_mins_pu", "max_tres_pa", "max_tres_pj", "max_tres_pn", "max_tres_pu", "max_jobs_pa", "max_jobs_per_user", "max_submit_jobs_pa", "max_submit_jobs_per_user", "max_wall_duration_per_job", "substr(preempt, 1, length(preempt) - 1)", "preempt_mode", "priority", "usage_factor", "usage_thres", "min_tres_pj", }; enum { QOS_REQ_NAME, QOS_REQ_DESC, QOS_REQ_ID, QOS_REQ_FLAGS, QOS_REQ_GRACE, QOS_REQ_GTM, QOS_REQ_GTRM, QOS_REQ_GT, QOS_REQ_GJ, QOS_REQ_GSJ, QOS_REQ_GW, QOS_REQ_MTMPJ, QOS_REQ_MTRMA, QOS_REQ_MTRM, QOS_REQ_MTPA, QOS_REQ_MTPJ, QOS_REQ_MTPN, QOS_REQ_MTPU, QOS_REQ_MJPA, QOS_REQ_MJPU, QOS_REQ_MSJPA, QOS_REQ_MSJPU, QOS_REQ_MWPJ, QOS_REQ_PREE, QOS_REQ_PREEM, QOS_REQ_PRIO, QOS_REQ_UF, QOS_REQ_UT, QOS_REQ_MITPJ, QOS_REQ_COUNT }; if (check_connection(mysql_conn) != SLURM_SUCCESS) return NULL; if (!qos_cond) { xstrcat(extra, "where deleted=0"); goto empty; } if (qos_cond->with_deleted) xstrcat(extra, "where (deleted=0 || deleted=1)"); else xstrcat(extra, "where deleted=0"); if (qos_cond->description_list && list_count(qos_cond->description_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->description_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "description='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->id_list && list_count(qos_cond->id_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->id_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "id='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } if (qos_cond->name_list && list_count(qos_cond->name_list)) { set = 0; xstrcat(extra, " && ("); itr = list_iterator_create(qos_cond->name_list); while ((object = list_next(itr))) { if (set) xstrcat(extra, " || "); xstrfmtcat(extra, "name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(extra, ")"); } empty: xfree(tmp); xstrfmtcat(tmp, "%s", qos_req_inx[i]); for(i=1; i<QOS_REQ_COUNT; i++) { xstrfmtcat(tmp, ", %s", qos_req_inx[i]); } query = xstrdup_printf("select %s from %s %s", tmp, qos_table, extra); xfree(tmp); xfree(extra); if (debug_flags & DEBUG_FLAG_DB_QOS) DB_DEBUG(mysql_conn->conn, "query\n%s", query); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); return NULL; } xfree(query); qos_list = list_create(slurmdb_destroy_qos_rec); assoc_mgr_lock(&locks); qos_cnt = g_qos_count; assoc_mgr_unlock(&locks); while ((row = mysql_fetch_row(result))) { slurmdb_qos_rec_t *qos = xmalloc(sizeof(slurmdb_qos_rec_t)); list_append(qos_list, qos); if (row[QOS_REQ_DESC] && row[QOS_REQ_DESC][0]) qos->description = xstrdup(row[QOS_REQ_DESC]); qos->id = slurm_atoul(row[QOS_REQ_ID]); qos->flags = slurm_atoul(row[QOS_REQ_FLAGS]); if (row[QOS_REQ_NAME] && row[QOS_REQ_NAME][0]) qos->name = xstrdup(row[QOS_REQ_NAME]); if (row[QOS_REQ_GRACE]) qos->grace_time = slurm_atoul(row[QOS_REQ_GRACE]); if (row[QOS_REQ_GT][0]) qos->grp_tres = xstrdup(row[QOS_REQ_GT]); if (row[QOS_REQ_GTM][0]) qos->grp_tres_mins = xstrdup(row[QOS_REQ_GTM]); if (row[QOS_REQ_GTRM][0]) qos->grp_tres_run_mins = xstrdup(row[QOS_REQ_GTRM]); if (row[QOS_REQ_GJ]) qos->grp_jobs = slurm_atoul(row[QOS_REQ_GJ]); else qos->grp_jobs = INFINITE; if (row[QOS_REQ_GSJ]) qos->grp_submit_jobs = slurm_atoul(row[QOS_REQ_GSJ]); else qos->grp_submit_jobs = INFINITE; if (row[QOS_REQ_GW]) qos->grp_wall = slurm_atoul(row[QOS_REQ_GW]); else qos->grp_wall = INFINITE; if (row[QOS_REQ_MJPA]) qos->max_jobs_pa = slurm_atoul(row[QOS_REQ_MJPA]); else qos->max_jobs_pa = INFINITE; if (row[QOS_REQ_MJPU]) qos->max_jobs_pu = slurm_atoul(row[QOS_REQ_MJPU]); else qos->max_jobs_pu = INFINITE; if (row[QOS_REQ_MSJPA]) qos->max_submit_jobs_pa = slurm_atoul(row[QOS_REQ_MSJPA]); else qos->max_submit_jobs_pa = INFINITE; if (row[QOS_REQ_MSJPU]) qos->max_submit_jobs_pu = slurm_atoul(row[QOS_REQ_MSJPU]); else qos->max_submit_jobs_pu = INFINITE; if (row[QOS_REQ_MTPA][0]) qos->max_tres_pa = xstrdup(row[QOS_REQ_MTPA]); if (row[QOS_REQ_MTPJ][0]) qos->max_tres_pj = xstrdup(row[QOS_REQ_MTPJ]); if (row[QOS_REQ_MTPN][0]) qos->max_tres_pn = xstrdup(row[QOS_REQ_MTPN]); if (row[QOS_REQ_MTPU][0]) qos->max_tres_pu = xstrdup(row[QOS_REQ_MTPU]); if (row[QOS_REQ_MTMPJ][0]) qos->max_tres_mins_pj = xstrdup(row[QOS_REQ_MTMPJ]); if (row[QOS_REQ_MTRMA][0]) qos->max_tres_run_mins_pa = xstrdup(row[QOS_REQ_MTRMA]); if (row[QOS_REQ_MTRM][0]) qos->max_tres_run_mins_pu = xstrdup(row[QOS_REQ_MTRM]); if (row[QOS_REQ_MWPJ]) qos->max_wall_pj = slurm_atoul(row[QOS_REQ_MWPJ]); else qos->max_wall_pj = INFINITE; if (row[QOS_REQ_PREE] && row[QOS_REQ_PREE][0]) { if (!qos->preempt_bitstr) qos->preempt_bitstr = bit_alloc(qos_cnt); bit_unfmt(qos->preempt_bitstr, row[QOS_REQ_PREE]+1); } if (row[QOS_REQ_PREEM]) qos->preempt_mode = slurm_atoul(row[QOS_REQ_PREEM]); if (row[QOS_REQ_PRIO]) qos->priority = slurm_atoul(row[QOS_REQ_PRIO]); if (row[QOS_REQ_UF]) qos->usage_factor = atof(row[QOS_REQ_UF]); if (row[QOS_REQ_UT]) qos->usage_thres = atof(row[QOS_REQ_UT]); else qos->usage_thres = (double)INFINITE; if (row[QOS_REQ_MITPJ][0]) qos->min_tres_pj = xstrdup(row[QOS_REQ_MITPJ]); } mysql_free_result(result); return qos_list; }