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