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_node_totals(hid_t jg_node, hid_t nsg_node) { hid_t jg_totals, nsg_totals, g_total; hsize_t nobj; int i, len, size_data; void *data; uint32_t type; char buf[MAX_GROUP_NAME+1]; H5G_info_t group_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_totals = H5Gcreate(jg_node, GRP_TOTALS, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (jg_totals < 0) { info("Failed to create job node totals"); return; } nsg_totals = get_group(nsg_node, GRP_TOTALS); if (nsg_totals < 0) { H5Gclose(jg_totals); return; } H5Gget_info(nsg_totals, &group_info); nobj = group_info.nlinks; for (i = 0; (nobj>0) && (i<nobj); i++) { // Get the name of the group. len = H5Lget_name_by_idx(nsg_totals, ".", H5_INDEX_NAME, H5_ITER_INC, i, buf, MAX_GROUP_NAME, H5P_DEFAULT); if (len<1 || len>MAX_GROUP_NAME) { info("invalid group name %s", buf); continue; } g_total = H5Gopen(nsg_totals, buf, H5P_DEFAULT); if (g_total < 0) { info("Failed to open %s", buf); continue; } type = get_uint32_attribute(g_total, ATTR_DATATYPE); if (!type) { H5Gclose(g_total); info("No %s attribute", ATTR_DATATYPE); continue; } data = get_hdf5_data(g_total, type, buf, &size_data); if (data == NULL) { H5Gclose(g_total); info("Failed to get group %s type %s data", buf, acct_gather_profile_type_to_string(type)); continue; } put_hdf5_data(jg_totals, type, SUBDATA_DATA, buf, data, 1); xfree(data); H5Gclose(g_total); } H5Gclose(nsg_totals); H5Gclose(jg_totals); return; }
static void _merge_task_totals(hid_t jg_tasks, hid_t nsg_node, char* node_name) { hid_t jg_task, jg_totals, nsg_totals, g_total, nsg_tasks, nsg_task = -1; hsize_t nobj, ntasks = -1; int i, len, taskx, taskid, taskcpus, size_data; void *data; uint32_t type; char buf[MAX_GROUP_NAME+1]; char group_name[MAX_GROUP_NAME+1]; H5G_info_t group_info; if (jg_tasks < 0) { info("Job Tasks is not HDF5 object"); return; } if (nsg_node < 0) { info("Node-Step is not HDF5 object"); return; } nsg_tasks = get_group(nsg_node, GRP_TASKS); if (nsg_tasks < 0) { debug("No Tasks group in node-step file"); return; } H5Gget_info(nsg_tasks, &group_info); ntasks = group_info.nlinks; for (taskx = 0; ((int)ntasks>0) && (taskx<((int)ntasks)); taskx++) { // Get the name of the group. len = H5Lget_name_by_idx(nsg_tasks, ".", H5_INDEX_NAME, H5_ITER_INC, taskx, buf, MAX_GROUP_NAME, H5P_DEFAULT); if (len<1 || len>MAX_GROUP_NAME) { info("Invalid group name %s", buf); continue; } nsg_task = H5Gopen(nsg_tasks, buf, H5P_DEFAULT); if (nsg_task < 0) { debug("Failed to open %s", buf); continue; } taskid = get_int_attribute(nsg_task, ATTR_TASKID); sprintf(group_name, "%s_%d", GRP_TASK, taskid); jg_task = H5Gcreate(jg_tasks, group_name, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (jg_task < 0) { H5Gclose(nsg_task); info("Failed to create job task group"); continue; } put_string_attribute(jg_task, ATTR_NODENAME, node_name); put_int_attribute(jg_task, ATTR_TASKID, taskid); taskcpus = get_int_attribute(nsg_task, ATTR_CPUPERTASK); put_int_attribute(jg_task, ATTR_CPUPERTASK, taskcpus); nsg_totals = get_group(nsg_task, GRP_TOTALS); if (nsg_totals < 0) { H5Gclose(jg_task); H5Gclose(nsg_task); continue; } jg_totals = H5Gcreate(jg_task, GRP_TOTALS, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); if (jg_totals < 0) { H5Gclose(jg_task); H5Gclose(nsg_task); info("Failed to create job task totals"); continue; } H5Gget_info(nsg_totals, &group_info); nobj = group_info.nlinks; for (i = 0; (nobj>0) && (i<nobj); i++) { // Get the name of the group. len = H5Lget_name_by_idx(nsg_totals, ".", H5_INDEX_NAME, H5_ITER_INC, i, buf, MAX_GROUP_NAME, H5P_DEFAULT); if (len<1 || len>MAX_GROUP_NAME) { info("Invalid group name %s", buf); continue; } g_total = H5Gopen(nsg_totals, buf, H5P_DEFAULT); if (g_total < 0) { info("Failed to open %s", buf); continue; } type = get_uint32_attribute(g_total, ATTR_DATATYPE); if (!type) { H5Gclose(g_total); info("No %s attribute", ATTR_DATATYPE); continue; } data = get_hdf5_data(g_total, type, buf, &size_data); if (data == NULL) { H5Gclose(g_total); info("Failed to get group %s type %s data", buf, acct_gather_profile_type_to_string(type)); continue; } put_hdf5_data(jg_totals, type, SUBDATA_DATA, buf, data, 1); xfree(data); H5Gclose(g_total); } H5Gclose(nsg_totals); H5Gclose(nsg_task); H5Gclose(jg_totals); H5Gclose(jg_task); } H5Gclose(nsg_tasks); }