diff --git a/src/common/slurmdb_pack.c b/src/common/slurmdb_pack.c index e8ca9e481792fcc4912da10aace2d14ddb26ee60..969775a5ef282dd38df610213f1ea89e20a9bcd6 100644 --- a/src/common/slurmdb_pack.c +++ b/src/common/slurmdb_pack.c @@ -4303,6 +4303,7 @@ extern void slurmdb_pack_res_cond(void *in, uint16_t rpc_version, Buf buffer) } list_iterator_destroy(itr); } + count = NO_VAL; if (object->type_list) count = list_count(object->type_list); @@ -4316,6 +4317,7 @@ extern void slurmdb_pack_res_cond(void *in, uint16_t rpc_version, Buf buffer) } list_iterator_destroy(itr); } + count = NO_VAL; pack16(object->with_deleted, buffer); pack16(object->with_clusters, buffer); diff --git a/src/plugins/accounting_storage/mysql/as_mysql_resource.c b/src/plugins/accounting_storage/mysql/as_mysql_resource.c index 1fc560c1ec1d90af42770156a42eb99d7bf09120..b6d80178d34a2543b7408cc4e53b8329b3b96f8a 100644 --- a/src/plugins/accounting_storage/mysql/as_mysql_resource.c +++ b/src/plugins/accounting_storage/mysql/as_mysql_resource.c @@ -50,23 +50,20 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, ListIterator itr = NULL; char *object = NULL; - /* Since we are always doing an outer join here t1.deleted needs - to be handled on join instead of the where. - */ if (!res_cond) { -// xstrcat(*extra, "where t1.deleted=0"); + xstrcat(*extra, "where t1.deleted=0"); return; } - /* if (res_cond->with_deleted) */ - /* xstrcat(*extra, "where (t1.deleted=0 || t1.deleted=1)"); */ - /* else */ - /* xstrcat(*extra, "where t1.deleted=0"); */ + if (res_cond->with_deleted) + xstrcat(*extra, "where (t1.deleted=0 || t1.deleted=1)"); + else + xstrcat(*extra, "where t1.deleted=0"); if (res_cond->description_list && list_count(res_cond->description_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->description_list); while ((object = list_next(itr))) { if (set) @@ -79,15 +76,14 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, } if (!(res_cond->flags & SLURMDB_RES_FLAG_NOTSET)) { - xstrfmtcat(*extra, "%s (flags & %u)", - *extra ? " &&" : "where", + xstrfmtcat(*extra, " && (flags & %u)", res_cond->flags & SLURMDB_RES_FLAG_BASE); } if (res_cond->id_list && list_count(res_cond->id_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->id_list); while ((object = list_next(itr))) { if (set) @@ -102,7 +98,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, if (res_cond->manager_list && list_count(res_cond->manager_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->manager_list); while ((object = list_next(itr))) { if (set) @@ -117,7 +113,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, if (res_cond->name_list && list_count(res_cond->name_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->name_list); while ((object = list_next(itr))) { if (set) @@ -132,7 +128,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, if (res_cond->server_list && list_count(res_cond->server_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->server_list); while ((object = list_next(itr))) { if (set) @@ -147,7 +143,7 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, if (res_cond->type_list && list_count(res_cond->type_list)) { set = 0; - xstrfmtcat(*extra, "%s (", *extra ? " &&" : "where"); + xstrcat(*extra, " && ("); itr = list_iterator_create(res_cond->type_list); while ((object = list_next(itr))) { if (set) @@ -158,9 +154,6 @@ static void _setup_res_cond(slurmdb_res_cond_t *res_cond, list_iterator_destroy(itr); xstrcat(*extra, ")"); } - - if (!*extra) - *extra = xstrdup(""); } static int _setup_clus_res_cond(slurmdb_res_cond_t *res_cond, char **extra) @@ -375,7 +368,7 @@ static int _fill_in_res_rec(mysql_conn_t *mysql_conn, slurmdb_res_rec_t *res) query = xstrdup_printf("select distinct %s from %s as t1 " "left outer join " "%s as t2 on (res_id=id && " - "t1.deleted=0 && t2.deleted=0) " + "t2.deleted=0) " "where id=%u group by id", tmp, res_table, clus_res_table, res->id); @@ -786,7 +779,7 @@ extern List as_mysql_get_res(mysql_conn_t *mysql_conn, uid_t uid, "id", tmp, res_table, clus_res_table, (!res_cond || !res_cond->with_deleted) ? - " && t1.deleted=0 && t2.deleted=0" : "", + " && t2.deleted=0" : "", extra); xfree(tmp); xfree(extra); @@ -875,7 +868,7 @@ extern List as_mysql_remove_res(mysql_conn_t *mysql_conn, uint32_t uid, "%s as t2 on (res_id = id%s) %s && %s;", res_table, clus_res_table, (!res_cond || !res_cond->with_deleted) ? - " && t1.deleted && t2.deleted=0" : "", + " && t2.deleted=0" : "", extra, clus_extra); xfree(clus_extra); @@ -1043,13 +1036,14 @@ extern List as_mysql_modify_res(mysql_conn_t *mysql_conn, uint32_t uid, res_cond->with_deleted = 0; _setup_res_cond(res_cond, &extra); query_clusters += _setup_clus_res_cond(res_cond, &clus_extra); + if (query_clusters || send_update) query = xstrdup_printf("select id, name, server, cluster " "from %s as t1 left outer join " "%s as t2 on (res_id = id%s) %s && %s;", res_table, clus_res_table, (!res_cond || !res_cond->with_deleted) ? - " && t1.deleted=0 && t2.deleted=0" : "", + " && t2.deleted=0" : "", extra, clus_extra); else query = xstrdup_printf("select id, name, server " diff --git a/src/sacctmgr/resource_functions.c b/src/sacctmgr/resource_functions.c index 24e3542feb20a0652075bc3e8bb10a7fffef093b..1b639f9bbe028d9c66382398f1bdd40c9c7c00c7 100644 --- a/src/sacctmgr/resource_functions.c +++ b/src/sacctmgr/resource_functions.c @@ -234,8 +234,17 @@ static int _set_res_cond(int *start, int argc, char *argv[], } } list_iterator_destroy(itr); + } else if (!strncasecmp(argv[i], "PercentAllowed", + MAX(command_len, 1))) { + if (!res_cond->percent_list) { + res_cond->percent_list = + list_create(slurm_destroy_char); + } + if (slurm_addto_char_list(res_cond->percent_list, + argv[i]+end)) + set = 1; } else if (!strncasecmp(argv[i], "ServerType", - MAX(command_len, 2))) { + MAX(command_len, 7))) { if (!res_cond->manager_list) { res_cond->manager_list = list_create(slurm_destroy_char); @@ -588,6 +597,7 @@ extern int sacctmgr_add_res(int argc, char *argv[]) res->count = start_res->count; res->flags = start_res->flags; res->type = start_res->type; + res->percent_used = 0; xstrfmtcat(res_str, " %s@%s\n", res->name, res->server); @@ -607,6 +617,7 @@ extern int sacctmgr_add_res(int argc, char *argv[]) slurmdb_init_res_rec(res, 0); res->id = found_res->id; res->type = found_res->type; + res->server = xstrdup(found_res->server); start_used = res->percent_used = found_res->percent_used; } @@ -887,6 +898,18 @@ extern int sacctmgr_modify_res(int argc, char *argv[]) } } + if (res->count != NO_VAL && res_cond->cluster_list && + list_count(res_cond->cluster_list)) { + fprintf(stderr, "Can't change \"count\" on a cluster-based " + "resource. Remove cluster selection.\n"); + return SLURM_ERROR; + } else if (res->percent_used != (uint16_t)NO_VAL && + !res_cond->cluster_list) { + fprintf(stderr, "Can't change \"percentallowed\" without " + "specifying a cluster.\n"); + return SLURM_ERROR; + } + notice_thread_init(); ret_list = acct_storage_g_modify_res(db_conn, my_uid, res_cond, res); notice_thread_fini();