diff --git a/src/database/mysql_common.c b/src/database/mysql_common.c index eb3c1dd17a1bc0a0d13b31c8f24b6f635619ea5a..3e3fd13a9b796f6d44b752880029542df9520669 100644 --- a/src/database/mysql_common.c +++ b/src/database/mysql_common.c @@ -163,8 +163,8 @@ extern int mysql_get_db_connection(MYSQL **mysql_db, char *db_name, else { #ifdef MYSQL_OPT_RECONNECT { - my_bool reconnect = 0; - /* make sure reconnect is off */ + my_bool reconnect = 1; + /* make sure reconnect is on */ mysql_options(*mysql_db, MYSQL_OPT_RECONNECT, &reconnect); } #endif @@ -208,8 +208,13 @@ extern int mysql_db_query(MYSQL *mysql_db, char *query) slurm_mutex_lock(&mysql_lock); /* clear out the old results so we don't get a 2014 error */ - _clear_results(mysql_db); + _clear_results(mysql_db); +//try_again: if(mysql_query(mysql_db, query)) { + /* if(mysql_errno(mysql_db) == CR_SERVER_GONE_ERROR) { */ +/* /\* FIX ME: this means the connection went away *\/ */ +/* } */ + error("mysql_query failed: %d %s\n%s", mysql_errno(mysql_db), mysql_error(mysql_db), query); @@ -222,6 +227,49 @@ extern int mysql_db_query(MYSQL *mysql_db, char *query) return SLURM_SUCCESS; } +extern int mysql_db_commit(MYSQL *mysql_db) +{ + slurm_mutex_lock(&mysql_lock); + + /* clear out the old results so we don't get a 2014 error */ + _clear_results(mysql_db); + if(mysql_commit(mysql_db)) { + error("mysql_commit failed: %d %s", + mysql_errno(mysql_db), + mysql_error(mysql_db)); + errno = mysql_errno(mysql_db); + mysql_autocommit(mysql_db, 1); + slurm_mutex_unlock(&mysql_lock); + return SLURM_ERROR; + } + mysql_autocommit(mysql_db, 1); + slurm_mutex_unlock(&mysql_lock); + + return SLURM_SUCCESS; +} + +extern int mysql_db_rollback(MYSQL *mysql_db) +{ + slurm_mutex_lock(&mysql_lock); + + /* clear out the old results so we don't get a 2014 error */ + _clear_results(mysql_db); + if(mysql_rollback(mysql_db)) { + error("mysql_commit failed: %d %s", + mysql_errno(mysql_db), + mysql_error(mysql_db)); + errno = mysql_errno(mysql_db); + mysql_autocommit(mysql_db, 1); + slurm_mutex_unlock(&mysql_lock); + return SLURM_ERROR; + } + mysql_autocommit(mysql_db, 1); + slurm_mutex_unlock(&mysql_lock); + + return SLURM_SUCCESS; + +} + extern MYSQL_RES *mysql_db_query_ret(MYSQL *mysql_db, char *query) { MYSQL_RES *result = NULL; diff --git a/src/database/mysql_common.h b/src/database/mysql_common.h index 9e011e56031743327d434cfbc3a9070026c3410f..2b5a6b777ef6d4fe1849bf14df5e60031f58e172 100644 --- a/src/database/mysql_common.h +++ b/src/database/mysql_common.h @@ -83,6 +83,8 @@ extern int mysql_get_db_connection(MYSQL **mysql_db, char *db_name, mysql_db_info_t *db_info); extern int mysql_close_db_connection(MYSQL **mysql_db); extern int mysql_db_query(MYSQL *mysql_db, char *query); +extern int mysql_db_commit(MYSQL *mysql_db); +extern int mysql_db_rollback(MYSQL *mysql_db); extern MYSQL_RES *mysql_db_query_ret(MYSQL *mysql_db, char *query); diff --git a/src/database/pgsql_common.c b/src/database/pgsql_common.c index 769bafafc029e06791818567d5333f856b09e7e4..31af50e1caf1d72b48adf8c7027f76bb8d1f957f 100644 --- a/src/database/pgsql_common.c +++ b/src/database/pgsql_common.c @@ -45,8 +45,6 @@ pthread_mutex_t pgsql_lock = PTHREAD_MUTEX_INITIALIZER; #ifdef HAVE_PGSQL -static int rollback_started = 0; - extern int *destroy_pgsql_db_info(pgsql_db_info_t *db_info) { if(db_info) { @@ -94,7 +92,7 @@ extern int pgsql_create_db(PGconn *pgsql_db, char *db_name, } extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name, - pgsql_db_info_t *db_info, bool rollback) + pgsql_db_info_t *db_info) { int rc = SLURM_SUCCESS; bool storage_init = false; @@ -126,26 +124,20 @@ extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name, pgsql_create_db(*pgsql_db, db_name, db_info); } else { storage_init = true; - debug2("connected to %s", db_name); - if(rollback || rollback_started) { - rollback_started = 1; - PQexec(*pgsql_db, "BEGIN WORK"); - } + /* debug2("connected to %s", db_name); */ +/* if(rollback || rollback_started) { */ +/* rollback_started = 1; */ +/* PQexec(*pgsql_db, "BEGIN WORK"); */ +/* } */ } } xfree(connect_line); return rc; } -extern int pgsql_close_db_connection(PGconn **pgsql_db, bool commit) +extern int pgsql_close_db_connection(PGconn **pgsql_db) { - if(*pgsql_db) { - if(rollback_started) { - if(commit) - PQexec(*pgsql_db, "COMMIT WORK"); - else - PQexec(*pgsql_db, "ROLLBACK WORK"); - } + if(pgsql_db && *pgsql_db) { PQfinish(*pgsql_db); *pgsql_db = NULL; } @@ -166,6 +158,17 @@ extern int pgsql_db_query(PGconn *pgsql_db, char *query) return SLURM_SUCCESS; } +extern int pgsql_db_commit(PGconn *pgsql_db) +{ + return pgsql_db_query(pgsql_db, "COMMIT WORK"); +} + +extern int pgsql_db_rollback(PGconn *pgsql_db) +{ + return pgsql_db_query(pgsql_db, "ROLLBACK WORK"); + +} + extern PGresult *pgsql_db_query_ret(PGconn *pgsql_db, char *query) { PGresult *result = NULL; diff --git a/src/database/pgsql_common.h b/src/database/pgsql_common.h index decf234a2c99380e87d55bc7521ceaa96f0866f0..b53fbd2fdb4f49f505491e36ad30d338f7216689 100644 --- a/src/database/pgsql_common.h +++ b/src/database/pgsql_common.h @@ -79,11 +79,13 @@ extern int pgsql_create_db(PGconn *pgsql_db, char *db_name, pgsql_db_info_t *db_info); extern int pgsql_get_db_connection(PGconn **pgsql_db, char *db_name, - pgsql_db_info_t *db_info, bool rollback); + pgsql_db_info_t *db_info); -extern int pgsql_close_db_connection(PGconn **pgsql_db, bool commit); +extern int pgsql_close_db_connection(PGconn **pgsql_db); extern int pgsql_db_query(PGconn *pgsql_db, char *query); +extern int pgsql_db_commit(PGconn *pgsql_db); +extern int pgsql_db_rollback(PGconn *pgsql_db); extern PGresult *pgsql_db_query_ret(PGconn *pgsql_db, char *query); diff --git a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c index 3549a7206775fc9f893d0d7dcccb739dd32f2001..cc97087135705c37b3cc59cb01d1f378f0d2b603 100644 --- a/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c +++ b/src/plugins/accounting_storage/mysql/accounting_storage_mysql.c @@ -159,7 +159,7 @@ static int _addto_update_list(List update_list, acct_update_type_t type, return SLURM_SUCCESS; } -static int _get_affected_rows(MYSQL *mysql_db) +static int _last_affected_rows(MYSQL *mysql_db) { int status=0, rows=0; MYSQL_RES *result = NULL; @@ -172,7 +172,7 @@ static int _get_affected_rows(MYSQL *mysql_db) if (mysql_field_count(mysql_db) == 0) { status = mysql_affected_rows(mysql_db); if(status > 0) - rows+=status; + rows = status; } if ((status = mysql_next_result(mysql_db)) > 0) debug3("Could not execute statement\n"); @@ -209,8 +209,7 @@ static int _modify_common(mysql_conn_t *mysql_conn, if(rc != SLURM_SUCCESS) { if(mysql_conn->rollback) { - mysql_db_query(mysql_conn->acct_mysql_db, "ROLLBACK;"); - mysql_autocommit(mysql_conn->acct_mysql_db, 1); + mysql_db_rollback(mysql_conn->acct_mysql_db); } list_destroy(mysql_conn->update_list); mysql_conn->update_list = @@ -236,110 +235,116 @@ static int _remove_common(mysql_conn_t *mysql_conn, char *query = NULL; MYSQL_RES *result = NULL; MYSQL_ROW row; - int txn_id = 0; - - query = xstrdup_printf("LOCK TABLE %s WRITE;" - "update %s set mod_time=%d, deleted=1 " - "where deleted=0 && (%s);" - "UNLOCK TABLES;", - table, table, now, name_char); - - rc = mysql_db_query(mysql_conn->acct_mysql_db, query); - xfree(query); - if(rc != SLURM_SUCCESS) { - error("Couldn't remove"); - return SLURM_ERROR; - } - if(mysql_conn->rollback) { - char *roll = mysql_conn->query; - mysql_conn->query = xstrdup_printf( - "LOCK TABLE %s WRITE;" - "update %s set deleted=0 where deleted=1 && (%s);" - "UNLOCK TABLES;", - table, table, name_char); - if(roll) { - xstrfmtcat(mysql_conn->query, "%s", roll); - xfree(roll); - } - } + query = xstrdup_printf("update %s set mod_time=%d, deleted=1 " + "where deleted=0 && (%s);", + table, now, name_char); xstrfmtcat(query, - "LOCK TABLE %s WRITE;" - "insert into %s " - "(timestamp, action, name, actor) " + "insert into %s (timestamp, action, name, actor) " "values (%d, %d, \"%s\", '%s');", txn_table, - txn_table, now, type, name_char, user_name); -// info("query\n%s", query); + + debug3("query\n%s", query); rc = mysql_db_query(mysql_conn->acct_mysql_db, query); xfree(query); if(rc != SLURM_SUCCESS) { - error("Couldn't add tnx"); - } - xstrfmtcat(query, - "select last_insert_id();" - "UNLOCK TABLES;"); - if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, - query))) { - xfree(query); - error("can't get last id"); + if(mysql_conn->rollback) { + mysql_db_rollback(mysql_conn->acct_mysql_db); + } + list_destroy(mysql_conn->update_list); + mysql_conn->update_list = + list_create(destroy_acct_update_object); + return SLURM_ERROR; } - xfree(query); - row = mysql_fetch_row(result); - if(!row) { - error("nothing returned"); - return SLURM_ERROR; - } - txn_id = atoi(row[0]); - mysql_free_result(result); - //info("added transaction %d", txn_id); - if(mysql_conn->rollback) { - char *roll = mysql_conn->query; - mysql_conn->query = xstrdup_printf( - "LOCK TABLE %s WRITE;" - "delete from %s where id=%d;" - "UNLOCK TABLES;", - txn_table, txn_table, txn_id); - if(roll) { - xstrfmtcat(mysql_conn->query, "%s", roll); - xfree(roll); - } - } - - /* Stop here if we are doing associations */ if(table == assoc_table || !assoc_char) return SLURM_SUCCESS; - - query = xstrdup_printf("LOCK TABLE %s WRITE;" - "update %s set mod_time=%d, deleted=1 " - "where deleted=0 && (%s);" - "UNLOCK TABLES;", - assoc_table, assoc_table, now, assoc_char); - rc = mysql_db_query(mysql_conn->acct_mysql_db, query); - xfree(query); - if(rc != SLURM_SUCCESS) { - error("Couldn't remove user associations"); + + query = xstrdup_printf("SELECT lft, rgt FROM %s WHERE %s;", + assoc_table, assoc_char); + + debug3("query\n%s", query); + if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, query))) { + if(mysql_conn->rollback) { + mysql_db_rollback(mysql_conn->acct_mysql_db); + } + list_destroy(mysql_conn->update_list); + mysql_conn->update_list = + list_create(destroy_acct_update_object); return SLURM_ERROR; } - - if(mysql_conn->rollback) { - char *roll = mysql_conn->query; - mysql_conn->query = xstrdup_printf( - "LOCK TABLE %s WRITE;" - "update %s set deleted=0 where deleted=1 && (%s);" - "UNLOCK TABLES;", - assoc_table, assoc_table, assoc_char); - if(roll) { - xstrfmtcat(mysql_conn->query, "%s", roll); - xfree(roll); - } + xfree(query); + + while((row = mysql_fetch_row(result))) { + query = xstrdup_printf( + "update %s set mod_time=%d, deleted=1 " + "where deleted=0 && lft>=%s && rgt<=%s;", + assoc_table, now, + row[0], row[1]); + debug3("query\n%s", query); + rc = mysql_db_query(mysql_conn->acct_mysql_db, query); + xfree(query); + if(rc != SLURM_SUCCESS) { + if(mysql_conn->rollback) { + mysql_db_rollback(mysql_conn->acct_mysql_db); + } + list_destroy(mysql_conn->update_list); + mysql_conn->update_list = + list_create(destroy_acct_update_object); + break; + } } - return SLURM_SUCCESS; + mysql_free_result(result); + + return rc; } +/* static int _remove_assoc_common(mysql_conn_t *mysql_conn, */ +/* uint16_t type, */ +/* time_t now, */ +/* char *user_name, */ +/* char *assoc_char) */ +/* { */ +/* MYSQL_RES *result = NULL; */ +/* MYSQL_ROW row; */ +/* int lft = 0, rgt = 0; */ +/* char *query = xstrdup_printf("SELECT lft, rgt FROM %s WHERE %s;", */ +/* assoc_table, assoc_char); */ +/* int rc = SLURM_SUCCESS; */ + +/* debug3("query\n%s", query); */ +/* if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, query))) { */ +/* xfree(query); */ +/* return rc; */ +/* } */ +/* xfree(query); */ + +/* while((row = mysql_fetch_row(result))) { */ +/* query = xstrdup_printf( */ +/* "update %s set mod_time=%d, deleted=1 " */ +/* "where deleted=0 && lft>=%s && rgt<=%s;", */ +/* assoc_table, now, */ +/* row[0], row[1]); */ +/* debug3("query\n%s", query); */ +/* rc = mysql_db_query(mysql_conn->acct_mysql_db, query); */ +/* xfree(query); */ +/* if(rc != SLURM_SUCCESS) { */ +/* if(mysql_conn->rollback) { */ +/* mysql_db_rollback(mysql_conn->acct_mysql_db); */ +/* } */ +/* list_destroy(mysql_conn->update_list); */ +/* mysql_conn->update_list = */ +/* list_create(destroy_acct_update_object); */ +/* break; */ +/* } */ +/* } */ +/* mysql_free_result(result); */ + +/* return rc; */ + +/* } */ static int _get_db_index(MYSQL *acct_mysql_db, time_t submit, uint32_t jobid, uint32_t associd) { @@ -945,7 +950,7 @@ extern int acct_storage_p_add_users(mysql_conn_t *mysql_conn, uint32_t uid, continue; } - affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db); + affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db); if(!affect_rows) { debug("nothing changed"); xfree(extra); @@ -1106,6 +1111,7 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid, "UNLOCK TABLES;", acct_table, acct_table, cols, vals, now, extra); + debug3("query\n%s", query); rc = mysql_db_query(mysql_conn->acct_mysql_db, query); xfree(cols); xfree(vals); @@ -1115,7 +1121,9 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid, xfree(extra); continue; } - affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db); + affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db); + debug3("affected %d", affect_rows); + if(!affect_rows) { debug3("nothing changed"); xfree(extra); @@ -1141,6 +1149,7 @@ extern int acct_storage_p_add_accts(mysql_conn_t *mysql_conn, uint32_t uid, xstrfmtcat(mysql_conn->query, "%s", roll); xfree(roll); } + info("we got %d \n%s", affect_rows, mysql_conn->query); } xstrfmtcat(query, @@ -1305,7 +1314,7 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid, continue; } - affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db); + affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db); if(!affect_rows) { debug2("nothing changed %d", affect_rows); @@ -1396,8 +1405,7 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid, "insert into %s (%s, lft, rgt) " "values (%s, @MyMax+1, @MyMax+2) " "on duplicate key update deleted=0, " - "lft=@MyMax+1, rgt=@MyMax+2 %s;" - "UNLOCK TABLES;", + "lft=@MyMax+1, rgt=@MyMax+2 %s;", assoc_table, cols, vals, extra); @@ -1415,22 +1423,10 @@ extern int acct_storage_p_add_clusters(mysql_conn_t *mysql_conn, uint32_t uid, xfree(extra); continue; } - affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db); + affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db); // info("got %d rows", affect_rows); - if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, - "select last_insert_id();"))) { - xfree(extra); - error("can't get last id"); - continue; - } - row = mysql_fetch_row(result); - if(!row) { - error("nothing returned"); - xfree(extra); - continue; - } - assoc_id = atoi(row[0]); - mysql_free_result(result); + assoc_id = mysql_insert_id(mysql_conn->acct_mysql_db); + mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); if(mysql_conn->rollback) { char *roll = mysql_conn->query; @@ -1492,8 +1488,6 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn, int assoc_id = 0; int txn_id = 0; int affect_rows = 0; - MYSQL_RES *result = NULL; - MYSQL_ROW row; if((pw=getpwuid(uid))) { user = pw->pw_name; @@ -1601,7 +1595,7 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn, extra); xfree(cols); xfree(vals); - + debug3("query\n%s", query); rc = mysql_db_query(mysql_conn->acct_mysql_db, query); xfree(query); if(rc != SLURM_SUCCESS) { @@ -1609,26 +1603,10 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn, xfree(extra); continue; } - affect_rows = _get_affected_rows(mysql_conn->acct_mysql_db); - xstrfmtcat(query, - "select last_insert_id();" - "UNLOCK TABLES;"); - if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, - query))) { - xfree(query); - xfree(extra); - error("can't get last id"); - continue; - } - xfree(query); - row = mysql_fetch_row(result); - if(!row) { - error("nothing returned"); - xfree(extra); - continue; - } - assoc_id = atoi(row[0]); - mysql_free_result(result); + affect_rows = _last_affected_rows(mysql_conn->acct_mysql_db); + assoc_id = mysql_insert_id(mysql_conn->acct_mysql_db); + //info("last id was %d", assoc_id); + mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); object->id = assoc_id; @@ -1692,24 +1670,16 @@ extern int acct_storage_p_add_associations(mysql_conn_t *mysql_conn, if(rc != SLURM_SUCCESS) { error("Couldn't add tnx"); } - xstrfmtcat(query, - "select last_insert_id();" - "UNLOCK TABLES;"); - if(!(result = mysql_db_query_ret(mysql_conn->acct_mysql_db, - query))) { - xfree(query); - error("can't get last id"); - continue; - } - xfree(query); - row = mysql_fetch_row(result); - if(!row) { - error("nothing returned"); - } else - txn_id = atoi(row[0]); - mysql_free_result(result); -// info("got %d %d %d", assoc_id, affect_rows, txn_id); + /* just clear all the results here to get the last + * insert id */ + _last_affected_rows(mysql_conn->acct_mysql_db); + + txn_id = mysql_insert_id(mysql_conn->acct_mysql_db); + //info("last id was %d", assoc_id); + mysql_db_query(mysql_conn->acct_mysql_db, "UNLOCK TABLES;"); + + //info("got %d %d %d", assoc_id, affect_rows, txn_id); if(mysql_conn->rollback) { char *roll = mysql_conn->query; @@ -2365,7 +2335,7 @@ extern List acct_storage_p_modify_associations(mysql_conn_t *mysql_conn, } extern List acct_storage_p_remove_users(mysql_conn_t *mysql_conn, uint32_t uid, - acct_user_cond_t *user_q) + acct_user_cond_t *user_q) { #ifdef HAVE_MYSQL ListIterator itr = NULL; @@ -2676,11 +2646,11 @@ extern List acct_storage_p_remove_clusters(mysql_conn_t *mysql_conn, list_append(ret_list, object); if(!rc) { xstrfmtcat(name_char, "name='%s'", object); - xstrfmtcat(assoc_char, "cluster='%s'", object); + xstrfmtcat(extra, "cluster='%s'", object); rc = 1; } else { xstrfmtcat(name_char, " || name='%s'", object); - xstrfmtcat(assoc_char, " || cluster='%s'", object); + xstrfmtcat(extra, " || cluster='%s'", object); } } mysql_free_result(result); @@ -2690,6 +2660,9 @@ extern List acct_storage_p_remove_clusters(mysql_conn_t *mysql_conn, list_destroy(ret_list); return NULL; } + + assoc_char = xstrdup_printf("acct='root' && (%s)", extra); + xfree(extra); if(_remove_common(mysql_conn, DBD_REMOVE_CLUSTERS, now, user_name, cluster_table, name_char, assoc_char) diff --git a/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c b/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c index ef1108f69f2c8d9e08803e7b2c86c1c6ae55f1fa..0bcf7a95c713214e81a94e67bda875ec64e4903e 100644 --- a/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c +++ b/src/plugins/accounting_storage/pgsql/accounting_storage_pgsql.c @@ -641,8 +641,7 @@ extern int init ( void ) debug2("pgsql_connect() called for db %s", pgsql_db_name); - pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info, - 0); + pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info); rc = _pgsql_acct_check_tables(acct_pgsql_db, pgsql_db_info->user); @@ -678,8 +677,7 @@ extern void *acct_storage_p_get_connection(bool make_agent, bool rollback) debug2("acct_storage_p_get_connection: request new connection"); - pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info, - rollback); + pgsql_get_db_connection(&acct_pgsql_db, pgsql_db_name, pgsql_db_info); return (void *)acct_pgsql_db; #else @@ -690,7 +688,7 @@ extern void *acct_storage_p_get_connection(bool make_agent, bool rollback) extern int acct_storage_p_close_connection(PGconn **acct_pgsql_db) { #ifdef HAVE_PGSQL - pgsql_close_db_connection(acct_pgsql_db, 1); + pgsql_close_db_connection(acct_pgsql_db); return SLURM_SUCCESS; #else @@ -1009,9 +1007,9 @@ extern int jobacct_storage_p_job_start(PGconn *acct_pgsql_db, } if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return SLURM_ERROR; - } } debug2("pgsql_jobacct_job_start() called"); @@ -1067,8 +1065,9 @@ try_again: if(!reinit) { error("It looks like the storage has gone " "away trying to reconnect"); - acct_storage_p_close_connection(&acct_pgsql_db); - acct_pgsql_db = acct_storage_p_get_connection(0); + pgsql_close_db_connection(&acct_pgsql_db); + pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info); reinit = 1; goto try_again; } else @@ -1100,9 +1099,9 @@ extern int jobacct_storage_p_job_complete(PGconn *acct_pgsql_db, } if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return SLURM_ERROR; - } } debug2("pgsql_jobacct_job_complete() called"); @@ -1165,9 +1164,9 @@ extern int jobacct_storage_p_step_start(PGconn *acct_pgsql_db, } if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return SLURM_ERROR; - } } if(slurmdbd_conf) { @@ -1259,9 +1258,9 @@ extern int jobacct_storage_p_step_complete(PGconn *acct_pgsql_db, } if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return SLURM_ERROR; - } } if (jobacct == NULL) { @@ -1385,9 +1384,9 @@ extern int jobacct_storage_p_suspend(PGconn *acct_pgsql_db, int rc = SLURM_SUCCESS; if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return SLURM_ERROR; - } } if(!job_ptr->db_index) { @@ -1434,9 +1433,9 @@ extern List jobacct_storage_p_get_jobs(PGconn *acct_pgsql_db, List job_list = NULL; #ifdef HAVE_PGSQL if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return job_list; - } } job_list = pgsql_jobacct_process_get_jobs(acct_pgsql_db, @@ -1456,9 +1455,9 @@ extern void jobacct_storage_p_archive(PGconn *acct_pgsql_db, { #ifdef HAVE_PGSQL if(!acct_pgsql_db || PQstatus(acct_pgsql_db) != CONNECTION_OK) { - if(!(acct_pgsql_db = acct_storage_p_get_connection(0))) { + if(!pgsql_get_db_connection(&acct_pgsql_db, + pgsql_db_name, pgsql_db_info)) return; - } } pgsql_jobacct_process_archive(acct_pgsql_db, selected_parts, params); diff --git a/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c b/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c index 80030181b8d96676a853d62d85b1a1537fc32706..37c4e53e74ee1bb5bfe179434e78cb8ff228d519 100644 --- a/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c +++ b/src/plugins/jobcomp/pgsql/jobcomp_pgsql.c @@ -307,7 +307,7 @@ extern int slurm_jobcomp_set_location(char *location) debug2("pgsql_connect() called for db %s", db_name); - pgsql_get_db_connection(&jobcomp_pgsql_db, db_name, db_info, 0); + pgsql_get_db_connection(&jobcomp_pgsql_db, db_name, db_info); rc = _pgsql_jobcomp_check_tables(db_info->user); diff --git a/src/sacctmgr/account_functions.c b/src/sacctmgr/account_functions.c index 5bc07ff63306955e77f543544fa50d0e85fa90a7..177aa2cf541a20ebac027395654c55657a724543 100644 --- a/src/sacctmgr/account_functions.c +++ b/src/sacctmgr/account_functions.c @@ -37,56 +37,63 @@ \*****************************************************************************/ #include "sacctmgr.h" +#include "print.h" static int _set_cond(int *start, int argc, char *argv[], acct_account_cond_t *acct_cond, acct_association_cond_t *assoc_cond) { int i; - int set = 0; + int u_set = 0; + int a_set = 0; + int end = 0; for (i=(*start); i<argc; i++) { - if (strncasecmp (argv[i], "Name=", 5) == 0) { - addto_char_list(acct_cond->acct_list, argv[i]+5); - set = 1; - } else if (strncasecmp (argv[i], "Names=", 6) == 0) { - addto_char_list(acct_cond->acct_list, argv[i]+6); - set = 1; - } else if (strncasecmp (argv[i], "Set", 3) == 0) { + end = parse_option_end(argv[i]); + if (strncasecmp (argv[i], "Set", 3) == 0) { i--; break; - } else if (strncasecmp (argv[i], "Descriptions=", 13) == 0) { - addto_char_list(acct_cond->description_list, - argv[i]+13); - set = 1; - } else if (strncasecmp (argv[i], "Organizations=", 14) == 0) { - addto_char_list(acct_cond->organization_list, - argv[i]+14); - set = 1; - } else if (strncasecmp (argv[i], "QosLevel=", 14) == 0) { - acct_cond->qos = - str_2_acct_qos(argv[i]+14); - set = 1; - } else if (strncasecmp (argv[i], "Description=", 12) == 0) { + } else if(!end) { + addto_char_list(acct_cond->acct_list, argv[i]); + addto_char_list(assoc_cond->acct_list, argv[i]); + u_set = 1; + } else if (strncasecmp (argv[i], "Clusters", 1) == 0) { + addto_char_list(assoc_cond->cluster_list, argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "Descriptions", 1) == 0) { addto_char_list(acct_cond->description_list, - argv[i]+12); - set = 1; - } else if (strncasecmp (argv[i], "Organization=", 13) == 0) { + argv[i]+end); + u_set = 1; + } else if (strncasecmp (argv[i], "Names", 1) == 0) { + addto_char_list(acct_cond->acct_list, argv[i]+end); + addto_char_list(assoc_cond->acct_list, argv[i]); + u_set = 1; + } else if (strncasecmp (argv[i], "Organizations", 1) == 0) { addto_char_list(acct_cond->organization_list, - argv[i]+13); - set = 1; - } else if (strncasecmp (argv[i], "Qos=", 8) == 0) { - acct_cond->qos = - str_2_acct_qos(argv[i]+8); - set = 1; + argv[i]+end); + u_set = 1; + } else if (strncasecmp (argv[i], "Parent", 1) == 0) { + assoc_cond->parent_acct = xstrdup(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "QosLevel", 1) == 0) { + acct_cond->qos = str_2_acct_qos(argv[i]+end); + u_set = 1; + } else if (strncasecmp (argv[i], "ShowAssoc", 1) == 0) { + acct_cond->with_assocs = 1; + u_set = 1; } else { - addto_char_list(acct_cond->acct_list, argv[i]); - set = 1; + printf(" Unknown condition: %s", argv[i]); } } (*start) = i; - return set; + if(u_set && a_set) + return 3; + else if(u_set) + return 1; + else if(a_set) + return 2; + return 0; } static int _set_rec(int *start, int argc, char *argv[], @@ -94,37 +101,59 @@ static int _set_rec(int *start, int argc, char *argv[], acct_association_rec_t *assoc) { int i; - int set = 0; + int u_set = 0; + int a_set = 0; + int end = 0; for (i=(*start); i<argc; i++) { - if (strncasecmp (argv[i], "Name=", 5) == 0) { - acct->name = xstrdup(argv[i]+5); - set = 1; - } else if (strncasecmp (argv[i], "Where", 5) == 0) { + end = parse_option_end(argv[i]); + if (strncasecmp (argv[i], "Where", 5) == 0) { i--; break; - }else if (strncasecmp (argv[i], "QosLevel=", 14) == 0) { - acct->qos = - str_2_acct_qos(argv[i]+14); - set = 1; - } else if (strncasecmp (argv[i], "Description=", 12) == 0) { - acct->description = xstrdup(argv[i]+12); - set = 1; - } else if (strncasecmp (argv[i], "Organization=", 13) == 0) { - acct->organization = xstrdup(argv[i]+13); - set = 1; - } else if (strncasecmp (argv[i], "Qos=", 8) == 0) { - acct->qos = - str_2_acct_qos(argv[i]+8); - set = 1; + } else if(!end) { + 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); + u_set = 1; + } else if (strncasecmp (argv[i], "Fairshare", 1) == 0) { + assoc->fairshare = atoi(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "MaxCPUSec", 4) == 0) { + assoc->max_cpu_secs_per_job = + atoi(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "MaxJobs", 4) == 0) { + assoc->max_jobs = atoi(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { + assoc->max_nodes_per_job = atoi(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { + assoc->max_wall_duration_per_job = atoi(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "Organization", 1) == 0) { + acct->organization = xstrdup(argv[i]+end); + u_set = 1; + } else if (strncasecmp (argv[i], "Parent", 1) == 0) { + assoc->parent_acct = xstrdup(argv[i]+end); + a_set = 1; + } else if (strncasecmp (argv[i], "QosLevel=", 1) == 0) { + acct->qos = str_2_acct_qos(argv[i]+end); + u_set = 1; } else { - acct->name = xstrdup(argv[i]+5); - set = 1; + printf(" Unknown option: %s", argv[i]); } } (*start) = i; - return set; + if(u_set && a_set) + return 3; + else if(u_set) + return 1; + else if(a_set) + return 2; + return 0; } static void _print_cond(acct_account_cond_t *acct_cond) @@ -242,12 +271,13 @@ extern int sacctmgr_add_account(int argc, char *argv[]) acct_qos_level_t qos = ACCT_QOS_NOTSET; List acct_list = NULL; List assoc_list = NULL; - uint32_t fairshare = 1; - uint32_t max_jobs = 0; - uint32_t max_nodes_per_job = 0; - uint32_t max_wall_duration_per_job = 0; - uint32_t max_cpu_secs_per_job = 0; + uint32_t fairshare = -1; + uint32_t max_jobs = -1; + uint32_t max_nodes_per_job = -1; + uint32_t max_wall_duration_per_job = -1; + uint32_t max_cpu_secs_per_job = -1; char *acct_str = NULL; + char *assoc_str = NULL; int limit_set = 0; for (i=0; i<argc; i++) { @@ -305,6 +335,7 @@ extern int sacctmgr_add_account(int argc, char *argv[]) while((cluster_rec = list_next(itr_c))) { list_append(cluster_list, xstrdup(cluster_rec->name)); + info("adding to cluster %s", cluster_rec->name); } list_iterator_destroy(itr_c); } else { @@ -340,12 +371,12 @@ extern int sacctmgr_add_account(int argc, char *argv[]) printf(" Need a description for " "these accounts to add.\n"); rc = SLURM_ERROR; - goto end_it; + goto no_required; } else if(!organization) { printf(" Need an organization for " "these accounts to add.\n"); rc = SLURM_ERROR; - goto end_it; + goto no_required; } acct = xmalloc(sizeof(acct_account_rec_t)); acct->assoc_list = list_create(NULL); @@ -398,65 +429,70 @@ extern int sacctmgr_add_account(int argc, char *argv[]) list_append(acct->assoc_list, assoc); else list_append(assoc_list, assoc); + xstrfmtcat(assoc_str, + " A = %s" + "\tC = %s\n", + assoc->acct, + assoc->cluster); + } list_iterator_destroy(itr_c); } -end_it: +no_required: list_iterator_destroy(itr); list_destroy(name_list); list_destroy(cluster_list); + if(!list_count(acct_list) && !list_count(assoc_list)) { + printf(" Nothing new added.\n"); + goto end_it; + } + if(acct_str) { printf(" Adding Account(s)\n%s",acct_str); - printf(" Settings =\n"); - printf(" Description = %s\n", description); - printf(" Organization = %s\n", organization); + printf(" Settings\n"); + printf(" Description = %s\n", description); + printf(" Organization = %s\n", organization); if(qos != ACCT_QOS_NOTSET) - printf(" Qos = %s\n", - acct_qos_str(qos)); + printf(" Qos = %s\n", acct_qos_str(qos)); xfree(acct_str); } - if(list_count(assoc_list)) - printf(" Associations =\n"); - if(acct) - itr = list_iterator_create(acct->assoc_list); - else - itr = list_iterator_create(assoc_list); - while((assoc = list_next(itr))) { - printf(" A = %s" - "\tC = %s\n", - assoc->acct, assoc->cluster); + if(assoc_str) { + printf(" Associations\n%s", assoc_str); + xfree(assoc_str); } - list_iterator_destroy(itr); if(limit_set) { - printf(" Settings =\n"); - if(fairshare) + printf(" Settings\n"); + if((int)fairshare >= 0) printf(" Fairshare = %u\n", fairshare); - if(max_jobs) + if((int)max_cpu_secs_per_job >= 0) + printf(" MaxCPUSecs = %u\n", + max_cpu_secs_per_job); + if((int)max_jobs >= 0) printf(" MaxJobs = %u\n", max_jobs); - if(max_nodes_per_job) + if((int)max_nodes_per_job >= 0) printf(" MaxNodes = %u\n", max_nodes_per_job); - if(max_wall_duration_per_job) + if((int)max_wall_duration_per_job >= 0) printf(" MaxWall = %u\n", max_wall_duration_per_job); - if(max_cpu_secs_per_job) - printf(" MaxCPUSecs = %u\n", - max_cpu_secs_per_job); } - if(!list_count(acct_list) && !list_count(assoc_list)) - printf(" Nothing new added.\n"); - if(list_count(acct_list)) rc = acct_storage_g_add_accounts(db_conn, my_uid, acct_list); - if(rc == SLURM_SUCCESS && list_count(assoc_list)) - rc = acct_storage_g_add_associations(db_conn, my_uid, - assoc_list); + if(rc == SLURM_SUCCESS) { + if(list_count(assoc_list)) + rc = acct_storage_g_add_associations(db_conn, my_uid, + assoc_list); + } else { + printf(" error: Problem adding accounts\n"); + rc = SLURM_ERROR; + goto end_it; + } if(rc == SLURM_SUCCESS) { if(commit_check("Would you like to commit changes?")) { @@ -473,7 +509,12 @@ end_it: } } else acct_storage_g_commit(db_conn, 0); + } else { + printf(" error: Problem adding account associations"); + rc = SLURM_ERROR; } + +end_it: list_destroy(acct_list); list_destroy(assoc_list); @@ -489,61 +530,75 @@ extern int sacctmgr_list_account(int argc, char *argv[]) int rc = SLURM_SUCCESS; acct_account_cond_t *acct_cond = xmalloc(sizeof(acct_account_cond_t)); + acct_association_cond_t *assoc_cond = + xmalloc(sizeof(acct_association_cond_t)); List acct_list; int i=0; ListIterator itr = NULL; acct_account_rec_t *acct = NULL; + print_field_t name_field; + print_field_t desc_field; + print_field_t org_field; + print_field_t qos_field; + List print_fields_list; /* types are of print_field_t */ acct_cond->acct_list = list_create(slurm_destroy_char); acct_cond->description_list = list_create(slurm_destroy_char); acct_cond->organization_list = list_create(slurm_destroy_char); - for (i=0; i<argc; i++) { - int end = parse_option_end(argv[i]); - if (strncasecmp (argv[i], "Names", 1) == 0) { - addto_char_list(acct_cond->acct_list, argv[i]+end); - } else if (strncasecmp (argv[i], "Description", 1) == 0) { - addto_char_list(acct_cond->description_list, - argv[i]+end); - } else if (strncasecmp (argv[i], "Organization", 1) == 0) { - addto_char_list(acct_cond->organization_list, - argv[i]+end); - } else if (strncasecmp (argv[i], "Qoslevel", 1) == 0) { - acct_cond->qos = - str_2_acct_qos(argv[i]+end); - } else { - error("Valid options are 'Names=' " - "'Descriptions=' 'Oranizations=' " - "and 'QosLevel='"); - } - } + assoc_cond->user_list = list_create(slurm_destroy_char); + assoc_cond->acct_list = list_create(slurm_destroy_char); + assoc_cond->cluster_list = list_create(slurm_destroy_char); + assoc_cond->partition_list = list_create(slurm_destroy_char); + + _set_cond(&i, argc, argv, acct_cond, assoc_cond); acct_list = acct_storage_g_get_accounts(db_conn, acct_cond); destroy_acct_account_cond(acct_cond); + destroy_acct_association_cond(assoc_cond); if(!acct_list) return SLURM_ERROR; + print_fields_list = list_create(NULL); + + name_field.name = "Name"; + name_field.len = 10; + name_field.print_routine = print_str; + list_append(print_fields_list, &name_field); + + desc_field.name = "Descr"; + desc_field.len = 10; + desc_field.print_routine = print_str; + list_append(print_fields_list, &desc_field); + + org_field.name = "Org"; + org_field.len = 10; + org_field.print_routine = print_str; + list_append(print_fields_list, &org_field); + + qos_field.name = "QOS"; + qos_field.len = 4; + qos_field.print_routine = print_str; + list_append(print_fields_list, &qos_field); itr = list_iterator_create(acct_list); - printf("%-15s %-15s %-15s %-10s\n%-15s %-15s %-15s %-10s\n", - "Name", "Description", "Organization", "Qos", - "---------------", - "---------------", - "---------------", - "----------"); - + print_header(print_fields_list); + while((acct = list_next(itr))) { - printf("%-15.15s %-15.15s %-15.15s %-10.10s\n", - acct->name, acct->description, - acct->organization, - acct_qos_str(acct->qos)); + print_str(VALUE, &name_field, acct->name); + print_str(VALUE, &desc_field, acct->name); + print_str(VALUE, &org_field, acct->name); + print_str(VALUE, &qos_field, acct->name); + printf("\n"); + /*FIX ME: show assocs */ } printf("\n"); list_iterator_destroy(itr); list_destroy(acct_list); + list_destroy(print_fields_list); return rc; } diff --git a/src/sacctmgr/cluster_functions.c b/src/sacctmgr/cluster_functions.c index f4be913776b78fed9c96ad7b2154c30b9117fa60..1d1afb85d205b120246ad54cef6eb80c7722945c 100644 --- a/src/sacctmgr/cluster_functions.c +++ b/src/sacctmgr/cluster_functions.c @@ -140,104 +140,112 @@ extern int sacctmgr_add_cluster(int argc, char *argv[]) { int rc = SLURM_SUCCESS; int i=0; - acct_cluster_rec_t *cluster = xmalloc(sizeof(acct_cluster_rec_t)); + acct_cluster_rec_t *cluster = NULL; acct_association_rec_t *assoc = NULL; + List name_list = list_create(slurm_destroy_char); List cluster_list = NULL; + uint32_t fairshare = -1; + uint32_t max_jobs = -1; + uint32_t max_nodes_per_job = -1; + uint32_t max_wall_duration_per_job = -1; + uint32_t max_cpu_secs_per_job = -1; int limit_set = 0; + ListIterator itr = NULL; + char *name = NULL; for (i=0; i<argc; i++) { - if (strncasecmp (argv[i], "Name=", 5) == 0) { - if(cluster->name) - error("can only add one cluster at a time.\n"); - else { - cluster->name = xstrdup(argv[i]+5); - } - } else if (strncasecmp (argv[i], "FairShare=", 10) == 0) { - cluster->default_fairshare = atoi(argv[i]+10); + int end = parse_option_end(argv[i]); + if(!end) { + addto_char_list(name_list, argv[i]+end); + } else if (strncasecmp (argv[i], "FairShare", 1) == 0) { + fairshare = atoi(argv[i]+end); limit_set = 1; - } else if (strncasecmp (argv[i], "MaxJobs=", 8) == 0) { - cluster->default_max_jobs = atoi(argv[i]+8); + } else if (strncasecmp (argv[i], "MaxCPUSecs4", 4) == 0) { + max_cpu_secs_per_job = atoi(argv[i]+end); limit_set = 1; - } else if (strncasecmp (argv[i], "MaxNodes=", 9) == 0) { - cluster->default_max_nodes_per_job = atoi(argv[i]+9); + } else if (strncasecmp (argv[i], "MaxJobs=", 4) == 0) { + max_jobs = atoi(argv[i]+end); limit_set = 1; - } else if (strncasecmp (argv[i], "MaxWall=", 8) == 0) { - cluster->default_max_wall_duration_per_job = - atoi(argv[i]+8); + } else if (strncasecmp (argv[i], "MaxNodes", 4) == 0) { + max_nodes_per_job = atoi(argv[i]+end); limit_set = 1; - } else if (strncasecmp (argv[i], "MaxCPUSecs=", 11) == 0) { - cluster->default_max_cpu_secs_per_job = - atoi(argv[i]+11); + } else if (strncasecmp (argv[i], "MaxWall", 4) == 0) { + max_wall_duration_per_job = atoi(argv[i]+end); limit_set = 1; + } else if (strncasecmp (argv[i], "Names", 1) == 0) { + addto_char_list(name_list, argv[i]+end); } else { - if(cluster->name) - error("can only add one cluster at a time.\n"); - else { - cluster->name = xstrdup(argv[i]); - } + printf(" Unknown option: %s", argv[i]); } } - if(!cluster->name) { - destroy_acct_cluster_rec(cluster); + if(!list_count(name_list)) { + list_destroy(name_list); printf(" Need name of cluster to add.\n"); return SLURM_ERROR; - } else if(sacctmgr_find_cluster(cluster->name)) { - destroy_acct_cluster_rec(cluster); - printf(" This cluster already exists. Not adding.\n"); - return SLURM_ERROR; } printf(" Adding Cluster(s)\n"); - printf(" Name = %s\n", cluster->name); - if(limit_set) - printf(" User Defaults =\n"); - if(cluster->default_fairshare <= 0) - cluster->default_fairshare = 1; - else - printf(" Fairshare = %u\n", cluster->default_fairshare); - - if(cluster->default_max_cpu_secs_per_job <= 0) - cluster->default_max_cpu_secs_per_job = -1; - else - printf(" MaxCPUSecs = %u\n", - cluster->default_max_cpu_secs_per_job); - if(cluster->default_max_jobs <= 0) - cluster->default_max_jobs = -1; - else - printf(" MaxJobs = %u\n", cluster->default_max_jobs); - if(cluster->default_max_nodes_per_job <= 0) - cluster->default_max_nodes_per_job = -1; - else - printf(" MaxNodes = %u\n", - cluster->default_max_nodes_per_job); - if(cluster->default_max_wall_duration_per_job <= 0) - cluster->default_max_wall_duration_per_job = -1; - else - printf(" MaxWall = %u\n", - cluster->default_max_wall_duration_per_job); - - cluster_list = list_create(NULL); - list_append(cluster_list, cluster); + cluster_list = list_create(destroy_acct_cluster_rec); + itr = list_iterator_create(name_list); + while((name = list_next(itr))) { + if(sacctmgr_find_cluster(name)) { + printf(" This cluster %salready exists. " + "Not adding.\n", name); + continue; + } + cluster = xmalloc(sizeof(acct_cluster_rec_t)); + cluster->name = xstrdup(name); + list_append(cluster_list, cluster); + + printf(" Name = %s\n", cluster->name); + + cluster->default_fairshare = fairshare; + cluster->default_max_cpu_secs_per_job = max_cpu_secs_per_job; + cluster->default_max_jobs = max_jobs; + cluster->default_max_nodes_per_job = max_nodes_per_job; + cluster->default_max_wall_duration_per_job = + max_wall_duration_per_job; + } + list_iterator_destroy(itr); + list_destroy(name_list); + + if(limit_set) { + printf(" User Defaults\n"); + if((int)fairshare >= 0) + printf(" Fairshare = %u\n", fairshare); + if((int)max_cpu_secs_per_job >= 0) + printf(" MaxCPUSecs = %u\n", + max_cpu_secs_per_job); + if((int)max_jobs >= 0) + printf(" MaxJobs = %u\n", max_jobs); + if((int)max_nodes_per_job >= 0) + printf(" MaxNodes = %u\n", max_nodes_per_job); + if((int)max_wall_duration_per_job >= 0) + printf(" MaxWall = %u\n", + max_wall_duration_per_job); + } rc = acct_storage_g_add_clusters(db_conn, my_uid, cluster_list); if(rc == SLURM_SUCCESS) { if(commit_check("Would you like to commit changes?")) { acct_storage_g_commit(db_conn, 1); - - list_append(sacctmgr_cluster_list, cluster); - assoc = xmalloc(sizeof(acct_association_rec_t)); - list_append(sacctmgr_association_list, assoc); - assoc->acct = xstrdup("root"); - assoc->cluster = xstrdup(cluster->name); - assoc->fairshare = cluster->default_fairshare; - assoc->max_jobs = cluster->default_max_jobs; - assoc->max_nodes_per_job = - cluster->default_max_nodes_per_job; - assoc->max_wall_duration_per_job = - cluster->default_max_wall_duration_per_job; - assoc->max_cpu_secs_per_job = - cluster->default_max_cpu_secs_per_job; + while((cluster = list_pop(cluster_list))) { + list_append(sacctmgr_cluster_list, cluster); + assoc = xmalloc(sizeof(acct_association_rec_t)); + list_append(sacctmgr_association_list, assoc); + assoc->acct = xstrdup("root"); + assoc->cluster = xstrdup(cluster->name); + assoc->fairshare = cluster->default_fairshare; + assoc->max_jobs = cluster->default_max_jobs; + assoc->max_nodes_per_job = + cluster->default_max_nodes_per_job; + assoc->max_wall_duration_per_job = + cluster-> + default_max_wall_duration_per_job; + assoc->max_cpu_secs_per_job = + cluster->default_max_cpu_secs_per_job; + } } else acct_storage_g_commit(db_conn, 0); } else { @@ -262,15 +270,13 @@ extern int sacctmgr_list_cluster(int argc, char *argv[]) List print_fields_list; /* types are of print_field_t */ cluster_cond->cluster_list = list_create(slurm_destroy_char); - for (i=0; i<argc; i++) { - if (strncasecmp (argv[i], "Name=", 5) == 0) { - addto_char_list(cluster_cond->cluster_list, argv[i]+5); - } else if (strncasecmp (argv[i], "Names=", 6) == 0) { - addto_char_list(cluster_cond->cluster_list, argv[i]+6); - } else { - error("Only 'Names=' is supported as an option"); - } - } + _set_cond(&i, argc, argv, cluster_cond); + + cluster_list = acct_storage_g_get_clusters(db_conn, cluster_cond); + destroy_acct_cluster_cond(cluster_cond); + + if(!cluster_list) + return SLURM_ERROR; print_fields_list = list_create(NULL); @@ -282,15 +288,7 @@ extern int sacctmgr_list_cluster(int argc, char *argv[]) /* fs_field.name = "FS"; */ /* fs_field.len = 4; */ /* fs_field.print_routine = print_str; */ -/* list_append(print_fields_list, &fs_field); */ - - cluster_list = acct_storage_g_get_clusters(db_conn, cluster_cond); - destroy_acct_cluster_cond(cluster_cond); - - if(!cluster_list) - return SLURM_ERROR; - - +/* list_append(print_fields_list, &fs_field); */ itr = list_iterator_create(cluster_list); print_header(print_fields_list); @@ -356,7 +354,7 @@ extern int sacctmgr_modify_cluster(int argc, char *argv[]) if(rec_set) printf(" User Defaults =\n"); if((int)cluster->default_fairshare <= 0) - cluster->default_fairshare = 1; + cluster->default_fairshare = -1; else printf(" Fairshare = %u\n", cluster->default_fairshare); diff --git a/src/sacctmgr/sacctmgr.c b/src/sacctmgr/sacctmgr.c index 588dea38e3ee8afc62bcd4257a04908f9cf24f26..60c925b7a54ddc02bcd7a3704544df5b25304f7f 100644 --- a/src/sacctmgr/sacctmgr.c +++ b/src/sacctmgr/sacctmgr.c @@ -309,35 +309,6 @@ _process_command (int argc, char *argv[]) } else if (strncasecmp (argv[0], "all", 3) == 0) { all_flag = 1; } else if (strncasecmp (argv[0], "exit", 1) == 0) { - if (argc > 1) { - exit_code = 1; - fprintf (stderr, - "too many arguments for keyword:%s\n", - argv[0]); - } - //_close_db(); - -/* if(list_count(sacctmgr_action_list) > 0) { */ -/* _close_db(); */ -/* char tmp_char[255]; */ - -/* snprintf(tmp_char, sizeof(tmp_char), */ -/* "There are %d action(s) that haven't been " */ -/* "committed yet, would you like to commit " */ -/* "before exit?", */ -/* list_count(sacctmgr_action_list)); */ -/* if(commit_check(tmp_char)) */ -/* acct_storage_g_close_connection(&db_conn, 1); */ -/* else { */ -/* acct_storage_g_close_connection(&db_conn, 0); */ -/* printf("Changes discarded.\n"); */ -/* } */ -/* list_destroy(sacctmgr_action_list); */ -/* sacctmgr_action_list = NULL; */ -/* } else { */ -/* list_destroy(sacctmgr_action_list); */ -/* sacctmgr_action_list = NULL; */ -/* } */ exit_flag = 1; } else if (strncasecmp (argv[0], "help", 2) == 0) { if (argc > 1) { @@ -381,6 +352,15 @@ _process_command (int argc, char *argv[]) argv[0]); } _add_it((argc - 1), &argv[1]); + } else if (strncasecmp (argv[0], "create", 3) == 0) { + if (argc < 2) { + exit_code = 1; + if (quiet_flag != 1) + fprintf(stderr, + "too few arguments for keyword:%s\n", + argv[0]); + } + _add_it((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "show", 3) == 0 || strncasecmp (argv[0], "list", 3) == 0) { if (argc < 2) { @@ -407,6 +387,14 @@ _process_command (int argc, char *argv[]) return 0; } _delete_it((argc - 1), &argv[1]); + } else if (strncasecmp (argv[0], "remove", 3) == 0) { + if (argc < 2) { + exit_code = 1; + fprintf (stderr, "too few arguments for %s keyword\n", + argv[0]); + return 0; + } + _delete_it((argc - 1), &argv[1]); } else if (strncasecmp (argv[0], "verbose", 4) == 0) { if (argc > 1) { exit_code = 1; @@ -442,18 +430,18 @@ static void _add_it (int argc, char *argv[]) sacctmgr_init(); /* First identify the entity to add */ - if (strncasecmp (argv[0], "User", 4) == 0) { + if (strncasecmp (argv[0], "User", 1) == 0) { error_code = sacctmgr_add_user((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Account", 7) == 0) { + } else if (strncasecmp (argv[0], "Account", 1) == 0) { error_code = sacctmgr_add_account((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Cluster", 7) == 0) { + } else if (strncasecmp (argv[0], "Cluster", 1) == 0) { error_code = sacctmgr_add_cluster((argc - 1), &argv[1]); } else { exit_code = 1; fprintf(stderr, "No valid entity in add command\n"); - fprintf(stderr, "Input line must include \"Association\", "); - fprintf(stderr, "\"UserName\", \"AccountName\", "); - fprintf(stderr, "or \"ClusterName\"\n"); + fprintf(stderr, "Input line must include, "); + fprintf(stderr, "\"User\", \"Account\", "); + fprintf(stderr, "or \"Cluster\"\n"); } if (error_code) { @@ -471,11 +459,11 @@ static void _show_it (int argc, char *argv[]) int error_code = SLURM_SUCCESS; /* First identify the entity to list */ - if (strncasecmp (argv[0], "User", 4) == 0) { + if (strncasecmp (argv[0], "User", 1) == 0) { error_code = sacctmgr_list_user((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Account", 7) == 0) { + } else if (strncasecmp (argv[0], "Account", 1) == 0) { error_code = sacctmgr_list_account((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Cluster", 7) == 0) { + } else if (strncasecmp (argv[0], "Cluster", 1) == 0) { error_code = sacctmgr_list_cluster((argc - 1), &argv[1]); } else { exit_code = 1; @@ -503,11 +491,11 @@ static void _modify_it (int argc, char *argv[]) sacctmgr_init(); /* First identify the entity to modify */ - if (strncasecmp (argv[0], "User", 4) == 0) { + if (strncasecmp (argv[0], "User", 1) == 0) { error_code = sacctmgr_modify_user((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Account", 7) == 0) { + } else if (strncasecmp (argv[0], "Account", 1) == 0) { error_code = sacctmgr_modify_account((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Cluster", 7) == 0) { + } else if (strncasecmp (argv[0], "Cluster", 1) == 0) { error_code = sacctmgr_modify_cluster((argc - 1), &argv[1]); } else { exit_code = 1; @@ -534,11 +522,11 @@ static void _delete_it (int argc, char *argv[]) sacctmgr_init(); /* First identify the entity to delete */ - if (strncasecmp (argv[0], "User", 4) == 0) { + if (strncasecmp (argv[0], "User", 1) == 0) { error_code = sacctmgr_delete_user((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Account", 7) == 0) { + } else if (strncasecmp (argv[0], "Account", 1) == 0) { error_code = sacctmgr_delete_account((argc - 1), &argv[1]); - } else if (strncasecmp (argv[0], "Cluster", 7) == 0) { + } else if (strncasecmp (argv[0], "Cluster", 1) == 0) { error_code = sacctmgr_delete_cluster((argc - 1), &argv[1]); } else { exit_code = 1; @@ -615,7 +603,7 @@ sacctmgr [<OPTION>] [<COMMAND>] \n\ MaxCPUSecs=, MaxJobs=, MaxNodes=, MaxWall=, \n\ Organization=, Parent=, and QosLevel= \n\ (where options) Clusters=, Descriptions=, \n\ - Names=, Organizations=, and Parents= \n\ + Names=, Organizations=, Parent=, and QosLevel= \n\ delete account - Clusters=, Descriptions=, Names=, \n\ Organizations=, and Parents= \n\ \n\ diff --git a/src/sacctmgr/user_functions.c b/src/sacctmgr/user_functions.c index 88c28200ba2af1667122942a8d78eb10bc6f7562..af1ae01807d9590f3178aef1e9f090873f12237e 100644 --- a/src/sacctmgr/user_functions.c +++ b/src/sacctmgr/user_functions.c @@ -37,6 +37,7 @@ \*****************************************************************************/ #include "sacctmgr.h" +#include "print.h" static int _set_cond(int *start, int argc, char *argv[], acct_user_cond_t *user_cond, @@ -549,13 +550,17 @@ no_default: list_iterator_destroy(itr); destroy_acct_association_cond(assoc_cond); + if(!list_count(user_list) && !list_count(assoc_list)) { + printf(" Nothing new added.\n"); + goto end_it; + } + if(user_str) { printf(" Adding User(s)\n%s", user_str); printf(" Settings =\n"); printf(" Default Account = %s\n", default_acct); if(qos != ACCT_QOS_NOTSET) - printf(" Qos = %s\n", - acct_qos_str(qos)); + printf(" Qos = %s\n", acct_qos_str(qos)); if(admin_level != ACCT_ADMIN_NOTSET) printf(" Admin Level = %s\n", @@ -569,9 +574,12 @@ no_default: } if(limit_set) { - printf(" Non Default Settings =\n"); + printf(" Non Default Settings\n"); if((int)fairshare >= 0) printf(" Fairshare = %u\n", fairshare); + if((int)max_cpu_secs_per_job >= 0) + printf(" MaxCPUSecs = %u\n", + max_cpu_secs_per_job); if((int)max_jobs >= 0) printf(" MaxJobs = %u\n", max_jobs); if((int)max_nodes_per_job >= 0) @@ -579,14 +587,6 @@ no_default: if((int)max_wall_duration_per_job >= 0) printf(" MaxWall = %u\n", max_wall_duration_per_job); - if((int)max_cpu_secs_per_job >= 0) - printf(" MaxCPUSecs = %u\n", - max_cpu_secs_per_job); - } - - if(!list_count(user_list) && !list_count(assoc_list)) { - printf(" Nothing new added.\n"); - goto end_it; } if(list_count(user_list)) {