/* Load and process BurstBufferParameters configuration parameter */ static void _load_config(void) { s_p_hashtbl_t *bb_hashtbl = NULL; char *bb_conf, *tmp = NULL, *value; static s_p_options_t bb_options[] = { {"AllowUsers", S_P_STRING}, {"DenyUsers", S_P_STRING}, {"GetSysState", S_P_STRING}, {"JobSizeLimit", S_P_STRING}, {"StagedInPrioBoost", S_P_UINT32}, {"StartStageIn", S_P_STRING}, {"StartStageOut", S_P_STRING}, {"StopStageIn", S_P_STRING}, {"StopStageOut", S_P_STRING}, {"UserSizeLimit", S_P_STRING}, {NULL} }; _clear_config(); if (slurm_get_debug_flags() & DEBUG_FLAG_BURST_BUF) debug_flag = true; bb_conf = get_extra_conf_path("burst_buffer.conf"); bb_hashtbl = s_p_hashtbl_create(bb_options); if (s_p_parse_file(bb_hashtbl, NULL, bb_conf, false) == SLURM_ERROR) fatal("something wrong with opening/reading %s: %m", bb_conf); if (s_p_get_string(&allow_users_str, "AllowUsers", bb_hashtbl)) allow_users = _parse_users(allow_users_str); if (s_p_get_string(&deny_users_str, "DenyUsers", bb_hashtbl)) deny_users = _parse_users(deny_users_str); s_p_get_string(&get_sys_state, "GetSysState", bb_hashtbl); if (s_p_get_string(&tmp, "JobSizeLimit", bb_hashtbl)) { job_size_limit = _get_size_num(tmp); xfree(tmp); } s_p_get_uint32(&prio_boost, "StagedInPrioBoost", bb_hashtbl); s_p_get_string(&start_stage_in, "StartStageIn", bb_hashtbl); s_p_get_string(&start_stage_out, "StartStageOut", bb_hashtbl); s_p_get_string(&stop_stage_in, "StopStageIn", bb_hashtbl); s_p_get_string(&stop_stage_out, "StopStageOut", bb_hashtbl); if (s_p_get_string(&tmp, "UserSizeLimit", bb_hashtbl)) { user_size_limit = _get_size_num(tmp); xfree(tmp); } s_p_hashtbl_destroy(bb_hashtbl); xfree(bb_conf); if (debug_flag) { value = _print_users(allow_users); info("%s: AllowUsers:%s", __func__, value); xfree(value); value = _print_users(deny_users); info("%s: DenyUsers:%s", __func__, value); xfree(value); info("%s: GetSysState:%s", __func__, get_sys_state); info("%s: JobSizeLimit:%u", __func__, job_size_limit); info("%s: StagedInPrioBoost:%u", __func__, prio_boost); info("%s: StartStageIn:%s", __func__, start_stage_in); info("%s: StartStageOut:%s", __func__, start_stage_out); info("%s: StopStageIn:%s", __func__, stop_stage_in); info("%s: StopStageOut:%s", __func__, stop_stage_out); info("%s: UserSizeLimit:%u", __func__, user_size_limit); } }
/* Load and process configuration parameters */ extern void bb_load_config(bb_state_t *state_ptr, char *plugin_type) { s_p_hashtbl_t *bb_hashtbl = NULL; char *bb_conf, *tmp = NULL, *value; #if _SUPPORT_ALT_POOL char *colon, *save_ptr = NULL, *tok; uint32_t pool_cnt; #endif int fd, i; static s_p_options_t bb_options[] = { {"AllowUsers", S_P_STRING}, #if _SUPPORT_ALT_POOL {"AltPool", S_P_STRING}, #endif {"CreateBuffer", S_P_STRING}, {"DefaultPool", S_P_STRING}, {"DenyUsers", S_P_STRING}, {"DestroyBuffer", S_P_STRING}, {"Flags", S_P_STRING}, {"GetSysState", S_P_STRING}, {"Granularity", S_P_STRING}, {"OtherTimeout", S_P_UINT32}, {"StageInTimeout", S_P_UINT32}, {"StageOutTimeout", S_P_UINT32}, {"StartStageIn", S_P_STRING}, {"StartStageOut", S_P_STRING}, {"StopStageIn", S_P_STRING}, {"StopStageOut", S_P_STRING}, {"ValidateTimeout", S_P_UINT32}, {NULL} }; xfree(state_ptr->name); if (plugin_type) { tmp = strchr(plugin_type, '/'); if (tmp) tmp++; else tmp = plugin_type; state_ptr->name = xstrdup(tmp); } /* Set default configuration */ bb_clear_config(&state_ptr->bb_config, false); if (slurm_get_debug_flags() & DEBUG_FLAG_BURST_BUF) state_ptr->bb_config.debug_flag = true; state_ptr->bb_config.flags |= BB_FLAG_DISABLE_PERSISTENT; state_ptr->bb_config.other_timeout = DEFAULT_OTHER_TIMEOUT; state_ptr->bb_config.stage_in_timeout = DEFAULT_STATE_IN_TIMEOUT; state_ptr->bb_config.stage_out_timeout = DEFAULT_STATE_OUT_TIMEOUT; state_ptr->bb_config.validate_timeout = DEFAULT_VALIDATE_TIMEOUT; /* First look for "burst_buffer.conf" then with "type" field, * for example "burst_buffer_cray.conf" */ bb_conf = get_extra_conf_path("burst_buffer.conf"); fd = open(bb_conf, 0); if (fd >= 0) { close(fd); } else { char *new_path = NULL; xfree(bb_conf); xstrfmtcat(new_path, "burst_buffer_%s.conf", state_ptr->name); bb_conf = get_extra_conf_path(new_path); fd = open(bb_conf, 0); if (fd < 0) { info("%s: Unable to find configuration file %s or " "burst_buffer.conf", __func__, new_path); xfree(bb_conf); xfree(new_path); return; } close(fd); xfree(new_path); } bb_hashtbl = s_p_hashtbl_create(bb_options); if (s_p_parse_file(bb_hashtbl, NULL, bb_conf, false) == SLURM_ERROR) { fatal("%s: something wrong with opening/reading %s: %m", __func__, bb_conf); } if (s_p_get_string(&state_ptr->bb_config.allow_users_str, "AllowUsers", bb_hashtbl)) { state_ptr->bb_config.allow_users = _parse_users( state_ptr->bb_config.allow_users_str); } s_p_get_string(&state_ptr->bb_config.create_buffer, "CreateBuffer", bb_hashtbl); s_p_get_string(&state_ptr->bb_config.default_pool, "DefaultPool", bb_hashtbl); if (s_p_get_string(&state_ptr->bb_config.deny_users_str, "DenyUsers", bb_hashtbl)) { state_ptr->bb_config.deny_users = _parse_users( state_ptr->bb_config.deny_users_str); } s_p_get_string(&state_ptr->bb_config.destroy_buffer, "DestroyBuffer", bb_hashtbl); if (s_p_get_string(&tmp, "Flags", bb_hashtbl)) { state_ptr->bb_config.flags = slurm_bb_str2flags(tmp); xfree(tmp); } /* By default, disable persistent buffer creation by normal users */ if (state_ptr->bb_config.flags & BB_FLAG_ENABLE_PERSISTENT) state_ptr->bb_config.flags &= (~BB_FLAG_DISABLE_PERSISTENT); s_p_get_string(&state_ptr->bb_config.get_sys_state, "GetSysState", bb_hashtbl); if (s_p_get_string(&tmp, "Granularity", bb_hashtbl)) { state_ptr->bb_config.granularity = bb_get_size_num(tmp, 1); xfree(tmp); if (state_ptr->bb_config.granularity == 0) { error("%s: Granularity=0 is invalid", __func__); state_ptr->bb_config.granularity = 1; } } #if _SUPPORT_ALT_POOL if (s_p_get_string(&tmp, "AltPool", bb_hashtbl)) { tok = strtok_r(tmp, ",", &save_ptr); while (tok) { colon = strchr(tok, ':'); if (colon) { colon[0] = '\0'; pool_cnt = _atoi(colon + 1); } else pool_cnt = 1; state_ptr->bb_config.pool_ptr = xrealloc( state_ptr->bb_config.pool_ptr, sizeof(burst_buffer_pool_t) * (state_ptr->bb_config.pool_cnt + 1)); state_ptr->bb_config. pool_ptr[state_ptr->bb_config.pool_cnt].name = xstrdup(tok); state_ptr->bb_config. pool_ptr[state_ptr->bb_config.pool_cnt]. avail_space = pool_cnt; state_ptr->bb_config.pool_cnt++; tok = strtok_r(NULL, ",", &save_ptr); } xfree(tmp); } #endif (void) s_p_get_uint32(&state_ptr->bb_config.other_timeout, "OtherTimeout", bb_hashtbl); (void) s_p_get_uint32(&state_ptr->bb_config.stage_in_timeout, "StageInTimeout", bb_hashtbl); (void) s_p_get_uint32(&state_ptr->bb_config.stage_out_timeout, "StageOutTimeout", bb_hashtbl); s_p_get_string(&state_ptr->bb_config.start_stage_in, "StartStageIn", bb_hashtbl); s_p_get_string(&state_ptr->bb_config.start_stage_out, "StartStageOut", bb_hashtbl); s_p_get_string(&state_ptr->bb_config.stop_stage_in, "StopStageIn", bb_hashtbl); s_p_get_string(&state_ptr->bb_config.stop_stage_out, "StopStageOut", bb_hashtbl); (void) s_p_get_uint32(&state_ptr->bb_config.validate_timeout, "ValidateTimeout", bb_hashtbl); s_p_hashtbl_destroy(bb_hashtbl); xfree(bb_conf); if (state_ptr->bb_config.debug_flag) { value = _print_users(state_ptr->bb_config.allow_users); info("%s: AllowUsers:%s", __func__, value); xfree(value); info("%s: CreateBuffer:%s", __func__, state_ptr->bb_config.create_buffer); info("%s: DefaultPool:%s", __func__, state_ptr->bb_config.default_pool); value = _print_users(state_ptr->bb_config.deny_users); info("%s: DenyUsers:%s", __func__, value); xfree(value); info("%s: DestroyBuffer:%s", __func__, state_ptr->bb_config.destroy_buffer); info("%s: GetSysState:%s", __func__, state_ptr->bb_config.get_sys_state); info("%s: Granularity:%"PRIu64"", __func__, state_ptr->bb_config.granularity); for (i = 0; i < state_ptr->bb_config.pool_cnt; i++) { info("%s: AltPoolName[%d]:%s:%"PRIu64"", __func__, i, state_ptr->bb_config.pool_ptr[i].name, state_ptr->bb_config.pool_ptr[i].total_space); } info("%s: OtherTimeout:%u", __func__, state_ptr->bb_config.other_timeout); info("%s: StageInTimeout:%u", __func__, state_ptr->bb_config.stage_in_timeout); info("%s: StageOutTimeout:%u", __func__, state_ptr->bb_config.stage_out_timeout); info("%s: StartStageIn:%s", __func__, state_ptr->bb_config.start_stage_in); info("%s: StartStageOut:%s", __func__, state_ptr->bb_config.start_stage_out); info("%s: StopStageIn:%s", __func__, state_ptr->bb_config.stop_stage_in); info("%s: StopStageOut:%s", __func__, state_ptr->bb_config.stop_stage_out); info("%s: ValidateTimeout:%u", __func__, state_ptr->bb_config.validate_timeout); } }