extern int acct_gather_energy_unpack(acct_gather_energy_t **energy, Buf buffer, uint16_t protocol_version) { acct_gather_energy_t *energy_ptr = acct_gather_energy_alloc(); *energy = energy_ptr; if (protocol_version >= SLURM_2_6_PROTOCOL_VERSION) { safe_unpack32(&energy_ptr->base_consumed_energy, buffer); safe_unpack32(&energy_ptr->base_watts, buffer); safe_unpack32(&energy_ptr->consumed_energy, buffer); safe_unpack32(&energy_ptr->current_watts, buffer); safe_unpack32(&energy_ptr->previous_consumed_energy, buffer); safe_unpack_time(&energy_ptr->poll_time, buffer); } else { safe_unpack32(&energy_ptr->base_consumed_energy, buffer); safe_unpack32(&energy_ptr->base_watts, buffer); safe_unpack32(&energy_ptr->consumed_energy, buffer); safe_unpack32(&energy_ptr->current_watts, buffer); } return SLURM_SUCCESS; unpack_error: acct_gather_energy_destroy(energy_ptr); *energy = NULL; return SLURM_ERROR; }
extern int fini(void) { if (!_run_in_daemon()) return SLURM_SUCCESS; acct_gather_energy_destroy(local_energy); local_energy = NULL; return SLURM_SUCCESS; }
static int _get_joules_task(uint16_t delta) { acct_gather_energy_t *last_energy = NULL; time_t now; static bool first = true; static uint32_t start_current_energy = 0; uint32_t adjustment = 0; last_energy = local_energy; local_energy = NULL; if (slurm_get_node_energy(NULL, delta, &local_energy)) { error("_get_joules_task: can't get info from slurmd"); local_energy = last_energy; return SLURM_ERROR; } now = time(NULL); local_energy->previous_consumed_energy = last_energy->consumed_energy; if (slurm_ipmi_conf.adjustment) adjustment = _get_additional_consumption( local_energy->poll_time, now, local_energy->current_watts, local_energy->current_watts); if (!first) { local_energy->consumed_energy -= start_current_energy; local_energy->base_consumed_energy = (local_energy->consumed_energy - last_energy->consumed_energy) + adjustment; } else { /* This is just for the step, so take all the pervious consumption out of the mix. */ start_current_energy = local_energy->consumed_energy + adjustment; local_energy->base_consumed_energy = 0; first = false; } local_energy->consumed_energy = local_energy->previous_consumed_energy + local_energy->base_consumed_energy; acct_gather_energy_destroy(last_energy); if (debug_flags & DEBUG_FLAG_ENERGY) info("_get_joules_task: consumed %u Joules " "(received %u(%u watts) from slurmd)", local_energy->consumed_energy, local_energy->base_consumed_energy, local_energy->current_watts); return SLURM_SUCCESS; }
/* Purge the contents of a node record */ extern void purge_node_rec (struct node_record *node_ptr) { xfree(node_ptr->arch); xfree(node_ptr->comm_name); xfree(node_ptr->features); xfree(node_ptr->gres); if (node_ptr->gres_list) list_destroy(node_ptr->gres_list); xfree(node_ptr->name); xfree(node_ptr->node_hostname); xfree(node_ptr->os); xfree(node_ptr->part_pptr); xfree(node_ptr->reason); acct_gather_energy_destroy(node_ptr->energy); select_g_select_nodeinfo_free(node_ptr->select_nodeinfo); }
extern int fini(void) { if (!_run_in_daemon()) return SLURM_SUCCESS; flag_energy_accounting_shutdown = true; slurm_mutex_lock(&ipmi_mutex); if (thread_ipmi_id_run) pthread_cancel(thread_ipmi_id_run); if (cleanup_handler_thread) pthread_join(cleanup_handler_thread, NULL); slurm_mutex_unlock(&ipmi_mutex); acct_gather_energy_destroy(local_energy); local_energy = NULL; return SLURM_SUCCESS; }
extern int acct_gather_energy_unpack(acct_gather_energy_t **energy, Buf buffer, uint16_t protocol_version, bool need_alloc) { uint32_t uint32_tmp; acct_gather_energy_t *energy_ptr; if (need_alloc) { energy_ptr = acct_gather_energy_alloc(1); *energy = energy_ptr; } else { energy_ptr = *energy; } if (protocol_version >= SLURM_15_08_PROTOCOL_VERSION) { safe_unpack64(&energy_ptr->base_consumed_energy, buffer); safe_unpack32(&energy_ptr->base_watts, buffer); safe_unpack64(&energy_ptr->consumed_energy, buffer); safe_unpack32(&energy_ptr->current_watts, buffer); safe_unpack64(&energy_ptr->previous_consumed_energy, buffer); safe_unpack_time(&energy_ptr->poll_time, buffer); } else if (protocol_version >= SLURM_MIN_PROTOCOL_VERSION) { safe_unpack32(&uint32_tmp, buffer); energy_ptr->base_consumed_energy = (uint64_t) uint32_tmp; safe_unpack32(&energy_ptr->base_watts, buffer); safe_unpack32(&uint32_tmp, buffer); energy_ptr->consumed_energy = (uint64_t) uint32_tmp; safe_unpack32(&energy_ptr->current_watts, buffer); safe_unpack32(&uint32_tmp, buffer); energy_ptr->previous_consumed_energy = (uint64_t) uint32_tmp; safe_unpack_time(&energy_ptr->poll_time, buffer); } return SLURM_SUCCESS; unpack_error: if (need_alloc) { acct_gather_energy_destroy(energy_ptr); *energy = NULL; } else memset(energy_ptr, 0, sizeof(acct_gather_energy_t)); return SLURM_ERROR; }
/* Purge the contents of a node record */ extern void purge_node_rec (struct node_record *node_ptr) { xfree(node_ptr->arch); xfree(node_ptr->comm_name); xfree(node_ptr->cpu_spec_list); xfree(node_ptr->features); xfree(node_ptr->gres); FREE_NULL_LIST(node_ptr->gres_list); xfree(node_ptr->name); xfree(node_ptr->node_hostname); FREE_NULL_BITMAP(node_ptr->node_spec_bitmap); xfree(node_ptr->os); xfree(node_ptr->part_pptr); xfree(node_ptr->power); xfree(node_ptr->reason); xfree(node_ptr->version); acct_gather_energy_destroy(node_ptr->energy); ext_sensors_destroy(node_ptr->ext_sensors); select_g_select_nodeinfo_free(node_ptr->select_nodeinfo); xfree(node_ptr->tres_str); }