static void _extract_series(FILE* fp, int stepx, bool header, hid_t gid_level, char* node_name, char* data_set_name) { hid_t gid_series; int size_data; void *data; uint32_t type; char *data_type, *subtype; hdf5_api_ops_t* ops; gid_series = get_group(gid_level, data_set_name); if (gid_series < 0) { // This is okay, may not have ran long enough for // a sample (hostname????) // OR trying to get all tasks return; } data_type = get_string_attribute(gid_series, ATTR_DATATYPE); if (!data_type) { H5Gclose(gid_series); info("No datatype in %s", data_set_name); return; } type = acct_gather_profile_type_from_string(data_type); xfree(data_type); subtype = get_string_attribute(gid_series, ATTR_SUBDATATYPE); if (subtype == NULL) { H5Gclose(gid_series); info("No %s attribute", ATTR_SUBDATATYPE); return; } ops = profile_factory(type); if (ops == NULL) { xfree(subtype); H5Gclose(gid_series); info("Failed to create operations for %s", acct_gather_profile_type_to_string(type)); return; } data = get_hdf5_data( gid_series, type, data_set_name, &size_data); if (data) { if (strcmp(subtype,SUBDATA_SUMMARY) != 0) (*(ops->extract_series)) (fp, header, params.job_id, stepx, node_name, data_set_name, data, size_data); else (*(ops->extract_total)) (fp, header, params.job_id, stepx, node_name, data_set_name, data, size_data); xfree(data); } else { fprintf(fp, "%d,%d,%s,No %s Data\n", params.job_id, stepx, node_name, data_set_name); } xfree(ops); H5Gclose(gid_series); }
// Get the data_set for a node static void *_get_series_data(hid_t jgid_node, char* series, hdf5_api_ops_t **ops_p, int *nsmp) { hid_t gid_level, gid_series; int size_data; void *data; uint32_t type; char *data_type; hdf5_api_ops_t* ops; *nsmp = 0; // Initialize return arguments. *ops_p = NULL; // Navigate from the node group to the data set gid_level = get_group(jgid_node, GRP_SAMPLES); if (gid_level == -1) { return NULL; } gid_series = get_group(gid_level, series); if (gid_series < 0) { // This is okay, may not have ran long enough for // a sample (srun hostname) H5Gclose(gid_level); return NULL; } data_type = get_string_attribute(gid_series, ATTR_DATATYPE); if (!data_type) { H5Gclose(gid_series); H5Gclose(gid_level); debug("No datatype in %s", series); return NULL; } // Invoke the data type operator to get the data set type = acct_gather_profile_type_from_string(data_type); xfree(data_type); ops = profile_factory(type); if (ops == NULL) { H5Gclose(gid_series); H5Gclose(gid_level); debug("Failed to create operations for %s", acct_gather_profile_type_to_string(type)); return NULL; } data = get_hdf5_data(gid_series, type, series, &size_data); if (data) { *nsmp = (size_data / ops->dataset_size()); *ops_p = ops; } else { xfree(ops); } H5Gclose(gid_series); H5Gclose(gid_level); return data; }
static void _extract_node_level(FILE* fp, int stepx, hid_t jgid_nodes, int nnodes, bool header, char* data_set_name) { hid_t jgid_node, gid_level, gid_series; int nodex, len, size_data; void *data; uint32_t type; char *data_type, *subtype; char jgrp_node_name[MAX_GROUP_NAME+1]; hdf5_api_ops_t* ops; for (nodex=0; nodex<nnodes; nodex++) { len = H5Lget_name_by_idx(jgid_nodes, ".", H5_INDEX_NAME, H5_ITER_INC, nodex, jgrp_node_name, MAX_GROUP_NAME, H5P_DEFAULT); if ((len < 0) || (len > MAX_GROUP_NAME)) { info("Invalid node name=%s", jgrp_node_name); continue; } jgid_node = get_group(jgid_nodes, jgrp_node_name); if (jgid_node < 0) { info("Failed to open group %s", jgrp_node_name); continue; } if (params.node && strcmp(params.node, "*") && strcmp(params.node, jgrp_node_name)) continue; gid_level = _get_series_parent(jgid_node); if (gid_level == -1) { H5Gclose(jgid_node); continue; } gid_series = get_group(gid_level, data_set_name); if (gid_series < 0) { // This is okay, may not have ran long enough for // a sample (hostname????) H5Gclose(gid_level); H5Gclose(jgid_node); continue; } data_type = get_string_attribute(gid_series, ATTR_DATATYPE); if (!data_type) { H5Gclose(gid_series); H5Gclose(gid_level); H5Gclose(jgid_node); info("No datatype in %s", data_set_name); continue; } type = acct_gather_profile_type_from_string(data_type); xfree(data_type); subtype = get_string_attribute(gid_series, ATTR_SUBDATATYPE); if (subtype == NULL) { H5Gclose(gid_series); H5Gclose(gid_level); H5Gclose(jgid_node); info("No %s attribute", ATTR_SUBDATATYPE); continue; } ops = profile_factory(type); if (ops == NULL) { xfree(subtype); H5Gclose(gid_series); H5Gclose(gid_level); H5Gclose(jgid_node); info("Failed to create operations for %s", acct_gather_profile_type_to_string(type)); continue; } data = get_hdf5_data( gid_series, type, data_set_name, &size_data); if (data) { if (strcmp(subtype,SUBDATA_SUMMARY) != 0) (*(ops->extract_series)) (fp, header, params.job_id, stepx, jgrp_node_name, data_set_name, data, size_data); else (*(ops->extract_total)) (fp, header, params.job_id, stepx, jgrp_node_name, data_set_name, data, size_data); header = false; xfree(data); } else { fprintf(fp, "%d,%d,%s,No %s Data\n", params.job_id, stepx, jgrp_node_name, data_set_name); } xfree(ops); H5Gclose(gid_series); H5Gclose(gid_level); H5Gclose(jgid_node); } }
static void _merge_series_data(hid_t jgid_tasks, hid_t jg_node, hid_t nsg_node) { hid_t jg_samples, nsg_samples; hid_t g_series, g_series_total = -1; hsize_t num_samples, n_series; int idsx, len; void *data = NULL, *series_total = NULL; uint32_t type; char *data_type; char nam_series[MAX_GROUP_NAME+1]; hdf5_api_ops_t* ops = NULL; H5G_info_t group_info; H5O_info_t object_info; if (jg_node < 0) { info("Job Node is not HDF5 object"); return; } if (nsg_node < 0) { info("Node-Step is not HDF5 object"); return; } jg_samples = H5Gcreate(jg_node, GRP_SAMPLES, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (jg_samples < 0) { info("Failed to create job node Samples"); return; } nsg_samples = get_group(nsg_node, GRP_SAMPLES); if (nsg_samples < 0) { H5Gclose(jg_samples); debug("Failed to get node-step Samples"); return; } H5Gget_info(nsg_samples, &group_info); n_series = group_info.nlinks; if (n_series < 1) { // No series? H5Gclose(jg_samples); H5Gclose(nsg_samples); info("No Samples"); return; } for (idsx = 0; idsx < n_series; idsx++) { H5Oget_info_by_idx(nsg_samples, ".", H5_INDEX_NAME, H5_ITER_INC, idsx, &object_info, H5P_DEFAULT); if (object_info.type != H5O_TYPE_GROUP) continue; len = H5Lget_name_by_idx(nsg_samples, ".", H5_INDEX_NAME, H5_ITER_INC, idsx, nam_series, MAX_GROUP_NAME, H5P_DEFAULT); if (len<1 || len>MAX_GROUP_NAME) { info("Invalid group name %s", nam_series); continue; } g_series = H5Gopen(nsg_samples, nam_series, H5P_DEFAULT); if (g_series < 0) { info("Failed to open %s", nam_series); continue; } H5Gget_info(g_series, &group_info); num_samples = group_info.nlinks; if (num_samples <= 0) { H5Gclose(g_series); info("_series %s has no samples", nam_series); continue; } // Get first sample in series to find out how big the data is. data_type = get_string_attribute(g_series, ATTR_DATATYPE); if (!data_type) { H5Gclose(g_series); info("Failed to get datatype for Time Series Dataset"); continue; } type = acct_gather_profile_type_from_string(data_type); xfree(data_type); data = _get_all_samples(g_series, nam_series, type, num_samples); if (data == NULL) { H5Gclose(g_series); info("Failed to get memory for Time Series Dataset"); continue; } put_hdf5_data(jg_samples, type, SUBDATA_SERIES, nam_series, data, num_samples); ops = profile_factory(type); if (ops == NULL) { xfree(data); H5Gclose(g_series); info("Failed to create operations for %s", acct_gather_profile_type_to_string(type)); continue; } series_total = (*(ops->series_total))(num_samples, data); if (series_total != NULL) { // Totals for series attaches to node g_series_total = make_group(jg_node, GRP_TOTALS); if (g_series_total < 0) { H5Gclose(g_series); xfree(series_total); xfree(data); xfree(ops); info("Failed to make Totals for Node"); continue; } put_hdf5_data(g_series_total, type, SUBDATA_SUMMARY, nam_series, series_total, 1); H5Gclose(g_series_total); } xfree(series_total); xfree(ops); xfree(data); H5Gclose(g_series); } return; }