From c5808f65ce6078319b35a68021cc73a948579d1c Mon Sep 17 00:00:00 2001
From: Danny Auble <da@llnl.gov>
Date: Mon, 31 Aug 2009 21:08:22 +0000
Subject: [PATCH] some mods to make remove qos and wckey more correct

---
 .../mysql/accounting_storage_mysql.c          | 73 ++++++++++---------
 .../accounting_storage/mysql/mysql_problems.c |  2 +-
 2 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
index 5170cbc94f4..4d031082310 100644
--- a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
+++ b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c
@@ -2099,7 +2099,7 @@ static bool _check_jobs_before_remove(mysql_conn_t *mysql_conn,
 
 	query = xstrdup_printf("select t0.associd from %s as t0, %s as t1, "
 			       "%s as t2 where t1.lft between "
-			       "t2.lft and t2.rgt && (%s)"
+			       "t2.lft and t2.rgt && (%s) "
 			       "and t0.associd=t1.id limit 1;",
 			       job_table, assoc_table, assoc_table, 
 			       assoc_char);
@@ -2130,7 +2130,7 @@ static bool _check_jobs_before_remove_assoc(mysql_conn_t *mysql_conn,
 	MYSQL_RES *result = NULL;
 
 	query = xstrdup_printf("select t1.associd from %s as t1, "
-			       "%s as t2 where (%s)"
+			       "%s as t2 where (%s) "
 			       "and t1.associd=t2.id limit 1;",
 			       job_table, assoc_table, 
 			       assoc_char);
@@ -2174,9 +2174,7 @@ static int _remove_common(mysql_conn_t *mysql_conn,
 	 * really delete it for accounting purposes.  This is for
 	 * corner cases most of the time this won't matter.
 	 */
-	if((table == acct_coord_table) 
-	   || (table == qos_table)
-	   || (table == wckey_table)) {
+	if(table == acct_coord_table) {
 		/* This doesn't apply for these tables since we are
 		 * only looking for association type tables.
 		 */
@@ -2217,35 +2215,12 @@ static int _remove_common(mysql_conn_t *mysql_conn,
 		list_flush(mysql_conn->update_list);
 		
 		return SLURM_ERROR;
-	}
-	
-	if(table == qos_table) {
-		/* remove this qos from all the users/accts that have it */
-		xstrfmtcat(query, "update %s set mod_time=%d %s "
-			   "where deleted=0;",
-			   assoc_table, now, assoc_char);
-		debug3("%d(%d) query\n%s",
-		       mysql_conn->conn, __LINE__, query);
-		rc = mysql_db_query(mysql_conn->db_conn, query);
-		xfree(query);
-		if(rc != SLURM_SUCCESS) {
-			if(mysql_conn->rollback) {
-				mysql_db_rollback(mysql_conn->db_conn);
-			}
-			list_flush(mysql_conn->update_list);
-			return SLURM_ERROR;
-		}
-		/* we don't have to send anything else since removing
-		   the qos in the first place will remove it from the
-		   clusters 
-		*/		
-		return SLURM_SUCCESS;
 	} else if((table == acct_coord_table)
+		  || (table == qos_table)
 		  || (table == wckey_table))
 		return SLURM_SUCCESS;
-
-	/* mark deleted=1 or remove completely the
-	   accounting tables
+	
+	/* mark deleted=1 or remove completely the accounting tables
 	*/
 	if(table != assoc_table) {
 		if(!assoc_char) {
@@ -5173,7 +5148,7 @@ extern List acct_storage_p_modify_clusters(mysql_conn_t *mysql_conn,
 	int rc = SLURM_SUCCESS;
 	char *object = NULL;
 	char *vals = NULL, *extra = NULL, *query = NULL,
-		*name_char = NULL, *assoc_char= NULL, *send_char = NULL;
+		*name_char = NULL, *send_char = NULL;
 	time_t now = time(NULL);
 	char *user_name = NULL;
 	int set = 0;
@@ -5358,7 +5333,6 @@ extern List acct_storage_p_modify_clusters(mysql_conn_t *mysql_conn,
 
 end_it:
 	xfree(name_char);
-	xfree(assoc_char);
 	xfree(vals);
 	xfree(send_char);
 
@@ -7173,7 +7147,11 @@ extern List acct_storage_p_remove_qos(mysql_conn_t *mysql_conn, uint32_t uid,
 			xstrfmtcat(name_char, "id=\"%s\"", row[0]);
 		else
 			xstrfmtcat(name_char, " || id=\"%s\"", row[0]); 
-		xstrfmtcat(assoc_char, 
+		if(!assoc_char)
+			xstrfmtcat(assoc_char, "t2.qos=\"%s\"", row[0]);
+		else
+			xstrfmtcat(assoc_char, " || t2.qos=\"%s\"", row[0]); 
+		xstrfmtcat(extra, 
 			   ", qos=replace(qos, ',%s', '')"
 			   ", delta_qos=replace(delta_qos, ',+%s', '')"
 			   ", delta_qos=replace(delta_qos, ',-%s', '')",
@@ -7195,6 +7173,23 @@ extern List acct_storage_p_remove_qos(mysql_conn_t *mysql_conn, uint32_t uid,
 	}
 	xfree(query);
 
+	/* remove this qos from all the users/accts that have it */
+	query = xstrdup_printf("update %s set mod_time=%d %s where deleted=0;",
+			       assoc_table, now, extra);
+	xfree(extra);
+	debug3("%d(%d) query\n%s",
+	       mysql_conn->conn, __LINE__, query);
+	rc = mysql_db_query(mysql_conn->db_conn, query);
+	xfree(query);
+	if(rc != SLURM_SUCCESS) {
+		if(mysql_conn->rollback) {
+			mysql_db_rollback(mysql_conn->db_conn);
+		}
+		list_flush(mysql_conn->update_list);
+		list_destroy(ret_list);
+		return NULL;
+	}
+	
 	user_name = uid_to_string((uid_t) uid);
 	rc = _remove_common(mysql_conn, DBD_REMOVE_QOS, now,
 			    user_name, qos_table, name_char, assoc_char);
@@ -7204,7 +7199,7 @@ extern List acct_storage_p_remove_qos(mysql_conn_t *mysql_conn, uint32_t uid,
 	if (rc == SLURM_ERROR) {
 		list_destroy(ret_list);
 		return NULL;
-	}
+	} 
 
 	return ret_list;
 }
@@ -7258,6 +7253,11 @@ empty:
 			xstrfmtcat(name_char, "id=\"%s\"", row[0]);
 		else
 			xstrfmtcat(name_char, " || id=\"%s\"", row[0]); 
+		if(!assoc_char)
+			xstrfmtcat(assoc_char, "t2.wckeyid=\"%s\"", row[0]);
+		else
+			xstrfmtcat(assoc_char,
+				   " || t2.wckeyid=\"%s\"", row[0]); 
 		
 		wckey_rec = xmalloc(sizeof(acct_wckey_rec_t));
 		/* we only need id when removing no real need to init */
@@ -7271,13 +7271,14 @@ empty:
 		errno = SLURM_NO_CHANGE_IN_DATA;
 		debug3("didn't effect anything\n%s", query);
 		xfree(query);
+		xfree(assoc_char);
 		return ret_list;
 	}
 	xfree(query);
 
 	user_name = uid_to_string((uid_t) uid);
 	rc = _remove_common(mysql_conn, DBD_REMOVE_WCKEYS, now,
-			    user_name, wckey_table, name_char, NULL);
+			    user_name, wckey_table, name_char, assoc_char);
 	xfree(assoc_char);
 	xfree(name_char);
 	xfree(user_name);
diff --git a/src/plugins/accounting_storage/mysql/mysql_problems.c b/src/plugins/accounting_storage/mysql/mysql_problems.c
index 962ccf3dae3..3459644512f 100644
--- a/src/plugins/accounting_storage/mysql/mysql_problems.c
+++ b/src/plugins/accounting_storage/mysql/mysql_problems.c
@@ -342,7 +342,7 @@ extern int mysql_user_no_assocs_or_no_uid(mysql_conn_t *mysql_conn,
 		assoc =	xmalloc(sizeof(acct_association_rec_t));
 		list_append(ret_list, assoc);
 
-		assoc->id = ACCT_PROBLEM_ACCT_NO_ASSOC;
+		assoc->id = ACCT_PROBLEM_USER_NO_ASSOC;
 		assoc->user = xstrdup(row[0]);		
 	}
 	mysql_free_result(result);
-- 
GitLab