From 35f4f2cb5d29d051a6321aca5662d497c3b02bc5 Mon Sep 17 00:00:00 2001 From: Danny Auble <da@llnl.gov> Date: Thu, 3 Apr 2008 17:11:00 +0000 Subject: [PATCH] added notice if database is locked --- src/sacctmgr/account_functions.c | 9 ++- src/sacctmgr/cluster_functions.c | 6 ++ src/sacctmgr/common.c | 26 ++++++++ src/sacctmgr/sacctmgr.h | 2 + src/sacctmgr/user_functions.c | 110 ++++++++----------------------- 5 files changed, 70 insertions(+), 83 deletions(-) diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c index 701d635d861..0463f116a3b 100644 --- a/src/sacctmgr/account_functions.c +++ b/src/sacctmgr/account_functions.c @@ -501,7 +501,8 @@ extern int sacctmgr_add_account(int argc, char *argv[]) printf(" MaxWall = %u\n", max_wall_duration_per_job); } - + + notice_thread_init(); if(list_count(acct_list)) rc = acct_storage_g_add_accounts(db_conn, my_uid, acct_list); @@ -513,8 +514,10 @@ extern int sacctmgr_add_account(int argc, char *argv[]) } else { printf(" error: Problem adding accounts\n"); rc = SLURM_ERROR; + notice_thread_fini(); goto end_it; } + notice_thread_fini(); if(rc == SLURM_SUCCESS) { if(commit_check("Would you like to commit changes?")) { @@ -733,6 +736,7 @@ extern int sacctmgr_modify_account(int argc, char *argv[]) } } + notice_thread_init(); if(rec_set == 3 || rec_set == 1) { // process the account changes if(cond_set == 2) { rc = SLURM_ERROR; @@ -785,6 +789,7 @@ assoc_start: list_destroy(ret_list); } + notice_thread_fini(); if(set) { if(commit_check("Would you like to commit changes?")) acct_storage_g_commit(db_conn, 1); @@ -825,6 +830,7 @@ extern int sacctmgr_delete_account(int argc, char *argv[]) return SLURM_ERROR; } + notice_thread_init(); if(set == 1) { ret_list = acct_storage_g_remove_accounts( db_conn, my_uid, acct_cond); @@ -832,6 +838,7 @@ extern int sacctmgr_delete_account(int argc, char *argv[]) ret_list = acct_storage_g_remove_associations( db_conn, my_uid, acct_cond->assoc_cond); } + notice_thread_fini(); destroy_acct_account_cond(acct_cond); if(ret_list && list_count(ret_list)) { diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c index 9f61cfeecad..fb898d6d6c2 100644 --- a/src/sacctmgr/cluster_functions.c +++ b/src/sacctmgr/cluster_functions.c @@ -234,7 +234,9 @@ extern int sacctmgr_add_cluster(int argc, char *argv[]) goto end_it; } + notice_thread_init(); rc = acct_storage_g_add_clusters(db_conn, my_uid, cluster_list); + notice_thread_fini(); if(rc == SLURM_SUCCESS) { if(commit_check("Would you like to commit changes?")) { acct_storage_g_commit(db_conn, 1); @@ -387,8 +389,10 @@ extern int sacctmgr_modify_cluster(int argc, char *argv[]) cluster_list = list_create(destroy_acct_cluster_rec); list_append(cluster_list, cluster); + notice_thread_init(); ret_list = acct_storage_g_modify_clusters( db_conn, my_uid, cluster_cond, cluster); + notice_thread_fini(); if(ret_list && list_count(ret_list)) { char *object = NULL; ListIterator itr = list_iterator_create(ret_list); @@ -439,8 +443,10 @@ extern int sacctmgr_delete_cluster(int argc, char *argv[]) destroy_acct_cluster_cond(cluster_cond); return SLURM_SUCCESS; } + notice_thread_init(); ret_list = acct_storage_g_remove_clusters( db_conn, my_uid, cluster_cond); + notice_thread_fini(); destroy_acct_cluster_cond(cluster_cond); diff --git a/src/sacctmgr/common.c b/src/sacctmgr/common.c index d686d5f28c0..fd32c3c72e5 100644 --- a/src/sacctmgr/common.c +++ b/src/sacctmgr/common.c @@ -42,6 +42,16 @@ #define FORMAT_STRING_SIZE 32 +static pthread_t lock_warning_thread; + +static void *_print_lock_warn(void *no_data) +{ + sleep(2); + printf(" Waiting for lock from other user.\n"); + + return NULL; +} + static void nonblock(int state) { struct termios ttystate; @@ -193,6 +203,22 @@ extern void destroy_sacctmgr_action(void *object) } } +extern int notice_thread_init() +{ + pthread_attr_t attr; + + slurm_attr_init(&attr); + if(pthread_create(&lock_warning_thread, &attr, &_print_lock_warn, NULL)) + error ("pthread_create error %m"); + slurm_attr_destroy(&attr); + return SLURM_SUCCESS; +} + +extern int notice_thread_fini() +{ + return pthread_cancel(lock_warning_thread); +} + extern int commit_check(char *warning) { int ans = 0; diff --git a/src/sacctmgr/sacctmgr.h b/src/sacctmgr/sacctmgr.h index 1a477f0abeb..a173098bff6 100644 --- a/src/sacctmgr/sacctmgr.h +++ b/src/sacctmgr/sacctmgr.h @@ -155,6 +155,8 @@ extern int sacctmgr_delete_cluster(int argc, char *argv[]); extern int parse_option_end(char *option); extern void addto_char_list(List char_list, char *names); extern void destroy_sacctmgr_action(void *object); +extern int notice_thread_init(); +extern int notice_thread_fini(); extern int commit_check(char *warning); extern int sacctmgr_init(); extern int sacctmgr_remove_from_list(List list, void *object); diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c index 1009738db74..6e139d1fcd1 100644 --- a/src/sacctmgr/user_functions.c +++ b/src/sacctmgr/user_functions.c @@ -250,7 +250,7 @@ extern int sacctmgr_add_user(int argc, char *argv[]) ListIterator itr_p = NULL; acct_user_rec_t *user = NULL; acct_association_rec_t *assoc = NULL; - acct_association_rec_t *temp_assoc = NULL; + acct_association_rec_t *acct_assoc = NULL; char *default_acct = NULL; acct_association_cond_t *assoc_cond = NULL; acct_qos_level_t qos = ACCT_QOS_NOTSET; @@ -264,11 +264,6 @@ extern int sacctmgr_add_user(int argc, char *argv[]) uint32_t max_nodes_per_job = -2; uint32_t max_wall_duration_per_job = -2; uint32_t max_cpu_secs_per_job = -2; - uint32_t use_fairshare = -2; - uint32_t use_max_jobs = -2; - uint32_t use_max_nodes_per_job = -2; - uint32_t use_max_wall_duration_per_job = -2; - uint32_t use_max_cpu_secs_per_job = -2; char *user_str = NULL; char *assoc_str = NULL; int limit_set = 0; @@ -404,21 +399,9 @@ extern int sacctmgr_add_user(int argc, char *argv[]) } itr_c = list_iterator_create(assoc_cond->cluster_list); while((cluster = list_next(itr_c))) { - acct_association_rec_t *root_assoc = - sacctmgr_find_root_assoc(cluster); - if(!root_assoc) { - printf(" error: This cluster '%s' " - "doesn't have a root account\n" - " Something bad has " - "happend. " - "Contact your admin.\n", - cluster); - continue; - } - - temp_assoc = sacctmgr_find_account_base_assoc( + acct_assoc = sacctmgr_find_account_base_assoc( account, cluster); - if(!temp_assoc) { + if(!acct_assoc) { if(acct_first) printf(" error: This " "account '%s' " @@ -427,58 +410,16 @@ extern int sacctmgr_add_user(int argc, char *argv[]) " Contact your " "admin " "to add this account.\n", - account, cluster); - + account, cluster); continue; }/* else */ /* printf("got %u %s %s %s %s\n", */ -/* temp_assoc->id, */ -/* temp_assoc->user, */ -/* temp_assoc->account, */ -/* temp_assoc->cluster, */ -/* temp_assoc->parent_account); */ - use_fairshare = -2; - use_max_jobs = -2; - use_max_nodes_per_job = -2; - use_max_wall_duration_per_job = -2; - use_max_cpu_secs_per_job = -2; - - if(fairshare != -2) - use_fairshare = fairshare; - else if((int)root_assoc->fairshare != -1) - use_fairshare = root_assoc->fairshare; +/* acct_assoc->id, */ +/* acct_assoc->user, */ +/* acct_assoc->account, */ +/* acct_assoc->cluster, */ +/* acct_assoc->parent_account); */ - if(max_jobs != -2) - use_max_jobs = max_jobs; - else if((int)root_assoc->max_jobs != -1) - use_max_jobs =root_assoc->max_jobs; - - if(max_nodes_per_job != -2) - use_max_nodes_per_job = - max_nodes_per_job; - else if((int)root_assoc->max_nodes_per_job - != -1) - use_max_nodes_per_job = - root_assoc->max_nodes_per_job; - - if(max_wall_duration_per_job != -2) - use_max_wall_duration_per_job = - max_wall_duration_per_job; - else if((int)root_assoc-> - max_wall_duration_per_job != -1) - use_max_wall_duration_per_job = - root_assoc-> - max_wall_duration_per_job; - - if(max_cpu_secs_per_job != -2) - use_max_cpu_secs_per_job = - max_cpu_secs_per_job; - else if((int)root_assoc-> - max_cpu_secs_per_job != -1) - use_max_cpu_secs_per_job = - root_assoc-> - max_cpu_secs_per_job; - itr_p = list_iterator_create( assoc_cond->partition_list); while((partition = list_next(itr_p))) { @@ -493,15 +434,14 @@ extern int sacctmgr_add_user(int argc, char *argv[]) assoc->acct = xstrdup(account); assoc->cluster = xstrdup(cluster); assoc->partition = xstrdup(partition); - //assoc->parent_acct = xstrdup(account); - assoc->fairshare = use_fairshare; - assoc->max_jobs = use_max_jobs; + assoc->fairshare = fairshare; + assoc->max_jobs = max_jobs; assoc->max_nodes_per_job = - use_max_nodes_per_job; + max_nodes_per_job; assoc->max_wall_duration_per_job = - use_max_wall_duration_per_job; + max_wall_duration_per_job; assoc->max_cpu_secs_per_job = - use_max_cpu_secs_per_job; + max_cpu_secs_per_job; if(user) list_append(user->assoc_list, assoc); @@ -520,22 +460,21 @@ extern int sacctmgr_add_user(int argc, char *argv[]) if(partition_set) continue; - if(sacctmgr_find_association(name, account, - cluster, NULL)) + if(sacctmgr_find_association( + name, account, cluster, NULL)) continue; assoc = xmalloc(sizeof(acct_association_rec_t)); assoc->user = xstrdup(name); assoc->acct = xstrdup(account); assoc->cluster = xstrdup(cluster); - assoc->fairshare = use_fairshare; - assoc->max_jobs = use_max_jobs; - assoc->max_nodes_per_job = - use_max_nodes_per_job; + assoc->fairshare = fairshare; + assoc->max_jobs = max_jobs; + assoc->max_nodes_per_job = max_nodes_per_job; assoc->max_wall_duration_per_job = - use_max_wall_duration_per_job; + max_wall_duration_per_job; assoc->max_cpu_secs_per_job = - use_max_cpu_secs_per_job; + max_cpu_secs_per_job; if(user) list_append(user->assoc_list, assoc); else @@ -599,6 +538,7 @@ no_default: max_wall_duration_per_job); } + notice_thread_init(); if(list_count(user_list)) { rc = acct_storage_g_add_users(db_conn, my_uid, user_list); @@ -611,8 +551,10 @@ no_default: } else { printf(" error: Problem adding users\n"); rc = SLURM_ERROR; + notice_thread_fini(); goto end_it; } + notice_thread_fini(); if(rc == SLURM_SUCCESS) { if(commit_check("Would you like to commit changes?")) { @@ -824,6 +766,7 @@ extern int sacctmgr_modify_user(int argc, char *argv[]) } } + notice_thread_init(); if(rec_set == 3 || rec_set == 1) { // process the account changes if(cond_set == 2) { rc = SLURM_ERROR; @@ -877,6 +820,7 @@ assoc_start: list_destroy(ret_list); } + notice_thread_fini(); if(set) { if(commit_check("Would you like to commit changes?")) acct_storage_g_commit(db_conn, 1); @@ -916,6 +860,7 @@ extern int sacctmgr_delete_user(int argc, char *argv[]) return SLURM_ERROR; } + notice_thread_init(); if(set == 1) { ret_list = acct_storage_g_remove_users( db_conn, my_uid, user_cond); @@ -923,6 +868,7 @@ extern int sacctmgr_delete_user(int argc, char *argv[]) ret_list = acct_storage_g_remove_associations( db_conn, my_uid, user_cond->assoc_cond); } + notice_thread_fini(); destroy_acct_user_cond(user_cond); -- GitLab