From 4cc758f881ccc85ae744b61c14b38cd228aa6e83 Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Mon, 26 Jan 2009 16:32:02 +0000 Subject: [PATCH] add logic to set a reservation's cpu count fix logic for checking if reservations overlap (avoid comparison with self) --- src/slurmctld/reservation.c | 40 ++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/src/slurmctld/reservation.c b/src/slurmctld/reservation.c index 3874638466a..f0a97ff3bc1 100644 --- a/src/slurmctld/reservation.c +++ b/src/slurmctld/reservation.c @@ -116,8 +116,10 @@ static bool _is_resv_used(slurmctld_resv_t *resv_ptr); static void _pack_resv(struct slurmctld_resv *resv_ptr, Buf buffer, bool internal); static bool _resv_overlap(time_t start_time, time_t end_time, - bitstr_t *node_bitmap); + bitstr_t *node_bitmap, + struct slurmctld_resv *this_resv_ptr); static void _set_assoc_list(struct slurmctld_resv *resv_ptr); +static void _set_cpu_cnt(struct slurmctld_resv *resv_ptr); static void _set_resv_id(struct slurmctld_resv *resv_ptr); static int _update_account_list(struct slurmctld_resv *resv_ptr, char *accounts); @@ -669,7 +671,8 @@ static void _pack_resv(struct slurmctld_resv *resv_ptr, Buf buffer, * RET true if overlap */ static bool _resv_overlap(time_t start_time, time_t end_time, - bitstr_t *node_bitmap) + bitstr_t *node_bitmap, + struct slurmctld_resv *this_resv_ptr) { ListIterator iter; slurmctld_resv_t *resv_ptr; @@ -681,7 +684,9 @@ static bool _resv_overlap(time_t start_time, time_t end_time, iter = list_iterator_create(resv_list); if (!iter) fatal("malloc: list_iterator_create"); - while ((resv_ptr = (slurmctld_resv_t *) list_next(iter))) { + while ((resv_ptr = (slurmctld_resv_t *) list_next(iter))) {\ + if (resv_ptr == this_resv_ptr) + continue; /* skip self */ if ((resv_ptr->end_time <= start_time) || (resv_ptr->start_time >= end_time) || (resv_ptr->node_bitmap == NULL) || @@ -696,6 +701,28 @@ static bool _resv_overlap(time_t start_time, time_t end_time, return rc; } +/* Set a reservation's CPU count. Requires that the reservation's + * node_bitmap be set. */ +static void _set_cpu_cnt(struct slurmctld_resv *resv_ptr) +{ + int i; + uint32_t cpu_cnt = 0; + struct node_record *node_ptr = node_record_table_ptr; + + if (!resv_ptr->node_bitmap) + return; + + for (i=0; i<node_record_count; i++, node_ptr++) { + if (!bit_test(resv_ptr->node_bitmap, i)) + continue; + if (slurmctld_conf.fast_schedule) + cpu_cnt += node_ptr->config_ptr->cpus; + else + cpu_cnt += node_ptr->cpus; + } + resv_ptr->cpu_cnt = cpu_cnt; +} + /* Create a resource reservation */ extern int create_resv(reserve_request_msg_t *resv_desc_ptr) { @@ -798,7 +825,8 @@ extern int create_resv(reserve_request_msg_t *resv_desc_ptr) if (resv_desc_ptr->node_cnt == NO_VAL) resv_desc_ptr->node_cnt = 0; if (_resv_overlap(resv_desc_ptr->start_time, - resv_desc_ptr->end_time, node_bitmap)) { + resv_desc_ptr->end_time, node_bitmap, + NULL)) { info("Reservation requestion overlaps another"); rc = ESLURM_INVALID_TIME_VALUE; goto bad_parse; @@ -834,6 +862,7 @@ extern int create_resv(reserve_request_msg_t *resv_desc_ptr) resv_ptr->user_list = user_list; resv_desc_ptr->users = NULL; /* Nothing left to free */ _set_resv_id(resv_ptr); + _set_cpu_cnt(resv_ptr); _set_assoc_list(resv_ptr); info("Created reservation %s for accounts=%s users=%s", @@ -965,7 +994,7 @@ extern int update_resv(reserve_request_msg_t *resv_desc_ptr) resv_ptr->node_bitmap = node_bitmap; } if (_resv_overlap(resv_ptr->start_time, resv_ptr->end_time, - resv_ptr->node_bitmap)) { + resv_ptr->node_bitmap, resv_ptr)) { info("Reservation requestion overlaps another"); error_code = ESLURM_INVALID_TIME_VALUE; /* Restore state with respect to time and nodes */ @@ -978,6 +1007,7 @@ extern int update_resv(reserve_request_msg_t *resv_desc_ptr) resv_ptr->node_bitmap = old_node_bitmap; } } else if (old_node_list) { + _set_cpu_cnt(resv_ptr); /* Free temporarily saved state */ xfree(old_node_list); FREE_NULL_BITMAP(old_node_bitmap); -- GitLab