From 2649012f18952e9f9e063871cb0437acd90bc468 Mon Sep 17 00:00:00 2001 From: Danny Auble <da@schedmd.com> Date: Tue, 26 May 2015 10:16:58 -0700 Subject: [PATCH] Limit the amount of time the as_mysql_cluster_list_lock is locked when 'sacctmgr archive dump' is ran. --- .../mysql/as_mysql_archive.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/plugins/accounting_storage/mysql/as_mysql_archive.c b/src/plugins/accounting_storage/mysql/as_mysql_archive.c index 93213cb75f6..844093f22a9 100644 --- a/src/plugins/accounting_storage/mysql/as_mysql_archive.c +++ b/src/plugins/accounting_storage/mysql/as_mysql_archive.c @@ -2518,7 +2518,7 @@ extern int as_mysql_jobacct_process_archive(mysql_conn_t *mysql_conn, { int rc = SLURM_SUCCESS; char *cluster_name = NULL; - List use_cluster_list = as_mysql_cluster_list; + List use_cluster_list; ListIterator itr = NULL; // DEF_TIMERS; @@ -2531,8 +2531,20 @@ extern int as_mysql_jobacct_process_archive(mysql_conn_t *mysql_conn, if (arch_cond->job_cond && arch_cond->job_cond->cluster_list && list_count(arch_cond->job_cond->cluster_list)) use_cluster_list = arch_cond->job_cond->cluster_list; - else + else { + /* execute_archive may take a long time to run, so + * don't keep the as_mysql_cluster_list_lock locked + * the whole time, just copy the list and work off + * that. + */ + use_cluster_list = list_create(slurm_destroy_char); slurm_mutex_lock(&as_mysql_cluster_list_lock); + itr = list_iterator_create(as_mysql_cluster_list); + while ((cluster_name = list_next(itr))) + list_append(use_cluster_list, xstrdup(cluster_name)); + list_iterator_destroy(itr); + slurm_mutex_unlock(&as_mysql_cluster_list_lock); + } itr = list_iterator_create(use_cluster_list); while ((cluster_name = list_next(itr))) { @@ -2542,8 +2554,8 @@ extern int as_mysql_jobacct_process_archive(mysql_conn_t *mysql_conn, } list_iterator_destroy(itr); - if (use_cluster_list == as_mysql_cluster_list) - slurm_mutex_unlock(&as_mysql_cluster_list_lock); + if (use_cluster_list != arch_cond->job_cond->cluster_list) + FREE_NULL_LIST(use_cluster_list); return rc; } -- GitLab