extern int setup_job_cluster_cond_limits(mysql_conn_t *mysql_conn, slurmdb_job_cond_t *job_cond, char *cluster_name, char **extra) { int set = 0; ListIterator itr = NULL; char *object = NULL; if (!job_cond) return SLURM_SUCCESS; /* this must be done before resvid_list since we set resvid_list up here */ if (job_cond->resv_list && list_count(job_cond->resv_list)) { char *query = xstrdup_printf( "select distinct job_db_inx from \"%s_%s\" where (", cluster_name, job_table); int my_set = 0; MYSQL_RES *result = NULL; MYSQL_ROW row; itr = list_iterator_create(job_cond->resv_list); while ((object = list_next(itr))) { if (my_set) xstrcat(query, " || "); xstrfmtcat(query, "resv_name='%s'", object); my_set = 1; } list_iterator_destroy(itr); xstrcat(query, ")"); if (!(result = mysql_db_query_ret( mysql_conn, query, 0))) { xfree(query); error("couldn't query the database"); goto no_resv; } xfree(query); if (!job_cond->resvid_list) job_cond->resvid_list = list_create(slurm_destroy_char); while ((row = mysql_fetch_row(result))) { list_append(job_cond->resvid_list, xstrdup(row[0])); } mysql_free_result(result); } no_resv: if (job_cond->resvid_list && list_count(job_cond->resvid_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->resvid_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_resv='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->state_list && list_count(job_cond->state_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->state_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); _state_time_string(extra, cluster_name, (uint32_t)slurm_atoul(object), job_cond->usage_start, job_cond->usage_end); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } return SLURM_SUCCESS; }
extern int setup_job_cond_limits(mysql_conn_t *mysql_conn, slurmdb_job_cond_t *job_cond, char **extra) { int set = 0; ListIterator itr = NULL; char *object = NULL; slurmdb_selected_step_t *selected_step = NULL; if (!job_cond) return 0; if (job_cond->acct_list && list_count(job_cond->acct_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->acct_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.account='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->associd_list && list_count(job_cond->associd_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->associd_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_assoc='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->userid_list && list_count(job_cond->userid_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->userid_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_user='******'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->groupid_list && list_count(job_cond->groupid_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->groupid_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_group='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->jobname_list && list_count(job_cond->jobname_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->jobname_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.job_name='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->partition_list && list_count(job_cond->partition_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->partition_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.partition='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->qos_list && list_count(job_cond->qos_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->qos_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_qos='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->step_list && list_count(job_cond->step_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->step_list); while ((selected_step = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.id_job=%u", selected_step->jobid); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } if (job_cond->cpus_min) { if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); if (job_cond->cpus_max) { xstrfmtcat(*extra, "(t1.cpus_alloc between %u and %u))", job_cond->cpus_min, job_cond->cpus_max); } else { xstrfmtcat(*extra, "(t1.cpus_alloc='%u'))", job_cond->cpus_min); } } if (job_cond->nodes_min) { if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); if (job_cond->nodes_max) { xstrfmtcat(*extra, "(t1.nodes_alloc between %u and %u))", job_cond->nodes_min, job_cond->nodes_max); } else { xstrfmtcat(*extra, "(t1.nodes_alloc='%u'))", job_cond->nodes_min); } } if (job_cond->timelimit_min) { if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); if (job_cond->timelimit_max) { xstrfmtcat(*extra, "(t1.timelimit between %u and %u))", job_cond->timelimit_min, job_cond->timelimit_max); } else { xstrfmtcat(*extra, "(t1.timelimit='%u'))", job_cond->timelimit_min); } } if (job_cond->state_list && list_count(job_cond->state_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->state_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); _state_time_string(extra, (uint32_t)slurm_atoul(object), job_cond->usage_start, job_cond->usage_end); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } else { /* Only do this (default of all eligible jobs) if no state is given */ if (job_cond->usage_start) { if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); if (!job_cond->usage_end) xstrfmtcat(*extra, "(t1.time_end >= %ld " "|| t1.time_end = 0))", job_cond->usage_start); else xstrfmtcat(*extra, "(t1.time_eligible < %ld " "&& (t1.time_end >= %ld " "|| t1.time_end = 0)))", job_cond->usage_end, job_cond->usage_start); } else if (job_cond->usage_end) { if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); xstrfmtcat(*extra, "(t1.time_eligible < %ld))", job_cond->usage_end); } } if (job_cond->wckey_list && list_count(job_cond->wckey_list)) { set = 0; if (*extra) xstrcat(*extra, " && ("); else xstrcat(*extra, " where ("); itr = list_iterator_create(job_cond->wckey_list); while ((object = list_next(itr))) { if (set) xstrcat(*extra, " || "); xstrfmtcat(*extra, "t1.wckey='%s'", object); set = 1; } list_iterator_destroy(itr); xstrcat(*extra, ")"); } return set; }