diff --git a/src/common/gres.c b/src/common/gres.c index b47a3bc67a5a30d60a015b52b1a3415501b585bc..043756683baebd62c57068635a433a14ae458239 100644 --- a/src/common/gres.c +++ b/src/common/gres.c @@ -124,6 +124,7 @@ static slurm_gres_context_t *gres_context = NULL; static char *gres_plugin_list = NULL; static pthread_mutex_t gres_context_lock = PTHREAD_MUTEX_INITIALIZER; static List gres_conf_list = NULL; +static bool init_run = false; /* Local functions */ static gres_node_state_t * @@ -338,7 +339,7 @@ extern int gres_plugin_init(void) int i, j, rc = SLURM_SUCCESS; char *last = NULL, *names, *one_name, *full_name; - if (gres_context_cnt >= 0) + if (init_run && (gres_context_cnt >= 0)) return rc; slurm_mutex_lock(&gres_context_lock); @@ -406,6 +407,7 @@ extern int gres_plugin_init(void) gres_context[i].gres_name_colon_len = strlen(gres_context[i].gres_name_colon); } + init_run = true; fini: slurm_mutex_unlock(&gres_context_lock); return rc; @@ -424,6 +426,7 @@ extern int gres_plugin_fini(void) if (gres_context_cnt < 0) goto fini; + init_run = false; for (i=0; i<gres_context_cnt; i++) { j = _unload_gres_plugin(gres_context + i); if (j != SLURM_SUCCESS) diff --git a/src/common/mpi.c b/src/common/mpi.c index d5c2d6054e2746abf600ba48a09e5d1b05cbbd0c..699d3437239d60e3f8c0a82cc4eeb610279a6130 100644 --- a/src/common/mpi.c +++ b/src/common/mpi.c @@ -79,6 +79,7 @@ struct slurm_mpi_context { static slurm_mpi_context_t g_context = NULL; static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; static slurm_mpi_context_t _slurm_mpi_context_create(const char *mpi_type) @@ -211,7 +212,7 @@ int _mpi_init (char *mpi_type) char *full_type = NULL; int got_default = 0; - if ( g_context ) + if ( init_run && g_context ) return retval; slurm_mutex_lock( &context_lock ); @@ -247,7 +248,7 @@ int _mpi_init (char *mpi_type) g_context = NULL; retval = SLURM_ERROR; } - + init_run = true; done: if(got_default) @@ -335,6 +336,7 @@ int mpi_fini (void) if (!g_context) return SLURM_SUCCESS; + init_run = false; rc = _slurm_mpi_context_destroy(g_context); return rc; } diff --git a/src/common/node_select.c b/src/common/node_select.c index 6e31d669a720c4c13ad3d976f2af20c13dc76211..1321f12193674996ad2a4034159723d5c9122443 100644 --- a/src/common/node_select.c +++ b/src/common/node_select.c @@ -66,6 +66,7 @@ static int select_context_default = -1; static slurm_select_context_t * select_context = NULL; static pthread_mutex_t select_context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; /* * Locate and load the appropriate plugin @@ -282,7 +283,7 @@ extern int slurm_select_init(bool only_default) struct dirent *e; char *dir_array = NULL, *head = NULL; - if ( select_context ) + if ( init_run && select_context ) return retval; slurm_mutex_lock( &select_context_lock ); @@ -453,6 +454,7 @@ skip_load_all: } } + init_run = true; done: slurm_mutex_unlock( &select_context_lock ); @@ -469,6 +471,7 @@ extern int slurm_select_fini(void) if (!select_context) goto fini; + init_run = false; for (i=0; i<select_context_cnt; i++) { j = _select_context_destroy(select_context + i); if (j != SLURM_SUCCESS) diff --git a/src/common/slurm_accounting_storage.c b/src/common/slurm_accounting_storage.c index 056c185a473eb37cce14571d18fbe0634eb8d391..575edb6e0ae05f5cc57edd512d4acbc76d541830 100644 --- a/src/common/slurm_accounting_storage.c +++ b/src/common/slurm_accounting_storage.c @@ -201,6 +201,7 @@ typedef struct slurm_acct_storage_context { static slurm_acct_storage_context_t * g_acct_storage_context = NULL; static pthread_mutex_t g_acct_storage_context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; /* * Local functions @@ -388,7 +389,7 @@ extern int slurm_acct_storage_init(char *loc) int retval = SLURM_SUCCESS; char *acct_storage_type = NULL; - if ( g_acct_storage_context ) + if ( init_run && g_acct_storage_context ) return retval; slurm_mutex_lock( &g_acct_storage_context_lock ); @@ -414,7 +415,8 @@ extern int slurm_acct_storage_init(char *loc) _acct_storage_context_destroy( g_acct_storage_context ); g_acct_storage_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: slurm_mutex_unlock( &g_acct_storage_context_lock ); @@ -429,6 +431,7 @@ extern int slurm_acct_storage_fini(void) if (!g_acct_storage_context) return SLURM_SUCCESS; + init_run = false; // (*(g_acct_storage_context->ops.acct_storage_fini))(); rc = _acct_storage_context_destroy( g_acct_storage_context ); g_acct_storage_context = NULL; diff --git a/src/common/slurm_auth.c b/src/common/slurm_auth.c index 652127f44305cab5f61fff6e4bdc9bc71c606a20..12ad31e8dfeee9477e35bb13e483418a117b4901 100644 --- a/src/common/slurm_auth.c +++ b/src/common/slurm_auth.c @@ -106,6 +106,7 @@ struct slurm_auth_context { */ static slurm_auth_context_t g_context = NULL; static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; /* * Order of advisory arguments passed to some of the plugins. @@ -315,7 +316,7 @@ extern int slurm_auth_init( char *auth_type ) int retval = SLURM_SUCCESS; char *auth_type_local = NULL; - if ( g_context ) + if ( init_run && g_context ) return retval; slurm_mutex_lock( &context_lock ); @@ -346,7 +347,8 @@ extern int slurm_auth_init( char *auth_type ) _slurm_auth_context_destroy( g_context ); g_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: xfree(auth_type_local); @@ -363,6 +365,7 @@ slurm_auth_fini( void ) if ( !g_context ) return SLURM_SUCCESS; + init_run = false; rc = _slurm_auth_context_destroy( g_context ); g_context = NULL; return rc; diff --git a/src/common/slurm_jobacct_gather.c b/src/common/slurm_jobacct_gather.c index 3c07c1540533d4f4d97e8cefd8e6840a653f8369..b927c9c937d94f95086a213afbe03be534a4ee70 100644 --- a/src/common/slurm_jobacct_gather.c +++ b/src/common/slurm_jobacct_gather.c @@ -107,6 +107,7 @@ typedef struct slurm_jobacct_gather_context { static slurm_jobacct_gather_context_t *g_jobacct_gather_context = NULL; static pthread_mutex_t g_jobacct_gather_context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; static int _slurm_jobacct_gather_init(void); @@ -258,7 +259,7 @@ static int _slurm_jobacct_gather_init(void) char *jobacct_gather_type = NULL; int retval=SLURM_SUCCESS; - if ( g_jobacct_gather_context ) + if (init_run && g_jobacct_gather_context ) return(retval); slurm_mutex_lock( &g_jobacct_gather_context_lock ); @@ -281,7 +282,8 @@ static int _slurm_jobacct_gather_init(void) g_jobacct_gather_context); g_jobacct_gather_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: slurm_mutex_unlock( &g_jobacct_gather_context_lock ); @@ -304,6 +306,7 @@ extern int slurm_jobacct_gather_fini(void) slurm_mutex_lock( &g_jobacct_gather_context_lock ); if (g_jobacct_gather_context) { + init_run = false; rc = _slurm_jobacct_gather_context_destroy( g_jobacct_gather_context); g_jobacct_gather_context = NULL; diff --git a/src/common/slurm_priority.c b/src/common/slurm_priority.c index a86432541f575313f9232e3e6a6a7b678045af59..8a7579917ef8b1baaf158940d19a32b9df84c3a2 100644 --- a/src/common/slurm_priority.c +++ b/src/common/slurm_priority.c @@ -63,6 +63,7 @@ typedef struct slurm_priority_context { static slurm_priority_context_t * g_priority_context = NULL; static pthread_mutex_t g_priority_context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; /* * Local functions @@ -198,7 +199,7 @@ extern int slurm_priority_init(void) int retval = SLURM_SUCCESS; char *priority_type = NULL; - if ( g_priority_context ) + if ( init_run && g_priority_context ) return retval; slurm_mutex_lock( &g_priority_context_lock ); @@ -221,7 +222,8 @@ extern int slurm_priority_init(void) _priority_context_destroy( g_priority_context ); g_priority_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: slurm_mutex_unlock( &g_priority_context_lock ); @@ -236,6 +238,7 @@ extern int slurm_priority_fini(void) if (!g_priority_context) return SLURM_SUCCESS; + init_run = false; rc = _priority_context_destroy( g_priority_context ); g_priority_context = NULL; return rc; diff --git a/src/common/slurm_topology.c b/src/common/slurm_topology.c index 8d4a265159e3c5d66bb47536407fade7f206c27f..3229fa2bb2c21b8f84fd4861c98ef6ad225396b1 100644 --- a/src/common/slurm_topology.c +++ b/src/common/slurm_topology.c @@ -75,7 +75,7 @@ typedef struct slurm_topo_context { static slurm_topo_context_t *g_topo_context = NULL; static pthread_mutex_t g_topo_context_lock = PTHREAD_MUTEX_INITIALIZER; - +static bool init_run = false; /* ************************************************************************ */ /* TAG( slurm_topo_get_ops ) */ @@ -207,7 +207,7 @@ slurm_topo_init( void ) int retval = SLURM_SUCCESS; char *topo_type = NULL; - if ( g_topo_context ) + if ( init_run && g_topo_context ) return retval; slurm_mutex_lock( &g_topo_context_lock ); @@ -229,7 +229,8 @@ slurm_topo_init( void ) slurm_topo_context_destroy( g_topo_context ); g_topo_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: slurm_mutex_unlock( &g_topo_context_lock ); @@ -248,6 +249,7 @@ slurm_topo_fini( void ) if (!g_topo_context) return SLURM_SUCCESS; + init_run = false; rc = slurm_topo_context_destroy(g_topo_context); g_topo_context = NULL; return rc; diff --git a/src/common/switch.c b/src/common/switch.c index 5a8ac8b16e840ad3fefac52b3564286d50e763ce..2d4fb845484c539e8a9d7e423b869991e4a0188e 100644 --- a/src/common/switch.c +++ b/src/common/switch.c @@ -127,7 +127,7 @@ struct slurm_switch_context { static slurm_switch_context_t *g_context = NULL; static pthread_mutex_t context_lock = PTHREAD_MUTEX_INITIALIZER; - +static bool init_run = false; static slurm_switch_context_t * _slurm_switch_context_create(const char *switch_type) @@ -288,7 +288,7 @@ extern int switch_init( void ) int retval = SLURM_SUCCESS; char *switch_type = NULL; - if ( g_context ) + if ( init_run && g_context ) return retval; slurm_mutex_lock( &context_lock ); @@ -309,7 +309,8 @@ extern int switch_init( void ) _slurm_switch_context_destroy( g_context ); g_context = NULL; retval = SLURM_ERROR; - } + } else + init_run = true; done: slurm_mutex_unlock( &context_lock ); @@ -324,6 +325,7 @@ extern int switch_fini(void) if (!g_context) return SLURM_SUCCESS; + init_run = false; rc = _slurm_switch_context_destroy(g_context); return rc; } diff --git a/src/slurmctld/job_submit.c b/src/slurmctld/job_submit.c index 56c3e3b1467e1989501884ce7e5948d7562a0064..2def3b5dce0921f80ff810cd9f542977498d66da 100644 --- a/src/slurmctld/job_submit.c +++ b/src/slurmctld/job_submit.c @@ -93,6 +93,7 @@ static int submit_context_cnt = -1; static slurm_submit_context_t *submit_context = NULL; static char *submit_plugin_list = NULL; static pthread_mutex_t submit_context_lock = PTHREAD_MUTEX_INITIALIZER; +static bool init_run = false; static int _load_submit_plugin(char *plugin_name, slurm_submit_context_t *plugin_context) @@ -196,7 +197,7 @@ extern int job_submit_plugin_init(void) int rc = SLURM_SUCCESS; char *last = NULL, *names, *one_name; - if (submit_context_cnt >= 0) + if (init_run && (submit_context_cnt >= 0)) return rc; slurm_mutex_lock(&submit_context_lock); @@ -222,6 +223,7 @@ extern int job_submit_plugin_init(void) one_name = strtok_r(NULL, ",", &last); } xfree(names); + init_run = true; fini: slurm_mutex_unlock(&submit_context_lock); return rc; @@ -240,6 +242,7 @@ extern int job_submit_plugin_fini(void) if (submit_context_cnt < 0) goto fini; + init_run = false; for (i=0; i<submit_context_cnt; i++) { j = _unload_submit_plugin(submit_context + i); if (j != SLURM_SUCCESS) diff --git a/src/slurmctld/sched_plugin.c b/src/slurmctld/sched_plugin.c index 5b1229109b4594ae8ff38b3ab6e26adcd61346c2..d508ed017ef1b06406d8f791750b78b511234af6 100644 --- a/src/slurmctld/sched_plugin.c +++ b/src/slurmctld/sched_plugin.c @@ -83,7 +83,7 @@ typedef struct slurm_sched_context { static slurm_sched_context_t *g_sched_context = NULL; static pthread_mutex_t g_sched_context_lock = PTHREAD_MUTEX_INITIALIZER; - +static bool init_run = false; /* ************************************************************************ */ /* TAG( slurm_sched_get_ops ) */ @@ -225,7 +225,7 @@ slurm_sched_init( void ) int retval = SLURM_SUCCESS; char *sched_type = NULL; - if ( g_sched_context ) + if ( init_run && g_sched_context ) return retval; slurm_mutex_lock( &g_sched_context_lock ); @@ -253,6 +253,7 @@ slurm_sched_init( void ) if ( (slurm_get_preempt_mode() & PREEMPT_MODE_GANG) && (gs_init() != SLURM_SUCCESS)) error( "cannot start gang scheduler "); + init_run = true; done: slurm_mutex_unlock( &g_sched_context_lock ); @@ -271,6 +272,7 @@ slurm_sched_fini( void ) if (!g_sched_context) return SLURM_SUCCESS; + init_run = false; rc = slurm_sched_context_destroy(g_sched_context); g_sched_context = NULL;