/* Get the default QOS for an association (or NULL if not present) */ static char *_get_default_qos(uint32_t user_id, char *account, char *partition) { slurmdb_assoc_rec_t assoc; slurmdb_assoc_rec_t *assoc_ptr; slurmdb_qos_rec_t qos; uint32_t qos_id; memset(&assoc, 0, sizeof(slurmdb_assoc_rec_t)); assoc.uid = user_id; assoc.partition = partition; if (account) { assoc.acct = account; } else { assoc.acct = _get_default_account(user_id); } if (assoc_mgr_fill_in_assoc(acct_db_conn, &assoc, 0, &assoc_ptr, false) != SLURM_ERROR) { qos_id = assoc_ptr->def_qos_id; } else { return NULL; } if (!qos_id) { return NULL; } memset(&qos, 0, sizeof(slurmdb_qos_rec_t)); qos.id = qos_id; if (assoc_mgr_fill_in_qos(acct_db_conn, &qos, 0, NULL, false) != SLURM_ERROR) { return qos.name; } else { return NULL; } }
static int _preemption_loop(mysql_conn_t *mysql_conn, int begin_qosid, bitstr_t *preempt_bitstr) { slurmdb_qos_rec_t qos_rec; int rc = 0, i=0; xassert(preempt_bitstr); /* check in the preempt list for all qos's preempted */ for(i=0; i<bit_size(preempt_bitstr); i++) { if (!bit_test(preempt_bitstr, i)) continue; memset(&qos_rec, 0, sizeof(qos_rec)); qos_rec.id = i; assoc_mgr_fill_in_qos(mysql_conn, &qos_rec, ACCOUNTING_ENFORCE_QOS, NULL); /* check if the begin_qosid is preempted by this qos * if so we have a loop */ if (qos_rec.preempt_bitstr && bit_test(qos_rec.preempt_bitstr, begin_qosid)) { error("QOS id %d has a loop at QOS %s", begin_qosid, qos_rec.name); rc = 1; break; } else if (qos_rec.preempt_bitstr) { /* check this qos' preempt list and make sure no loops exist there either */ if ((rc = _preemption_loop(mysql_conn, begin_qosid, qos_rec.preempt_bitstr))) break; } } return rc; }