diff --git a/src/common/slurm_acct_gather.c b/src/common/slurm_acct_gather.c index 01fb76bd3e052ac64333665e4b63bdad48f503fe..bb69461f11504f28188c5a8ad7fa0c5647c8408a 100644 --- a/src/common/slurm_acct_gather.c +++ b/src/common/slurm_acct_gather.c @@ -36,12 +36,30 @@ \*****************************************************************************/ #include <sys/stat.h> +#include <stdlib.h> -#include "slurm_acct_gather.h" -#include "xstring.h" +#include "src/common/slurm_acct_gather.h" +#include "src/common/slurm_strcasestr.h" +#include "src/common/xstring.h" static bool inited = 0; +static int _get_int(const char *my_str) +{ + char *end = NULL; + int value; + + if (!my_str) + return -1; + value = strtol(my_str, &end, 10); + //info("from %s I get %d and %s: %m", my_str, value, end); + /* means no numbers */ + if (my_str == end) + return -1; + + return value; +} + extern int acct_gather_conf_init(void) { s_p_hashtbl_t *tbl = NULL; @@ -109,3 +127,42 @@ extern int acct_gather_conf_destroy(void) return SLURM_SUCCESS; } + +extern int acct_gather_parse_freq(int type, char *freq) +{ + int freq_int = -1; + char *sub_str = NULL; + + if (!freq) + return freq_int; + + switch (type) { + case PROFILE_ENERGY: + if ((sub_str = slurm_strcasestr(freq, "energy="))) + freq_int = _get_int(sub_str + 7); + break; + case PROFILE_TASK: + /* backwards compatibility for when the freq was only + for task. + */ + freq_int = _get_int(freq); + if ((freq_int == -1) + && (sub_str = slurm_strcasestr(freq, "task="))) + freq_int = _get_int(sub_str + 5); + break; + case PROFILE_FILESYSTEM: + if ((sub_str = slurm_strcasestr(freq, "filesystem="))) + freq_int = _get_int(sub_str + 11); + break; + case PROFILE_NETWORK: + if ((sub_str = slurm_strcasestr(freq, "network="))) + freq_int = _get_int(sub_str + 8); + break; + default: + fatal("Unhandled profile option %d please update " + "slurm_acct_gather.c " + "(acct_gather_parse_freq)", type); + } + + return freq_int; +} diff --git a/src/common/slurm_acct_gather.h b/src/common/slurm_acct_gather.h index 54e40165e761c1f86851972a9b2392180b8e37ae..b99617d009c644b9557059d10ed1b72be5fd6b83 100644 --- a/src/common/slurm_acct_gather.h +++ b/src/common/slurm_acct_gather.h @@ -59,5 +59,6 @@ extern int acct_gather_conf_init(void); extern int acct_gather_conf_destroy(void); +extern int acct_gather_parse_freq(int type, char *freq); #endif diff --git a/src/common/slurm_acct_gather_profile.c b/src/common/slurm_acct_gather_profile.c index 1513061fc3089a958e45fb7933a037629629d0fa..2932a3852999a4b435aff9d1ee2de730c9967bae 100644 --- a/src/common/slurm_acct_gather_profile.c +++ b/src/common/slurm_acct_gather_profile.c @@ -95,20 +95,13 @@ static pthread_mutex_t profile_mutex = PTHREAD_MUTEX_INITIALIZER; static pthread_t timer_thread_id = 0; static bool init_run = false; -static int _get_int(const char *my_str) +static void _set_freq(int type, char *freq, char *freq_def) { - char *end = NULL; - int value; - - if (!my_str) - return -1; - value = strtol(my_str, &end, 10); - //info("from %s I get %d and %s: %m", my_str, value, end); - /* means no numbers */ - if (my_str == end) - return -1; - - return value; + if ((acct_gather_profile_timer[type].freq = + acct_gather_parse_freq(type, freq)) == -1) + if ((acct_gather_profile_timer[type].freq = + acct_gather_parse_freq(type, freq_def)) == -1) + acct_gather_profile_timer[type].freq = 0; } static void *_timer_thread(void *args) @@ -308,8 +301,6 @@ extern int acct_gather_profile_startpoll(char *freq, char *freq_def) xassert(profile != ACCT_GATHER_PROFILE_NOT_SET); for (i=0; i < PROFILE_CNT; i++) { - char *type = NULL; - memset(&acct_gather_profile_timer[i], 0, sizeof(acct_gather_profile_timer_t)); pthread_cond_init(&acct_gather_profile_timer[i].notify, NULL); @@ -319,13 +310,8 @@ extern int acct_gather_profile_startpoll(char *freq, char *freq_def) case PROFILE_ENERGY: if (!(profile & ACCT_GATHER_PROFILE_ENERGY)) break; - if (freq && (type = slurm_strcasestr(freq, "energy="))) - acct_gather_profile_timer[i].freq = - _get_int(type+7); - else if (freq_def && (type = slurm_strcasestr( - freq_def, "energy="))) - acct_gather_profile_timer[i].freq = - _get_int(type+7); + _set_freq(i, freq, freq_def); + acct_gather_energy_startpoll( acct_gather_profile_timer[i].freq); break; @@ -335,23 +321,8 @@ extern int acct_gather_profile_startpoll(char *freq, char *freq_def) consumption and such. It will check profile inside it's plugin. */ - acct_gather_profile_timer[i].freq = _get_int(freq); - if (acct_gather_profile_timer[i].freq == -1) { - if (freq && (type = slurm_strcasestr( - freq, "task="))) - acct_gather_profile_timer[i].freq = - _get_int(type+5); - else if (freq_def) { - acct_gather_profile_timer[i].freq = - _get_int(freq_def); - if ((acct_gather_profile_timer[i].freq - == -1) - && (type = slurm_strcasestr( - freq_def, "task="))) - acct_gather_profile_timer[i]. - freq = _get_int(type+5); - } - } + _set_freq(i, freq, freq_def); + jobacct_gather_startpoll( acct_gather_profile_timer[i].freq); @@ -359,27 +330,16 @@ extern int acct_gather_profile_startpoll(char *freq, char *freq_def) case PROFILE_FILESYSTEM: if (!(profile & ACCT_GATHER_PROFILE_LUSTRE)) break; - if (freq && (type = slurm_strcasestr( - freq, "filesystem="))) - acct_gather_profile_timer[i].freq = - _get_int(type+11); - else if (freq_def && (type = slurm_strcasestr( - freq_def, "filesystem="))) - acct_gather_profile_timer[i].freq = - _get_int(type+11); + _set_freq(i, freq, freq_def); + acct_gather_filesystem_startpoll( acct_gather_profile_timer[i].freq); break; case PROFILE_NETWORK: if (!(profile & ACCT_GATHER_PROFILE_NETWORK)) break; - if (freq && (type = slurm_strcasestr(freq, "network="))) - acct_gather_profile_timer[i].freq = - _get_int(type+8); - else if (freq_def && (type = slurm_strcasestr( - freq_def, "network="))) - acct_gather_profile_timer[i].freq = - _get_int(type+8); + _set_freq(i, freq, freq_def); + acct_gather_infiniband_startpoll( acct_gather_profile_timer[i].freq); break;