diff --git a/NEWS b/NEWS index bc4083dd7705462a7271aac01103adfe4238fe3c..02840a0c709555b90d9767fd9404c3f129f45884 100644 --- a/NEWS +++ b/NEWS @@ -9,6 +9,7 @@ documents those changes that are of interest to users and admins. -- forward exit_code from step completion to slurmdbd -- Add retry logic to socket connect() call from client which can fail when the slurmctld is under heavy load. + -- Fixed bug when adding associations to add correctly * Changes in SLURM 1.3.3 ======================== diff --git a/src/common/assoc_mgr.c b/src/common/assoc_mgr.c index 97783e883de3faebd4a0f5be5a03440ab1c888c0..7476658175deedf1432223f2a8f6f97deb1066cd 100644 --- a/src/common/assoc_mgr.c +++ b/src/common/assoc_mgr.c @@ -50,6 +50,35 @@ static char *local_cluster_name = NULL; static pthread_mutex_t local_association_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_mutex_t local_user_lock = PTHREAD_MUTEX_INITIALIZER; +/* locks should be put in place before calling this function */ +static int _set_assoc_parent_and_user(acct_association_rec_t *assoc) +{ + if(!assoc) { + error("you didn't give me an association"); + return SLURM_ERROR; + } + + if(assoc->parent_id) { + acct_association_rec_t *assoc2 = NULL; + ListIterator itr = list_iterator_create(local_association_list); + while((assoc2 = list_next(itr))) { + if(assoc2->id == assoc->parent_id) { + assoc->parent_acct_ptr = assoc2; + break; + } + } + list_iterator_destroy(itr); + } + if(assoc->user) { + struct passwd *passwd_ptr = getpwnam(assoc->user); + if(passwd_ptr) + assoc->uid = passwd_ptr->pw_uid; + } + //log_assoc_rec(assoc); + + return SLURM_SUCCESS; +} + static int _get_local_association_list(void *db_conn, int enforce) { acct_association_cond_t assoc_q; @@ -97,31 +126,10 @@ static int _get_local_association_list(void *db_conn, int enforce) } } else { acct_association_rec_t *assoc = NULL; - acct_association_rec_t *assoc2 = NULL; - struct passwd *passwd_ptr = NULL; ListIterator itr = list_iterator_create(local_association_list); - ListIterator itr2 = - list_iterator_create(local_association_list); //START_TIMER; - while((assoc = list_next(itr))) { - if(assoc->parent_id) { - while((assoc2 = list_next(itr2))) { - if(assoc2->id == assoc->parent_id) { - assoc->parent_acct_ptr = assoc2; - break; - } - } - list_iterator_reset(itr2); - } - if(!assoc->user) { - continue; - } - passwd_ptr = getpwnam(assoc->user); - if(passwd_ptr) - assoc->uid = passwd_ptr->pw_uid; - //log_assoc_rec(assoc); - } - list_iterator_destroy(itr2); + while((assoc = list_next(itr))) + _set_assoc_parent_and_user(assoc); list_iterator_destroy(itr); //END_TIMER2("load_associations"); } @@ -536,6 +544,7 @@ extern int assoc_mgr_update_local_assocs(acct_update_object_t *update) //rc = SLURM_ERROR; break; } + _set_assoc_parent_and_user(object); list_append(local_association_list, object); case ACCT_REMOVE_ASSOC: if(!rec) { @@ -622,6 +631,7 @@ extern int assoc_mgr_update_local_users(acct_update_object_t *update) //rc = SLURM_ERROR; break; } + info("adding user %s here", object->name); list_append(local_user_list, object); case ACCT_REMOVE_USER: if(!rec) { diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c index ed0e3d916b9907c650fca3756c75f1ad71137b08..f055f4b9bb8233ec4c2454dbfd6e5bfcd39d9b0d 100644 --- a/src/sacctmgr/account_functions.c +++ b/src/sacctmgr/account_functions.c @@ -83,7 +83,7 @@ static int _set_cond(int *start, int argc, char *argv[], u_set = 1; } else if (strncasecmp (argv[i], "Parent", 1) == 0) { acct_cond->assoc_cond->parent_acct = - xstrdup(argv[i]+end); + strip_quotes(argv[i]+end, NULL); a_set = 1; } else if (strncasecmp (argv[i], "QosLevel", 1) == 0) { acct_cond->qos = str_2_acct_qos(argv[i]+end); @@ -122,7 +122,7 @@ static int _set_rec(int *start, int argc, char *argv[], printf(" Bad format on %s: End your option with " "an '=' sign\n", argv[i]); } else if (strncasecmp (argv[i], "Description", 1) == 0) { - acct->description = xstrdup(argv[i]+end); + acct->description = strip_quotes(argv[i]+end, NULL); u_set = 1; } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { if (get_uint(argv[i]+end, &assoc->fairshare, @@ -151,10 +151,10 @@ static int _set_rec(int *start, int argc, char *argv[], argv[i]); } } else if (strncasecmp (argv[i], "Organization", 1) == 0) { - acct->organization = xstrdup(argv[i]+end); + acct->organization = strip_quotes(argv[i]+end, NULL); u_set = 1; } else if (strncasecmp (argv[i], "Parent", 1) == 0) { - assoc->parent_acct = xstrdup(argv[i]+end); + assoc->parent_acct = strip_quotes(argv[i]+end, NULL); a_set = 1; } else if (strncasecmp (argv[i], "QosLevel=", 1) == 0) { acct->qos = str_2_acct_qos(argv[i]+end); @@ -275,7 +275,7 @@ extern int sacctmgr_add_account(int argc, char *argv[]) } else if (strncasecmp (argv[i], "Cluster", 1) == 0) { addto_char_list(cluster_list, argv[i]+end); } else if (strncasecmp (argv[i], "Description", 1) == 0) { - description = xstrdup(argv[i]+end); + description = strip_quotes(argv[i]+end, NULL); } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { if (get_uint(argv[i]+end, &fairshare, "FairShare") == SLURM_SUCCESS) @@ -304,9 +304,9 @@ extern int sacctmgr_add_account(int argc, char *argv[]) } else if (strncasecmp (argv[i], "Names", 1) == 0) { addto_char_list(name_list, argv[i]+end); } else if (strncasecmp (argv[i], "Organization", 1) == 0) { - organization = xstrdup(argv[i]+end); + organization = strip_quotes(argv[i]+end, NULL); } else if (strncasecmp (argv[i], "Parent", 1) == 0) { - parent = xstrdup(argv[i]+end); + parent = strip_quotes(argv[i]+end, NULL); } else if (strncasecmp (argv[i], "QosLevel", 1) == 0) { qos = str_2_acct_qos(argv[i]+end); } else { diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c index 30bd04206259375e12c1bf9fc3147d7a2022327a..e1cf404d368940081400d3a7f87e8780e23a4ece 100644 --- a/src/sacctmgr/user_functions.c +++ b/src/sacctmgr/user_functions.c @@ -129,7 +129,7 @@ static int _set_rec(int *start, int argc, char *argv[], str_2_acct_admin_level(argv[i]+end); u_set = 1; } else if (strncasecmp (argv[i], "DefaultAccount", 1) == 0) { - user->default_acct = xstrdup(argv[i]+end); + user->default_acct = strip_quotes(argv[i]+end, NULL); u_set = 1; } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { if (get_uint(argv[i]+end, &association->fairshare, @@ -295,9 +295,9 @@ extern int sacctmgr_add_user(int argc, char *argv[]) addto_char_list(assoc_cond->cluster_list, argv[i]+end); } else if (strncasecmp (argv[i], "DefaultAccount", 1) == 0) { - default_acct = xstrdup(argv[i]+end); + default_acct = strip_quotes(argv[i]+end, NULL); addto_char_list(assoc_cond->acct_list, - argv[i]+end); + default_acct); } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { if (get_uint(argv[i]+end, &fairshare, "FairShare") == SLURM_SUCCESS)