/** * print a block request */ extern void print_select_ba_request(select_ba_request_t* ba_request) { int dim; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); uint16_t cluster_dims = slurmdb_setup_cluster_dims(); if (ba_request == NULL){ error("print_ba_request Error, request is NULL"); return; } debug(" ba_request:"); debug(" geometry:\t"); for (dim=0; dim<cluster_dims; dim++){ debug("%d", ba_request->geometry[dim]); } debug(" size:\t%d", ba_request->size); if (cluster_flags & CLUSTER_FLAG_BGQ) { for (dim=0; dim<cluster_dims; dim++) debug(" conn_type:\t%d", ba_request->conn_type[dim]); } else debug(" conn_type:\t%d", ba_request->conn_type[0]); debug(" rotate:\t%d", ba_request->rotate); debug(" elongate:\t%d", ba_request->elongate); }
static void _sprint_range(char *str, uint32_t str_size, uint32_t lower, uint32_t upper) { char tmp[128]; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)lower, tmp, sizeof(tmp), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); } else { snprintf(tmp, sizeof(tmp), "%u", lower); } if (upper > 0) { char tmp2[128]; if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)upper, tmp2, sizeof(tmp2), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); } else { snprintf(tmp2, sizeof(tmp2), "%u", upper); } snprintf(str, str_size, "%s-%s", tmp, tmp2); } else snprintf(str, str_size, "%s", tmp); }
/* * slurm_job_will_run - determine if a job would execute immediately if * submitted now * IN job_desc_msg - description of resource allocation request * RET 0 on success, otherwise return -1 and set errno to indicate the error */ int slurm_job_will_run(job_desc_msg_t *req) { will_run_response_msg_t *will_run_resp = NULL; char buf[64], local_hostname[64]; int rc; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *type = "processors"; char *cluster_name = NULL; void *ptr = NULL; if ((req->alloc_node == NULL) && (gethostname_short(local_hostname, sizeof(local_hostname)) == 0)) { req->alloc_node = local_hostname; } if (working_cluster_rec) cluster_name = working_cluster_rec->name; else cluster_name = slurmctld_conf.cluster_name; if (!slurm_load_federation(&ptr) && cluster_in_federation(ptr, cluster_name)) rc = _fed_job_will_run(req, &will_run_resp, ptr); else rc = slurm_job_will_run2(req, &will_run_resp); if ((rc == 0) && will_run_resp) { if (cluster_flags & CLUSTER_FLAG_BG) type = "cnodes"; slurm_make_time_str(&will_run_resp->start_time, buf, sizeof(buf)); info("Job %u to start at %s using %u %s on %s", will_run_resp->job_id, buf, will_run_resp->proc_cnt, type, will_run_resp->node_list); if (will_run_resp->preemptee_job_id) { ListIterator itr; uint32_t *job_id_ptr; char *job_list = NULL, *sep = ""; itr = list_iterator_create(will_run_resp-> preemptee_job_id); while ((job_id_ptr = list_next(itr))) { if (job_list) sep = ","; xstrfmtcat(job_list, "%s%u", sep, *job_id_ptr); } list_iterator_destroy(itr); info(" Preempts: %s", job_list); xfree(job_list); } slurm_free_will_run_response_msg(will_run_resp); } if (req->alloc_node == local_hostname) req->alloc_node = NULL; if (ptr) slurm_destroy_federation_rec(ptr); return rc; }
/* * slurm_print_ctl_conf - output the contents of slurm control configuration * message as loaded using slurm_load_ctl_conf * IN out - file to write to * IN slurm_ctl_conf_ptr - slurm control configuration pointer */ void slurm_print_ctl_conf ( FILE* out, slurm_ctl_conf_info_msg_t * slurm_ctl_conf_ptr ) { char time_str[32], tmp_str[128]; void *ret_list = NULL; char *select_title = ""; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (cluster_flags & CLUSTER_FLAG_BGL) select_title = "\nBluegene/L configuration\n"; else if (cluster_flags & CLUSTER_FLAG_BGP) select_title = "\nBluegene/P configuration\n"; else if (cluster_flags & CLUSTER_FLAG_BGQ) select_title = "\nBluegene/Q configuration\n"; if ( slurm_ctl_conf_ptr == NULL ) return ; slurm_make_time_str((time_t *)&slurm_ctl_conf_ptr->last_update, time_str, sizeof(time_str)); snprintf(tmp_str, sizeof(tmp_str), "Configuration data as of %s\n", time_str); ret_list = slurm_ctl_conf_2_key_pairs(slurm_ctl_conf_ptr); if (ret_list) { slurm_print_key_pairs(out, ret_list, tmp_str); list_destroy((List)ret_list); } slurm_print_key_pairs(out, slurm_ctl_conf_ptr->select_conf_key_pairs, select_title); }
extern int as_mysql_register_ctld(mysql_conn_t *mysql_conn, char *cluster, uint16_t port) { char *query = NULL; char *address = NULL; char hostname[255]; time_t now = time(NULL); uint32_t flags = slurmdb_setup_cluster_flags(); int rc = SLURM_SUCCESS; if (slurmdbd_conf) fatal("clusteracct_storage_g_register_ctld " "should never be called from the slurmdbd."); if (check_connection(mysql_conn) != SLURM_SUCCESS) return ESLURM_DB_CONNECTION; if (!mysql_conn->cluster_name) { error("%s:%d no cluster name", THIS_FILE, __LINE__); return SLURM_ERROR; } if (!mysql_conn->cluster_name) mysql_conn->cluster_name = xstrdup(cluster); info("Registering slurmctld for cluster %s at port %u in database.", cluster, port); gethostname(hostname, sizeof(hostname)); /* check if we are running on the backup controller */ if (slurmctld_conf.backup_controller && !strcmp(slurmctld_conf.backup_controller, hostname)) { address = slurmctld_conf.backup_addr; } else address = slurmctld_conf.control_addr; query = xstrdup_printf( "update %s set deleted=0, mod_time=%ld, " "control_host='%s', control_port=%u, last_port=%u, " "rpc_version=%d, dimensions=%d, flags=%u, " "plugin_id_select=%d where name='%s';", cluster_table, now, address, port, port, SLURM_PROTOCOL_VERSION, SYSTEM_DIMENSIONS, flags, select_get_plugin_id(), cluster); xstrfmtcat(query, "insert into %s " "(timestamp, action, name, actor, info) " "values (%ld, %d, '%s', '%s', '%s %u %u %u %u');", txn_table, now, DBD_MODIFY_CLUSTERS, cluster, slurmctld_conf.slurm_user_name, address, port, SYSTEM_DIMENSIONS, flags, select_get_plugin_id()); if (debug_flags & DEBUG_FLAG_DB_ASSOC) DB_DEBUG(mysql_conn->conn, "query\n%s", query); rc = mysql_db_query(mysql_conn, query); xfree(query); return rc; }
/* * slurm_step_layout_create - determine how many tasks of a job will be * run on each node. Distribution is influenced * by number of cpus on each host. * IN tlist - hostlist corresponding to task layout * IN cpus_per_node - cpus per node * IN cpu_count_reps - how many nodes have same cpu count * IN num_hosts - number of hosts we have * IN num_tasks - number of tasks to distribute across these cpus * IN cpus_per_task - number of cpus per task * IN task_dist - type of distribution we are using * IN plane_size - plane size (only needed for the plane distribution) * RET a pointer to an slurm_step_layout_t structure * NOTE: allocates memory that should be xfreed by caller */ slurm_step_layout_t *slurm_step_layout_create( const char *tlist, uint16_t *cpus_per_node, uint32_t *cpu_count_reps, uint32_t num_hosts, uint32_t num_tasks, uint16_t cpus_per_task, uint16_t task_dist, uint16_t plane_size) { char *arbitrary_nodes = NULL; slurm_step_layout_t *step_layout = xmalloc(sizeof(slurm_step_layout_t)); uint32_t cluster_flags = slurmdb_setup_cluster_flags(); step_layout->task_dist = task_dist; if (task_dist == SLURM_DIST_ARBITRARY) { hostlist_t hl = NULL; char *buf = NULL; /* set the node list for the task layout later if user * supplied could be different that the job allocation */ arbitrary_nodes = xstrdup(tlist); hl = hostlist_create(tlist); hostlist_uniq(hl); buf = hostlist_ranged_string_xmalloc(hl); num_hosts = hostlist_count(hl); hostlist_destroy(hl); step_layout->node_list = buf; } else { step_layout->node_list = xstrdup(tlist); } step_layout->task_cnt = num_tasks; if (cluster_flags & CLUSTER_FLAG_FE) { /* Limited job step support on front-end systems. * All jobs execute through front-end on Blue Gene. * Normally we would not permit execution of job steps, * but can fake it by just allocating all tasks to * one of the allocated nodes. */ if ((cluster_flags & CLUSTER_FLAG_BG) || (cluster_flags & CLUSTER_FLAG_CRAY_A)) step_layout->node_cnt = num_hosts; else step_layout->node_cnt = 1; } else step_layout->node_cnt = num_hosts; if (_init_task_layout(step_layout, arbitrary_nodes, cpus_per_node, cpu_count_reps, cpus_per_task, task_dist, plane_size) != SLURM_SUCCESS) { slurm_step_layout_destroy(step_layout); step_layout = NULL; } xfree(arbitrary_nodes); return step_layout; }
/* * slurm_job_will_run - determine if a job would execute immediately if * submitted now * IN job_desc_msg - description of resource allocation request * RET 0 on success, otherwise return -1 and set errno to indicate the error */ int slurm_job_will_run (job_desc_msg_t *req) { will_run_response_msg_t *will_run_resp = NULL; char buf[64]; bool host_set = false; int rc; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *type = "processors"; if ((req->alloc_node == NULL) && (gethostname_short(buf, sizeof(buf)) == 0)) { req->alloc_node = buf; host_set = true; } rc = slurm_job_will_run2(req, &will_run_resp); if ((rc == 0) && will_run_resp) { if (cluster_flags & CLUSTER_FLAG_BG) type = "cnodes"; slurm_make_time_str(&will_run_resp->start_time, buf, sizeof(buf)); info("Job %u to start at %s using %u %s" " on %s", will_run_resp->job_id, buf, will_run_resp->proc_cnt, type, will_run_resp->node_list); if (will_run_resp->preemptee_job_id) { ListIterator itr; uint32_t *job_id_ptr; char *job_list = NULL, *sep = ""; itr = list_iterator_create(will_run_resp-> preemptee_job_id); while ((job_id_ptr = list_next(itr))) { if (job_list) sep = ","; xstrfmtcat(job_list, "%s%u", sep, *job_id_ptr); } list_iterator_destroy(itr); info(" Preempts: %s", job_list); xfree(job_list); } slurm_free_will_run_response_msg(will_run_resp); } if (host_set) req->alloc_node = NULL; return rc; }
/* * Borrowed and modified from src/api/job_info.c */ void _sprint_range(char *str, uint32_t str_size, uint32_t lower, uint32_t upper) { char tmp[128]; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); snprintf(tmp, sizeof(tmp), "%u", lower); if (upper > 0) { char tmp2[128]; snprintf(tmp2, sizeof(tmp2), "%u", upper); snprintf(str, str_size, "%s-%s", tmp, tmp2); } else { snprintf(str, str_size, "%s", tmp); } }
/* * slurm_sprint_node_table - output information about a specific Slurm nodes * based upon message as loaded using slurm_load_node * IN node_ptr - an individual node information record pointer * IN node_scaling - number of nodes each node represents * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char * slurm_sprint_node_table (node_info_t * node_ptr, int node_scaling, int one_liner ) { uint16_t my_state = node_ptr->node_state; char *cloud_str = "", *comp_str = "", *drain_str = "", *power_str = ""; char load_str[32], tmp_line[512], time_str[32]; char *out = NULL, *reason_str = NULL, *select_reason_str = NULL; uint16_t err_cpus = 0, alloc_cpus = 0; int cpus_per_node = 1; int total_used = node_ptr->cpus; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (node_scaling) cpus_per_node = node_ptr->cpus / node_scaling; if (my_state & NODE_STATE_CLOUD) { my_state &= (~NODE_STATE_CLOUD); cloud_str = "+CLOUD"; } if (my_state & NODE_STATE_COMPLETING) { my_state &= (~NODE_STATE_COMPLETING); comp_str = "+COMPLETING"; } if (my_state & NODE_STATE_DRAIN) { my_state &= (~NODE_STATE_DRAIN); drain_str = "+DRAIN"; } if (my_state & NODE_STATE_POWER_SAVE) { my_state &= (~NODE_STATE_POWER_SAVE); power_str = "+POWER"; } slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_SUBCNT, NODE_STATE_ALLOCATED, &alloc_cpus); if (cluster_flags & CLUSTER_FLAG_BG) { if (!alloc_cpus && (IS_NODE_ALLOCATED(node_ptr) || IS_NODE_COMPLETING(node_ptr))) alloc_cpus = node_ptr->cpus; else alloc_cpus *= cpus_per_node; } total_used -= alloc_cpus; slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_SUBCNT, NODE_STATE_ERROR, &err_cpus); if (cluster_flags & CLUSTER_FLAG_BG) err_cpus *= cpus_per_node; total_used -= err_cpus; if ((alloc_cpus && err_cpus) || (total_used && (total_used != node_ptr->cpus))) { my_state &= NODE_STATE_FLAGS; my_state |= NODE_STATE_MIXED; } /****** Line 1 ******/ snprintf(tmp_line, sizeof(tmp_line), "NodeName=%s ", node_ptr->name); xstrcat(out, tmp_line); if (cluster_flags & CLUSTER_FLAG_BG) { slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_RACK_MP, 0, &select_reason_str); if (select_reason_str) { xstrfmtcat(out, "RackMidplane=%s ", select_reason_str); xfree(select_reason_str); } } if (node_ptr->arch) { snprintf(tmp_line, sizeof(tmp_line), "Arch=%s ", node_ptr->arch); xstrcat(out, tmp_line); } snprintf(tmp_line, sizeof(tmp_line), "CoresPerSocket=%u", node_ptr->cores); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 2 ******/ if (node_ptr->cpu_load == NO_VAL) strcpy(load_str, "N/A"); else { snprintf(load_str, sizeof(load_str), "%.2f", (node_ptr->cpu_load / 100.0)); } snprintf(tmp_line, sizeof(tmp_line), "CPUAlloc=%u CPUErr=%u CPUTot=%u CPULoad=%s Features=%s", alloc_cpus, err_cpus, node_ptr->cpus, load_str, node_ptr->features); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 3 ******/ snprintf(tmp_line, sizeof(tmp_line), "Gres=%s",node_ptr->gres); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 4 (optional) ******/ if (node_ptr->node_hostname || node_ptr->node_addr) { snprintf(tmp_line, sizeof(tmp_line), "NodeAddr=%s NodeHostName=%s", node_ptr->node_addr, node_ptr->node_hostname); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); } /****** Line 5 ******/ if (node_ptr->os) { snprintf(tmp_line, sizeof(tmp_line), "OS=%s ", node_ptr->os); xstrcat(out, tmp_line); } snprintf(tmp_line, sizeof(tmp_line), "RealMemory=%u Sockets=%u Boards=%u", node_ptr->real_memory, node_ptr->sockets, node_ptr->boards); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 6 ******/ snprintf(tmp_line, sizeof(tmp_line), "State=%s%s%s%s%s ThreadsPerCore=%u TmpDisk=%u Weight=%u", node_state_string(my_state), cloud_str, comp_str, drain_str, power_str, node_ptr->threads, node_ptr->tmp_disk, node_ptr->weight); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 7 ******/ if (node_ptr->boot_time) { slurm_make_time_str ((time_t *)&node_ptr->boot_time, time_str, sizeof(time_str)); } else { strncpy(time_str, "None", sizeof(time_str)); } snprintf(tmp_line, sizeof(tmp_line), "BootTime=%s ", time_str); xstrcat(out, tmp_line); if (node_ptr->slurmd_start_time) { slurm_make_time_str ((time_t *)&node_ptr->slurmd_start_time, time_str, sizeof(time_str)); } else { strncpy(time_str, "None", sizeof(time_str)); } snprintf(tmp_line, sizeof(tmp_line), "SlurmdStartTime=%s", time_str); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** power Line ******/ if (node_ptr->energy->current_watts == NO_VAL) snprintf(tmp_line, sizeof(tmp_line), "CurrentWatts=n/s " "LowestJoules=n/s ConsumedJoules=n/s"); else snprintf(tmp_line, sizeof(tmp_line), "CurrentWatts=%u " "LowestJoules=%u ConsumedJoules=%u", node_ptr->energy->current_watts, node_ptr->energy->base_watts, node_ptr->energy->consumed_energy); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 8 ******/ if (node_ptr->reason && node_ptr->reason[0]) xstrcat(reason_str, node_ptr->reason); slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_EXTRA_INFO, 0, &select_reason_str); if (select_reason_str && select_reason_str[0]) { if (reason_str) xstrcat(reason_str, "\n"); xstrcat(reason_str, select_reason_str); } xfree(select_reason_str); if (reason_str) { int inx = 1; char *save_ptr = NULL, *tok, *user_name; tok = strtok_r(reason_str, "\n", &save_ptr); while (tok) { if (inx == 1) { xstrcat(out, "Reason="); } else { if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); xstrcat(out, " "); } snprintf(tmp_line, sizeof(tmp_line), "%s", tok); xstrcat(out, tmp_line); if ((inx++ == 1) && node_ptr->reason_time) { user_name = uid_to_string(node_ptr->reason_uid); slurm_make_time_str((time_t *)&node_ptr->reason_time, time_str,sizeof(time_str)); snprintf(tmp_line, sizeof(tmp_line), " [%s@%s]", user_name, time_str); xstrcat(out, tmp_line); } tok = strtok_r(NULL, "\n", &save_ptr); } xfree(reason_str); } if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }
/* * parse_command_line, fill in params data structure with data */ extern void parse_command_line(int argc, char *argv[]) { char *env_val = NULL; int opt_char; int option_index; hostlist_t host_list; static struct option long_options[] = { {"all", no_argument, 0, 'a'}, {"bg", no_argument, 0, 'b'}, {"dead", no_argument, 0, 'd'}, {"exact", no_argument, 0, 'e'}, {"noheader", no_argument, 0, 'h'}, {"iterate", required_argument, 0, 'i'}, {"long", no_argument, 0, 'l'}, {"cluster", required_argument, 0, 'M'}, {"clusters", required_argument, 0, 'M'}, {"nodes", required_argument, 0, 'n'}, {"Node", no_argument, 0, 'N'}, {"format", required_argument, 0, 'o'}, {"partition", required_argument, 0, 'p'}, {"responding",no_argument, 0, 'r'}, {"list-reasons", no_argument, 0, 'R'}, {"summarize", no_argument, 0, 's'}, {"sort", required_argument, 0, 'S'}, {"states", required_argument, 0, 't'}, {"reservation",no_argument, 0, 'T'}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {"help", no_argument, 0, OPT_LONG_HELP}, {"usage", no_argument, 0, OPT_LONG_USAGE}, {"hide", no_argument, 0, OPT_LONG_HIDE}, {NULL, 0, 0, 0} }; if (getenv("SINFO_ALL")) params.all_flag = true; if ( ( env_val = getenv("SINFO_PARTITION") ) ) { params.partition = xstrdup(env_val); params.all_flag = true; } if ( ( env_val = getenv("SINFO_SORT") ) ) params.sort = xstrdup(env_val); if ( ( env_val = getenv("SLURM_CLUSTERS") ) ) { if (!(params.clusters = slurmdb_get_info_cluster(env_val))) { error("'%s' can't be reached now, " "or it is an invalid entry for " "SLURM_CLUSTERS. Use 'sacctmgr --list " "cluster' to see available clusters.", env_val); exit(1); } working_cluster_rec = list_peek(params.clusters); } while((opt_char = getopt_long(argc, argv, "abdehi:lM:n:No:p:rRsS:t:TvV", long_options, &option_index)) != -1) { switch (opt_char) { case (int)'?': fprintf(stderr, "Try \"sinfo --help\" for more information\n"); exit(1); break; case (int)'a': params.all_flag = true; break; case (int)'b': params.cluster_flags = slurmdb_setup_cluster_flags(); if (params.cluster_flags & CLUSTER_FLAG_BG) params.bg_flag = true; else { error("Must be on a BG system to use --bg " "option, if using --cluster option " "put the --bg option " "after the --cluster option."); exit(1); } break; case (int)'d': params.dead_nodes = true; break; case (int)'e': params.exact_match = true; break; case (int)'h': params.no_header = true; break; case (int) 'i': params.iterate= atoi(optarg); if (params.iterate <= 0) { error ("Error: invalid entry for " "--iterate=%s", optarg); exit(1); } break; case (int) 'l': params.long_output = true; break; case (int) 'M': if (params.clusters) list_destroy(params.clusters); if (!(params.clusters = slurmdb_get_info_cluster(optarg))) { error("'%s' can't be reached now, " "or it is an invalid entry for " "--cluster. Use 'sacctmgr --list " "cluster' to see available clusters.", optarg); exit(1); } working_cluster_rec = list_peek(params.clusters); break; case (int) 'n': xfree(params.nodes); params.nodes = xstrdup(optarg); /* * confirm valid nodelist entry */ host_list = hostlist_create(params.nodes); if (!host_list) { error("'%s' invalid entry for --nodes", optarg); exit(1); } if (hostlist_count(host_list) == 1) params.node_name_single = true; else params.node_name_single = false; hostlist_destroy(host_list); break; case (int) 'N': params.node_flag = true; break; case (int) 'o': xfree(params.format); params.format = xstrdup(optarg); break; case (int) 'p': xfree(params.partition); params.partition = xstrdup(optarg); params.all_flag = true; break; case (int) 'r': params.responding_nodes = true; break; case (int) 'R': params.list_reasons = true; break; case (int) 's': params.summarize = true; break; case (int) 'S': xfree(params.sort); params.sort = xstrdup(optarg); break; case (int) 't': xfree(params.states); params.states = xstrdup(optarg); if (!(params.state_list = _build_state_list(optarg))) { error ("valid states: %s", _node_state_list ()); exit (1); } break; case (int) 'T': params.reservation_flag = true; break; case (int) 'v': params.verbose++; break; case (int) 'V': print_slurm_version (); exit(0); case (int) OPT_LONG_HELP: _help(); exit(0); case (int) OPT_LONG_USAGE: _usage(); exit(0); case OPT_LONG_HIDE: params.all_flag = false; break; } } params.cluster_flags = slurmdb_setup_cluster_flags(); if ( params.format == NULL ) { if ( params.summarize ) { params.part_field_flag = true; /* compute size later */ if (params.cluster_flags & CLUSTER_FLAG_BG) params.format = "%9P %.5a %.10l %.32F %N"; else params.format = "%9P %.5a %.10l %.16F %N"; } else if ( params.node_flag ) { params.node_field_flag = true; /* compute size later */ params.part_field_flag = true; /* compute size later */ params.format = params.long_output ? "%N %.6D %.9P %.11T %.4c %.8z %.6m %.8d %.6w %.8f %20E" : "%N %.6D %.9P %6t"; } else if (params.list_reasons) { params.format = params.long_output ? "%20E %12U %19H %6t %N" : "%20E %9u %19H %N"; } else if ((env_val = getenv ("SINFO_FORMAT"))) { params.format = xstrdup(env_val); } else { params.part_field_flag = true; /* compute size later */ params.format = params.long_output ? "%9P %.5a %.10l %.10s %.4r %.5h %.10g %.6D %.11T %N" : "%9P %.5a %.10l %.6D %.6t %N"; } } _parse_format( params.format ); if (params.list_reasons && (params.state_list == NULL)) { params.states = xstrdup ("down,drain,error"); if (!(params.state_list = _build_state_list (params.states))) fatal ("Unable to build state list for -R!"); } if (params.dead_nodes || params.nodes || params.partition || params.responding_nodes ||params.state_list) params.filtering = true; if (params.verbose) _print_options(); }
/* * slurm_sprint_partition_info - output information about a specific Slurm * partition based upon message as loaded using slurm_load_partitions * IN part_ptr - an individual partition information record pointer * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char *slurm_sprint_partition_info ( partition_info_t * part_ptr, int one_liner ) { char tmp[16]; char *out = NULL; char *allow_deny, *value; uint16_t force, preempt_mode, val; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *line_end = (one_liner) ? " " : "\n "; /****** Line 1 ******/ xstrfmtcat(out, "PartitionName=%s", part_ptr->name); xstrcat(out, line_end); /****** Line 2 ******/ if ((part_ptr->allow_groups == NULL) || (part_ptr->allow_groups[0] == '\0')) xstrcat(out, "AllowGroups=ALL"); else { xstrfmtcat(out, "AllowGroups=%s", part_ptr->allow_groups); } if (part_ptr->allow_accounts || !part_ptr->deny_accounts) { allow_deny = "Allow"; if ((part_ptr->allow_accounts == NULL) || (part_ptr->allow_accounts[0] == '\0')) value = "ALL"; else value = part_ptr->allow_accounts; } else { allow_deny = "Deny"; value = part_ptr->deny_accounts; } xstrfmtcat(out, " %sAccounts=%s", allow_deny, value); if (part_ptr->allow_qos || !part_ptr->deny_qos) { allow_deny = "Allow"; if ((part_ptr->allow_qos == NULL) || (part_ptr->allow_qos[0] == '\0')) value = "ALL"; else value = part_ptr->allow_qos; } else { allow_deny = "Deny"; value = part_ptr->deny_qos; } xstrfmtcat(out, " %sQos=%s", allow_deny, value); xstrcat(out, line_end); /****** Line 3 ******/ if (part_ptr->allow_alloc_nodes == NULL) xstrcat(out, "AllocNodes=ALL"); else xstrfmtcat(out, "AllocNodes=%s", part_ptr->allow_alloc_nodes); if (part_ptr->alternate != NULL) { xstrfmtcat(out, " Alternate=%s", part_ptr->alternate); } if (part_ptr->flags & PART_FLAG_DEFAULT) xstrcat(out, " Default=YES"); else xstrcat(out, " Default=NO"); if (part_ptr->qos_char) xstrfmtcat(out, " QoS=%s", part_ptr->qos_char); else xstrcat(out, " QoS=N/A"); xstrcat(out, line_end); /****** Line 4 added here for BG partitions only ****** to maintain alphabetized output ******/ if (cluster_flags & CLUSTER_FLAG_BG) { xstrfmtcat(out, "Midplanes=%s", part_ptr->nodes); xstrcat(out, line_end); } /****** Line 5 ******/ if (part_ptr->default_time == INFINITE) xstrcat(out, "DefaultTime=UNLIMITED"); else if (part_ptr->default_time == NO_VAL) xstrcat(out, "DefaultTime=NONE"); else { char time_line[32]; secs2time_str(part_ptr->default_time * 60, time_line, sizeof(time_line)); xstrfmtcat(out, "DefaultTime=%s", time_line); } if (part_ptr->flags & PART_FLAG_NO_ROOT) xstrcat(out, " DisableRootJobs=YES"); else xstrcat(out, " DisableRootJobs=NO"); if (part_ptr->flags & PART_FLAG_EXCLUSIVE_USER) xstrcat(out, " ExclusiveUser=YES"); else xstrcat(out, " ExclusiveUser=NO"); xstrfmtcat(out, " GraceTime=%u", part_ptr->grace_time); if (part_ptr->flags & PART_FLAG_HIDDEN) xstrcat(out, " Hidden=YES"); else xstrcat(out, " Hidden=NO"); xstrcat(out, line_end); /****** Line 6 ******/ if (part_ptr->max_nodes == INFINITE) xstrcat(out, "MaxNodes=UNLIMITED"); else { if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)part_ptr->max_nodes, tmp, sizeof(tmp), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); xstrfmtcat(out, "MaxNodes=%s", tmp); } else xstrfmtcat(out, "MaxNodes=%u", part_ptr->max_nodes); } if (part_ptr->max_time == INFINITE) xstrcat(out, " MaxTime=UNLIMITED"); else { char time_line[32]; secs2time_str(part_ptr->max_time * 60, time_line, sizeof(time_line)); xstrfmtcat(out, " MaxTime=%s", time_line); } if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)part_ptr->min_nodes, tmp, sizeof(tmp), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); xstrfmtcat(out, " MinNodes=%s", tmp); } else xstrfmtcat(out, " MinNodes=%u", part_ptr->min_nodes); if (part_ptr->flags & PART_FLAG_LLN) xstrcat(out, " LLN=YES"); else xstrcat(out, " LLN=NO"); if (part_ptr->max_cpus_per_node == INFINITE) xstrcat(out, " MaxCPUsPerNode=UNLIMITED"); else { xstrfmtcat(out, " MaxCPUsPerNode=%u", part_ptr->max_cpus_per_node); } xstrcat(out, line_end); /****** Line added here for non BG nodes to keep with alphabetized output******/ if (!(cluster_flags & CLUSTER_FLAG_BG)) { xstrfmtcat(out, "Nodes=%s", part_ptr->nodes); xstrcat(out, line_end); } /****** Line 7 ******/ xstrfmtcat(out, "PriorityJobFactor=%u", part_ptr->priority_job_factor); xstrfmtcat(out, " PriorityTier=%u", part_ptr->priority_tier); if (part_ptr->flags & PART_FLAG_ROOT_ONLY) xstrcat(out, " RootOnly=YES"); else xstrcat(out, " RootOnly=NO"); if (part_ptr->flags & PART_FLAG_REQ_RESV) xstrcat(out, " ReqResv=YES"); else xstrcat(out, " ReqResv=NO"); force = part_ptr->max_share & SHARED_FORCE; val = part_ptr->max_share & (~SHARED_FORCE); if (val == 0) xstrcat(out, " OverSubscribe=EXCLUSIVE"); else if (force) xstrfmtcat(out, " OverSubscribe=FORCE:%u", val); else if (val == 1) xstrcat(out, " OverSubscribe=NO"); else xstrfmtcat(out, " OverSubscribe=YES:%u", val); xstrcat(out, line_end); /****** Line ******/ if (part_ptr->over_time_limit == NO_VAL16) xstrfmtcat(out, "OverTimeLimit=NONE"); else if (part_ptr->over_time_limit == (uint16_t) INFINITE) xstrfmtcat(out, "OverTimeLimit=UNLIMITED"); else xstrfmtcat(out, "OverTimeLimit=%u", part_ptr->over_time_limit); preempt_mode = part_ptr->preempt_mode; if (preempt_mode == NO_VAL16) preempt_mode = slurm_get_preempt_mode(); /* use cluster param */ xstrfmtcat(out, " PreemptMode=%s", preempt_mode_string(preempt_mode)); xstrcat(out, line_end); /****** Line ******/ if (part_ptr->state_up == PARTITION_UP) xstrcat(out, "State=UP"); else if (part_ptr->state_up == PARTITION_DOWN) xstrcat(out, "State=DOWN"); else if (part_ptr->state_up == PARTITION_INACTIVE) xstrcat(out, "State=INACTIVE"); else if (part_ptr->state_up == PARTITION_DRAIN) xstrcat(out, "State=DRAIN"); else xstrcat(out, "State=UNKNOWN"); if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)part_ptr->total_cpus, tmp, sizeof(tmp), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); xstrfmtcat(out, " TotalCPUs=%s", tmp); } else xstrfmtcat(out, " TotalCPUs=%u", part_ptr->total_cpus); if (cluster_flags & CLUSTER_FLAG_BG) { convert_num_unit((float)part_ptr->total_nodes, tmp, sizeof(tmp), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); xstrfmtcat(out, " TotalNodes=%s", tmp); } else xstrfmtcat(out, " TotalNodes=%u", part_ptr->total_nodes); xstrfmtcat(out, " SelectTypeParameters=%s", select_type_param_string(part_ptr->cr_type)); xstrcat(out, line_end); /****** Line 9 ******/ if (part_ptr->def_mem_per_cpu & MEM_PER_CPU) { if (part_ptr->def_mem_per_cpu == MEM_PER_CPU) { xstrcat(out, "DefMemPerCPU=UNLIMITED"); } else { xstrfmtcat(out, "DefMemPerCPU=%"PRIu64"", part_ptr->def_mem_per_cpu & (~MEM_PER_CPU)); } } else if (part_ptr->def_mem_per_cpu == 0) { xstrcat(out, "DefMemPerNode=UNLIMITED"); } else { xstrfmtcat(out, "DefMemPerNode=%"PRIu64"", part_ptr->def_mem_per_cpu); } if (part_ptr->max_mem_per_cpu & MEM_PER_CPU) { if (part_ptr->max_mem_per_cpu == MEM_PER_CPU) { xstrcat(out, " MaxMemPerCPU=UNLIMITED"); } else { xstrfmtcat(out, " MaxMemPerCPU=%"PRIu64"", part_ptr->max_mem_per_cpu & (~MEM_PER_CPU)); } } else if (part_ptr->max_mem_per_cpu == 0) { xstrcat(out, " MaxMemPerNode=UNLIMITED"); } else { xstrfmtcat(out, " MaxMemPerNode=%"PRIu64"", part_ptr->max_mem_per_cpu); } /****** Line 10 ******/ if (part_ptr->billing_weights_str) { xstrcat(out, line_end); xstrfmtcat(out, "TRESBillingWeights=%s", part_ptr->billing_weights_str); } if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }
/* * slurm_load_slurmd_status - issue RPC to get the status of slurmd * daemon on this machine * IN slurmd_info_ptr - place to store slurmd status information * RET 0 or -1 on error * NOTE: free the response using slurm_free_slurmd_status() */ extern int slurm_load_slurmd_status(slurmd_status_t **slurmd_status_ptr) { int rc; slurm_msg_t req_msg; slurm_msg_t resp_msg; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *this_addr; slurm_msg_t_init(&req_msg); slurm_msg_t_init(&resp_msg); if (cluster_flags & CLUSTER_FLAG_MULTSD) { if ((this_addr = getenv("SLURMD_NODENAME"))) { slurm_conf_get_addr(this_addr, &req_msg.address); } else { this_addr = "localhost"; slurm_set_addr(&req_msg.address, (uint16_t)slurm_get_slurmd_port(), this_addr); } } else { char this_host[256]; /* * Set request message address to slurmd on localhost */ gethostname_short(this_host, sizeof(this_host)); this_addr = slurm_conf_get_nodeaddr(this_host); if (this_addr == NULL) this_addr = xstrdup("localhost"); slurm_set_addr(&req_msg.address, (uint16_t)slurm_get_slurmd_port(), this_addr); xfree(this_addr); } req_msg.msg_type = REQUEST_DAEMON_STATUS; req_msg.data = NULL; rc = slurm_send_recv_node_msg(&req_msg, &resp_msg, 0); if ((rc != 0) || !resp_msg.auth_cred) { error("slurm_slurmd_info: %m"); if (resp_msg.auth_cred) g_slurm_auth_destroy(resp_msg.auth_cred); return SLURM_ERROR; } if (resp_msg.auth_cred) g_slurm_auth_destroy(resp_msg.auth_cred); switch (resp_msg.msg_type) { case RESPONSE_SLURMD_STATUS: *slurmd_status_ptr = (slurmd_status_t *) resp_msg.data; break; case RESPONSE_SLURM_RC: rc = ((return_code_msg_t *) resp_msg.data)->return_code; slurm_free_return_code_msg(resp_msg.data); if (rc) slurm_seterrno_ret(rc); break; default: slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); break; } return SLURM_PROTOCOL_SUCCESS; }
extern void *slurm_ctl_conf_2_key_pairs (slurm_ctl_conf_t* slurm_ctl_conf_ptr) { List ret_list = NULL; config_key_pair_t *key_pair; char tmp_str[128]; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if ( slurm_ctl_conf_ptr == NULL ) return NULL; ret_list = list_create(destroy_config_key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageBackupHost"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_backup_host); list_append(ret_list, key_pair); accounting_enforce_string(slurm_ctl_conf_ptr-> accounting_storage_enforce, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageEnforce"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageHost"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_host); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageLoc"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_loc); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->accounting_storage_port); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStoragePort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStorageUser"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->accounting_storage_user); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AccountingStoreJobComment"); if (slurm_ctl_conf_ptr->acctng_store_job_comment) key_pair->value = xstrdup("YES"); else key_pair->value = xstrdup("NO"); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AcctGatherEnergyType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_energy_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AcctGatherFilesystemType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_filesystem_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AcctGatherInfinibandType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_infiniband_type); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->acct_gather_node_freq); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AcctGatherNodeFreq"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AcctGatherProfileType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->acct_gather_profile_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AuthInfo"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->authinfo); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("AuthType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->authtype); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("BackupAddr"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->backup_addr); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("BackupController"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->backup_controller); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->batch_start_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("BatchStartTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); slurm_make_time_str((time_t *)&slurm_ctl_conf_ptr->boot_time, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("BOOT_TIME"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("CacheGroups"); if (slurm_ctl_conf_ptr->group_info & GROUP_CACHE) key_pair->value = xstrdup("1"); else key_pair->value = xstrdup("0"); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("CheckpointType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->checkpoint_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ClusterName"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->cluster_name); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->complete_wait); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("CompleteWait"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ControlAddr"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->control_addr); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ControlMachine"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->control_machine); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("CryptoType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->crypto_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("DebugFlags"); key_pair->value = debug_flags2str(slurm_ctl_conf_ptr->debug_flags); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->def_mem_per_cpu & MEM_PER_CPU) { key_pair->name = xstrdup("DefMemPerCPU"); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->def_mem_per_cpu & (~MEM_PER_CPU)); key_pair->value = xstrdup(tmp_str); } else if (slurm_ctl_conf_ptr->def_mem_per_cpu) { key_pair->name = xstrdup("DefMemPerNode"); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->def_mem_per_cpu); key_pair->value = xstrdup(tmp_str); } else { key_pair->name = xstrdup("DefMemPerNode"); key_pair->value = xstrdup("UNLIMITED"); } key_pair = xmalloc(sizeof(config_key_pair_t)); list_append(ret_list, key_pair); key_pair->name = xstrdup("DisableRootJobs"); if (slurm_ctl_conf_ptr->disable_root_jobs) key_pair->value = xstrdup("YES"); else key_pair->value = xstrdup("NO"); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->dynalloc_port); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("DynAllocPort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); list_append(ret_list, key_pair); key_pair->name = xstrdup("EnforcePartLimits"); if (slurm_ctl_conf_ptr->enforce_part_limits) key_pair->value = xstrdup("YES"); else key_pair->value = xstrdup("NO"); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("Epilog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->epilog); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u usec", slurm_ctl_conf_ptr->epilog_msg_time); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("EpilogMsgTime"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("EpilogSlurmctld"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->epilog_slurmctld); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ExtSensorsType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->ext_sensors_type); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->ext_sensors_freq); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ExtSensorsFreq"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); if (strcmp(slurm_ctl_conf_ptr->priority_type, "priority/basic")) { snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->fs_dampening_factor); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("FairShareDampeningFactor"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); } snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->fast_schedule); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("FastSchedule"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->first_job_id); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("FirstJobId"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->get_env_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("GetEnvTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("GresTypes"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->gres_plugins); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("GroupUpdateForce"); if (slurm_ctl_conf_ptr->group_info & GROUP_FORCE) key_pair->value = xstrdup("1"); else key_pair->value = xstrdup("0"); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->group_info & GROUP_TIME_MASK); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("GroupUpdateTime"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->hash_val != NO_VAL) { if (slurm_ctl_conf_ptr->hash_val == slurm_get_hash_val()) snprintf(tmp_str, sizeof(tmp_str), "Match"); else { snprintf(tmp_str, sizeof(tmp_str), "Different Ours=0x%x Slurmctld=0x%x", slurm_get_hash_val(), slurm_ctl_conf_ptr->hash_val); } key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("HASH_VAL"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); } snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->health_check_interval); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("HealthCheckInterval"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("HealthCheckNodeState"); key_pair->value = health_check_node_state_str(slurm_ctl_conf_ptr-> health_check_node_state); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("HealthCheckProgram"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->health_check_program); list_append(ret_list, key_pair); if (cluster_flags & CLUSTER_FLAG_XCPU) { key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("HAVE_XCPU"); key_pair->value = xstrdup("1"); list_append(ret_list, key_pair); } snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->inactive_limit); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("InactiveLimit"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobAcctGatherFrequency"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_freq); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobAcctGatherType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobAcctGatherParams"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_acct_gather_params); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCheckpointDir"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_ckpt_dir); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCompHost"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_host); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCompLoc"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_loc); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->job_comp_port); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCompPort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCompType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCompUser"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_comp_user); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobContainerPlugin"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_container_plugin); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCredentialPrivateKey"); key_pair->value = xstrdup(slurm_ctl_conf_ptr-> job_credential_private_key); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobCredentialPublicCertificate"); key_pair->value = xstrdup( slurm_ctl_conf_ptr->job_credential_public_certificate); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->job_file_append); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobFileAppend"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->job_requeue); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobRequeue"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("JobSubmitPlugins"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->job_submit_plugins); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->keep_alive_time == (uint16_t) NO_VAL) snprintf(tmp_str, sizeof(tmp_str), "SYSTEM_DEFAULT"); else { snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->keep_alive_time); } key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("KeepAliveTime"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->kill_on_bad_exit); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("KillOnBadExit"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->kill_wait); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("KillWait"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("LaunchType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->launch_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("Licenses"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->licenses); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("LicensesUsed"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->licenses_used); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MailProg"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->mail_prog); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_array_sz); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MaxArraySize"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_job_cnt); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MaxJobCount"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_job_id); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MaxJobId"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->max_mem_per_cpu & MEM_PER_CPU) { key_pair->name = xstrdup("MaxMemPerCPU"); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_mem_per_cpu & (~MEM_PER_CPU)); key_pair->value = xstrdup(tmp_str); } else if (slurm_ctl_conf_ptr->max_mem_per_cpu) { key_pair->name = xstrdup("MaxMemPerNode"); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_mem_per_cpu); key_pair->value = xstrdup(tmp_str); } else { key_pair->name = xstrdup("MaxMemPerNode"); key_pair->value = xstrdup("UNLIMITED"); } snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_step_cnt); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MaxStepCount"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->max_tasks_per_node); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MaxTasksPerNode"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->msg_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MessageTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->min_job_age); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MinJobAge"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MpiDefault"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->mpi_default); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MpiParams"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->mpi_params); list_append(ret_list, key_pair); if (cluster_flags & CLUSTER_FLAG_MULTSD) { key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("MULTIPLE_SLURMD"); key_pair->value = xstrdup("1"); list_append(ret_list, key_pair); } snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->next_job_id); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("NEXT_JOB_ID"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->over_time_limit == (uint16_t) INFINITE) snprintf(tmp_str, sizeof(tmp_str), "UNLIMITED"); else snprintf(tmp_str, sizeof(tmp_str), "%u min", slurm_ctl_conf_ptr->over_time_limit); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("OverTimeLimit"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PluginDir"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->plugindir); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PlugStackConfig"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->plugstack); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PreemptMode"); key_pair->value = xstrdup(preempt_mode_string(slurm_ctl_conf_ptr-> preempt_mode)); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PreemptType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->preempt_type); list_append(ret_list, key_pair); if (strcmp(slurm_ctl_conf_ptr->priority_type, "priority/basic") == 0) { key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->priority_type); list_append(ret_list, key_pair); } else { secs2time_str((time_t) slurm_ctl_conf_ptr->priority_decay_hl, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityDecayHalfLife"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); secs2time_str((time_t)slurm_ctl_conf_ptr->priority_calc_period, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityCalcPeriod"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_favor_small); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityFavorSmall"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_flags); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityFlags"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); secs2time_str((time_t) slurm_ctl_conf_ptr->priority_max_age, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityMaxAge"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityUsageResetPeriod"); key_pair->value = xstrdup(_reset_period_str( slurm_ctl_conf_ptr-> priority_reset_period)); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->priority_type); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_weight_age); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityWeightAge"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_weight_fs); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityWeightFairShare"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_weight_js); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityWeightJobSize"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_weight_part); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityWeightPartition"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->priority_weight_qos); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PriorityWeightQOS"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); } private_data_string(slurm_ctl_conf_ptr->private_data, tmp_str, sizeof(tmp_str)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PrivateData"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ProctrackType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->proctrack_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("Prolog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->prolog); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PrologSlurmctld"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->prolog_slurmctld); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->propagate_prio_process); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PropagatePrioProcess"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PropagateResourceLimits"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->propagate_rlimits); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("PropagateResourceLimitsExcept"); key_pair->value = xstrdup(slurm_ctl_conf_ptr-> propagate_rlimits_except); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("RebootProgram"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->reboot_program); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ReconfigFlags"); key_pair->value = reconfig_flags2str(slurm_ctl_conf_ptr->reconfig_flags); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResumeProgram"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->resume_program); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u nodes/min", slurm_ctl_conf_ptr->resume_rate); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResumeRate"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->resume_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResumeTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResvEpilog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->resv_epilog); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->resv_over_run == (uint16_t) INFINITE) snprintf(tmp_str, sizeof(tmp_str), "UNLIMITED"); else snprintf(tmp_str, sizeof(tmp_str), "%u min", slurm_ctl_conf_ptr->resv_over_run); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResvOverRun"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ResvProlog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->resv_prolog); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->ret2service); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("ReturnToService"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SallocDefaultCommand"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->salloc_default_command); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SchedulerParameters"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->sched_params); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->schedport); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SchedulerPort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->schedrootfltr); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SchedulerRootFilter"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->sched_time_slice); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SchedulerTimeSlice"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SchedulerType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->schedtype); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SelectType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->select_type); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->select_type_param) { key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SelectTypeParameters"); key_pair->value = xstrdup( select_type_param_string(slurm_ctl_conf_ptr-> select_type_param)); list_append(ret_list, key_pair); } snprintf(tmp_str, sizeof(tmp_str), "%s(%u)", slurm_ctl_conf_ptr->slurm_user_name, slurm_ctl_conf_ptr->slurm_user_id); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmUser"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%s", log_num2string(slurm_ctl_conf_ptr->slurmctld_debug)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldDebug"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldLogFile"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_logfile); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmSchedLogFile"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->sched_logfile); list_append(ret_list, key_pair); if (slurm_ctl_conf_ptr->slurmctld_port_count > 1) { uint32_t high_port = slurm_ctl_conf_ptr->slurmctld_port; high_port += (slurm_ctl_conf_ptr->slurmctld_port_count - 1); snprintf(tmp_str, sizeof(tmp_str), "%u-%u", slurm_ctl_conf_ptr->slurmctld_port, high_port); } else { snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->slurmctld_port); } key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldPort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->slurmctld_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%s", log_num2string(slurm_ctl_conf_ptr->slurmd_debug)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdDebug"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdLogFile"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_logfile); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdPidFile"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_pidfile); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdPlugstack"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_plugstack); list_append(ret_list, key_pair); #ifndef MULTIPLE_SLURMD snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->slurmd_port); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdPort"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); #endif key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdSpoolDir"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmd_spooldir); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->slurmd_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%s(%u)", slurm_ctl_conf_ptr->slurmd_user_name, slurm_ctl_conf_ptr->slurmd_user_id); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmdUser"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->sched_log_level); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmSchedLogLevel"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldPidFile"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_pidfile); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SlurmctldPlugstack"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurmctld_plugstack); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SLURM_CONF"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->slurm_conf); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SLURM_VERSION"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->version); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SrunEpilog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->srun_epilog); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SrunProlog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->srun_prolog); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("StateSaveLocation"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->state_save_location); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendExcNodes"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_exc_nodes); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendExcParts"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_exc_parts); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendProgram"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->suspend_program); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u nodes/min", slurm_ctl_conf_ptr->suspend_rate); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendRate"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); if (!slurm_ctl_conf_ptr->suspend_time) snprintf(tmp_str, sizeof(tmp_str), "NONE"); else snprintf(tmp_str, sizeof(tmp_str), "%d sec", ((int)slurm_ctl_conf_ptr->suspend_time - 1)); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendTime"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->suspend_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SuspendTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("SwitchType"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->switch_type); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TaskEpilog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_epilog); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TaskPlugin"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_plugin); list_append(ret_list, key_pair); slurm_sprint_cpu_bind_type(tmp_str, slurm_ctl_conf_ptr->task_plugin_param); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TaskPluginParam"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TaskProlog"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->task_prolog); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TmpFS"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->tmp_fs); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TopologyPlugin"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->topology_plugin); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->track_wckey); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TrackWCKey"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->tree_width); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("TreeWidth"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u", slurm_ctl_conf_ptr->use_pam); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("UsePam"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("UnkillableStepProgram"); key_pair->value = xstrdup(slurm_ctl_conf_ptr->unkillable_program); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->unkillable_timeout); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("UnkillableStepTimeout"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u percent", slurm_ctl_conf_ptr->vsize_factor); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("VSizeFactor"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); snprintf(tmp_str, sizeof(tmp_str), "%u sec", slurm_ctl_conf_ptr->wait_time); key_pair = xmalloc(sizeof(config_key_pair_t)); key_pair->name = xstrdup("WaitTime"); key_pair->value = xstrdup(tmp_str); list_append(ret_list, key_pair); return (void *)ret_list; }
/* * Set in "dest" the environment variables strings relevant to a SLURM batch * job allocation, overwriting any environment variables of the same name. * If the address pointed to by "dest" is NULL, memory will automatically be * xmalloc'ed. The array is terminated by a NULL pointer, and thus is * suitable for use by execle() and other env_array_* functions. * * Sets the variables: * SLURM_JOB_ID * SLURM_JOB_NUM_NODES * SLURM_JOB_NODELIST * SLURM_JOB_CPUS_PER_NODE * ENVIRONMENT=BATCH * HOSTNAME * LOADLBATCH (AIX only) * * Sets OBSOLETE variables (needed for MPI, do not remove): * SLURM_JOBID * SLURM_NNODES * SLURM_NODELIST * SLURM_NTASKS * SLURM_TASKS_PER_NODE */ extern int env_array_for_batch_job(char ***dest, const batch_job_launch_msg_t *batch, const char *node_name) { char *tmp = NULL; uint32_t num_nodes = 0; uint32_t num_cpus = 0; int i; slurm_step_layout_t *step_layout = NULL; uint32_t num_tasks = batch->ntasks; uint16_t cpus_per_task; uint16_t task_dist; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); _setup_particulars(cluster_flags, dest, batch->select_jobinfo); /* There is no explicit node count in the batch structure, * so we need to calculate the node count. */ for (i = 0; i < batch->num_cpu_groups; i++) { num_nodes += batch->cpu_count_reps[i]; num_cpus += batch->cpu_count_reps[i] * batch->cpus_per_node[i]; } env_array_overwrite_fmt(dest, "SLURM_JOB_ID", "%u", batch->job_id); env_array_overwrite_fmt(dest, "SLURM_JOB_NUM_NODES", "%u", num_nodes); if(cluster_flags & CLUSTER_FLAG_BG) env_array_overwrite_fmt(dest, "SLURM_BG_NUM_NODES", "%u", num_nodes); env_array_overwrite_fmt(dest, "SLURM_JOB_NODELIST", "%s", batch->nodes); tmp = uint32_compressed_to_str(batch->num_cpu_groups, batch->cpus_per_node, batch->cpu_count_reps); env_array_overwrite_fmt(dest, "SLURM_JOB_CPUS_PER_NODE", "%s", tmp); xfree(tmp); env_array_overwrite_fmt(dest, "ENVIRONMENT", "BATCH"); if (node_name) env_array_overwrite_fmt(dest, "HOSTNAME", "%s", node_name); /* OBSOLETE, but needed by MPI, do not remove */ env_array_overwrite_fmt(dest, "SLURM_JOBID", "%u", batch->job_id); env_array_overwrite_fmt(dest, "SLURM_NNODES", "%u", num_nodes); env_array_overwrite_fmt(dest, "SLURM_NODELIST", "%s", batch->nodes); if((batch->cpus_per_task != 0) && (batch->cpus_per_task != (uint16_t) NO_VAL)) cpus_per_task = batch->cpus_per_task; else cpus_per_task = 1; /* default value */ if (cpus_per_task > 1) { env_array_overwrite_fmt(dest, "SLURM_CPUS_PER_TASK", "%u", cpus_per_task); } if(num_tasks) { env_array_overwrite_fmt(dest, "SLURM_NTASKS", "%u", num_tasks); /* keep around for old scripts */ env_array_overwrite_fmt(dest, "SLURM_NPROCS", "%u", num_tasks); } else { num_tasks = num_cpus / cpus_per_task; } if((tmp = getenvp(*dest, "SLURM_ARBITRARY_NODELIST"))) { task_dist = SLURM_DIST_ARBITRARY; } else { tmp = batch->nodes; task_dist = SLURM_DIST_BLOCK; } if(!(step_layout = slurm_step_layout_create(tmp, batch->cpus_per_node, batch->cpu_count_reps, num_nodes, num_tasks, cpus_per_task, task_dist, (uint16_t)NO_VAL))) return SLURM_ERROR; tmp = _uint16_array_to_str(step_layout->node_cnt, step_layout->tasks); slurm_step_layout_destroy(step_layout); env_array_overwrite_fmt(dest, "SLURM_TASKS_PER_NODE", "%s", tmp); xfree(tmp); return SLURM_SUCCESS; }
/* * slurm_pack_job_will_run - determine if a heterogenous job would execute * immediately if submitted now * IN job_req_list - List of job_desc_msg_t structures describing the resource * allocation request * RET 0 on success, otherwise return -1 and set errno to indicate the error */ extern int slurm_pack_job_will_run(List job_req_list) { job_desc_msg_t *req; will_run_response_msg_t *will_run_resp; char buf[64], local_hostname[64] = "", *sep = ""; int rc = SLURM_SUCCESS; char *type = "processors"; ListIterator iter, itr; time_t first_start = (time_t) 0; uint32_t first_job_id = 0, tot_proc_count = 0, *job_id_ptr; hostset_t hs = NULL; char *job_list = NULL; if (!job_req_list || (list_count(job_req_list) == 0)) { error("No job descriptors input"); return SLURM_ERROR; } (void) gethostname_short(local_hostname, sizeof(local_hostname)); iter = list_iterator_create(job_req_list); while ((req = (job_desc_msg_t *) list_next(iter))) { if ((req->alloc_node == NULL) && local_hostname[0]) req->alloc_node = local_hostname; will_run_resp = NULL; rc = slurm_job_will_run2(req, &will_run_resp); if ((rc == SLURM_SUCCESS) && will_run_resp) { if (first_job_id == 0) first_job_id = will_run_resp->job_id; if ((first_start == 0) || (first_start < will_run_resp->start_time)) first_start = will_run_resp->start_time; tot_proc_count += will_run_resp->proc_cnt; if (hs) hostset_insert(hs, will_run_resp->node_list); else hs = hostset_create(will_run_resp->node_list); if (will_run_resp->preemptee_job_id) { itr = list_iterator_create(will_run_resp-> preemptee_job_id); while ((job_id_ptr = list_next(itr))) { if (job_list) sep = ","; xstrfmtcat(job_list, "%s%u", sep, *job_id_ptr); } list_iterator_destroy(itr); } slurm_free_will_run_response_msg(will_run_resp); } if (req->alloc_node == local_hostname) req->alloc_node = NULL; if (rc != SLURM_SUCCESS) break; } list_iterator_destroy(iter); if (rc == SLURM_SUCCESS) { uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char node_list[1028] = ""; if (cluster_flags & CLUSTER_FLAG_BG) type = "cnodes"; if (hs) hostset_ranged_string(hs, sizeof(node_list), node_list); slurm_make_time_str(&first_start, buf, sizeof(buf)); info("Job %u to start at %s using %u %s on %s", first_job_id, buf, tot_proc_count, type, node_list); if (job_list) info(" Preempts: %s", job_list); } if (hs) hostset_destroy(hs); xfree(job_list); return rc; }
int setup_env(env_t *env, bool preserve_env) { int rc = SLURM_SUCCESS; char *dist = NULL, *lllp_dist = NULL; char addrbuf[INET_ADDRSTRLEN]; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (env == NULL) return SLURM_ERROR; if (env->task_pid && setenvf(&env->env, "SLURM_TASK_PID", "%d", (int)env->task_pid)) { error("Unable to set SLURM_TASK_PID environment variable"); rc = SLURM_FAILURE; } if (!preserve_env && env->ntasks) { if(setenvf(&env->env, "SLURM_NTASKS", "%d", env->ntasks)) { error("Unable to set SLURM_NTASKS " "environment variable"); rc = SLURM_FAILURE; } if(setenvf(&env->env, "SLURM_NPROCS", "%d", env->ntasks)) { error("Unable to set SLURM_NPROCS " "environment variable"); rc = SLURM_FAILURE; } } if (env->cpus_per_task && setenvf(&env->env, "SLURM_CPUS_PER_TASK", "%d", env->cpus_per_task) ) { error("Unable to set SLURM_CPUS_PER_TASK"); rc = SLURM_FAILURE; } if (env->ntasks_per_node && setenvf(&env->env, "SLURM_NTASKS_PER_NODE", "%d", env->ntasks_per_node) ) { error("Unable to set SLURM_NTASKS_PER_NODE"); rc = SLURM_FAILURE; } if (env->ntasks_per_socket && setenvf(&env->env, "SLURM_NTASKS_PER_SOCKET", "%d", env->ntasks_per_socket) ) { error("Unable to set SLURM_NTASKS_PER_SOCKET"); rc = SLURM_FAILURE; } if (env->ntasks_per_core && setenvf(&env->env, "SLURM_NTASKS_PER_CORE", "%d", env->ntasks_per_core) ) { error("Unable to set SLURM_NTASKS_PER_CORE"); rc = SLURM_FAILURE; } if (env->cpus_on_node && setenvf(&env->env, "SLURM_CPUS_ON_NODE", "%d", env->cpus_on_node) ) { error("Unable to set SLURM_CPUS_ON_NODE"); rc = SLURM_FAILURE; } _set_distribution(env->distribution, &dist, &lllp_dist); if(dist) if (setenvf(&env->env, "SLURM_DISTRIBUTION", "%s", dist)) { error("Can't set SLURM_DISTRIBUTION env variable"); rc = SLURM_FAILURE; } if(env->distribution == SLURM_DIST_PLANE) if (setenvf(&env->env, "SLURM_DIST_PLANESIZE", "%u", env->plane_size)) { error("Can't set SLURM_DIST_PLANESIZE " "env variable"); rc = SLURM_FAILURE; } if(lllp_dist) if (setenvf(&env->env, "SLURM_DIST_LLLP", "%s", lllp_dist)) { error("Can't set SLURM_DIST_LLLP env variable"); rc = SLURM_FAILURE; } if (env->cpu_bind_type) { char *str_verbose, *str_bind_type, *str_bind_list; char *str_bind; int len; if (env->batch_flag) { unsetenvp(env->env, "SBATCH_CPU_BIND_VERBOSE"); unsetenvp(env->env, "SBATCH_CPU_BIND_TYPE"); unsetenvp(env->env, "SBATCH_CPU_BIND_LIST"); unsetenvp(env->env, "SBATCH_CPU_BIND"); } else { unsetenvp(env->env, "SLURM_CPU_BIND_VERBOSE"); unsetenvp(env->env, "SLURM_CPU_BIND_TYPE"); unsetenvp(env->env, "SLURM_CPU_BIND_LIST"); unsetenvp(env->env, "SLURM_CPU_BIND"); } str_verbose = xstrdup (""); if (env->cpu_bind_type & CPU_BIND_VERBOSE) { xstrcat(str_verbose, "verbose"); } else { xstrcat(str_verbose, "quiet"); } str_bind_type = xstrdup (""); if (env->cpu_bind_type & CPU_BIND_TO_THREADS) { xstrcat(str_bind_type, "threads,"); } else if (env->cpu_bind_type & CPU_BIND_TO_CORES) { xstrcat(str_bind_type, "cores,"); } else if (env->cpu_bind_type & CPU_BIND_TO_SOCKETS) { xstrcat(str_bind_type, "sockets,"); } else if (env->cpu_bind_type & CPU_BIND_TO_LDOMS) { xstrcat(str_bind_type, "ldoms,"); } if (env->cpu_bind_type & CPU_BIND_NONE) { xstrcat(str_bind_type, "none"); } else if (env->cpu_bind_type & CPU_BIND_RANK) { xstrcat(str_bind_type, "rank"); } else if (env->cpu_bind_type & CPU_BIND_MAP) { xstrcat(str_bind_type, "map_cpu:"); } else if (env->cpu_bind_type & CPU_BIND_MASK) { xstrcat(str_bind_type, "mask_cpu:"); } else if (env->cpu_bind_type & CPU_BIND_LDRANK) { xstrcat(str_bind_type, "rank_ldom"); } else if (env->cpu_bind_type & CPU_BIND_LDMAP) { xstrcat(str_bind_type, "map_ldom:"); } else if (env->cpu_bind_type & CPU_BIND_LDMASK) { xstrcat(str_bind_type, "mask_ldom:"); } len = strlen(str_bind_type); if (len) { /* remove a possible trailing ',' */ if (str_bind_type[len-1] == ',') { str_bind_type[len-1] = '\0'; } } str_bind_list = xstrdup (""); if (env->cpu_bind) { xstrcat(str_bind_list, env->cpu_bind); } str_bind = xstrdup (""); xstrcat(str_bind, str_verbose); if (str_bind[0] && str_bind_type && str_bind_type[0]) xstrcatchar(str_bind, ','); xstrcat(str_bind, str_bind_type); xstrcat(str_bind, str_bind_list); if (env->batch_flag) { if (setenvf(&env->env, "SBATCH_CPU_BIND_VERBOSE", str_verbose)) { error("Unable to set SBATCH_CPU_BIND_VERBOSE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_CPU_BIND_TYPE", str_bind_type)) { error("Unable to set SBATCH_CPU_BIND_TYPE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_CPU_BIND_LIST", str_bind_list)) { error("Unable to set SBATCH_CPU_BIND_LIST"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_CPU_BIND", str_bind)) { error("Unable to set SBATCH_CPU_BIND"); rc = SLURM_FAILURE; } } else { if (setenvf(&env->env, "SLURM_CPU_BIND_VERBOSE", str_verbose)) { error("Unable to set SLURM_CPU_BIND_VERBOSE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_CPU_BIND_TYPE", str_bind_type)) { error("Unable to set SLURM_CPU_BIND_TYPE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_CPU_BIND_LIST", str_bind_list)) { error("Unable to set SLURM_CPU_BIND_LIST"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_CPU_BIND", str_bind)) { error("Unable to set SLURM_CPU_BIND"); rc = SLURM_FAILURE; } } } if (env->mem_bind_type) { char *str_verbose, *str_bind_type, *str_bind_list; char *str_bind; if (env->batch_flag) { unsetenvp(env->env, "SBATCH_MEM_BIND_VERBOSE"); unsetenvp(env->env, "SBATCH_MEM_BIND_TYPE"); unsetenvp(env->env, "SBATCH_MEM_BIND_LIST"); unsetenvp(env->env, "SBATCH_MEM_BIND"); } else { unsetenvp(env->env, "SLURM_MEM_BIND_VERBOSE"); unsetenvp(env->env, "SLURM_MEM_BIND_TYPE"); unsetenvp(env->env, "SLURM_MEM_BIND_LIST"); unsetenvp(env->env, "SLURM_MEM_BIND"); } str_verbose = xstrdup (""); if (env->mem_bind_type & MEM_BIND_VERBOSE) { xstrcat(str_verbose, "verbose"); } else { xstrcat(str_verbose, "quiet"); } str_bind_type = xstrdup (""); if (env->mem_bind_type & MEM_BIND_NONE) { xstrcat(str_bind_type, "none"); } else if (env->mem_bind_type & MEM_BIND_RANK) { xstrcat(str_bind_type, "rank"); } else if (env->mem_bind_type & MEM_BIND_MAP) { xstrcat(str_bind_type, "map_mem:"); } else if (env->mem_bind_type & MEM_BIND_MASK) { xstrcat(str_bind_type, "mask_mem:"); } else if (env->mem_bind_type & MEM_BIND_LOCAL) { xstrcat(str_bind_type, "local"); } str_bind_list = xstrdup (""); if (env->mem_bind) { xstrcat(str_bind_list, env->mem_bind); } str_bind = xstrdup (""); xstrcat(str_bind, str_verbose); if (str_bind[0]) { /* add ',' if str_verbose */ xstrcatchar(str_bind, ','); } xstrcat(str_bind, str_bind_type); xstrcat(str_bind, str_bind_list); if (env->batch_flag) { if (setenvf(&env->env, "SBATCH_MEM_BIND_VERBOSE", str_verbose)) { error("Unable to set SBATCH_MEM_BIND_VERBOSE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_MEM_BIND_TYPE", str_bind_type)) { error("Unable to set SBATCH_MEM_BIND_TYPE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_MEM_BIND_LIST", str_bind_list)) { error("Unable to set SBATCH_MEM_BIND_LIST"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SBATCH_MEM_BIND", str_bind)) { error("Unable to set SBATCH_MEM_BIND"); rc = SLURM_FAILURE; } } else { if (setenvf(&env->env, "SLURM_MEM_BIND_VERBOSE", str_verbose)) { error("Unable to set SLURM_MEM_BIND_VERBOSE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_MEM_BIND_TYPE", str_bind_type)) { error("Unable to set SLURM_MEM_BIND_TYPE"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_MEM_BIND_LIST", str_bind_list)) { error("Unable to set SLURM_MEM_BIND_LIST"); rc = SLURM_FAILURE; } if (setenvf(&env->env, "SLURM_MEM_BIND", str_bind)) { error("Unable to set SLURM_MEM_BIND"); rc = SLURM_FAILURE; } } } if (env->overcommit && (setenvf(&env->env, "SLURM_OVERCOMMIT", "1"))) { error("Unable to set SLURM_OVERCOMMIT environment variable"); rc = SLURM_FAILURE; } if (env->slurmd_debug && setenvf(&env->env, "SLURMD_DEBUG", "%d", env->slurmd_debug)) { error("Can't set SLURMD_DEBUG environment variable"); rc = SLURM_FAILURE; } if (env->labelio && setenvf(&env->env, "SLURM_LABELIO", "1")) { error("Unable to set SLURM_LABELIO environment variable"); rc = SLURM_FAILURE; } if (env->select_jobinfo) { _setup_particulars(cluster_flags, &env->env, env->select_jobinfo); } if (env->jobid >= 0) { if (setenvf(&env->env, "SLURM_JOB_ID", "%d", env->jobid)) { error("Unable to set SLURM_JOB_ID environment"); rc = SLURM_FAILURE; } /* and for backwards compatability... */ if (setenvf(&env->env, "SLURM_JOBID", "%d", env->jobid)) { error("Unable to set SLURM_JOBID environment"); rc = SLURM_FAILURE; } } if (env->nodeid >= 0 && setenvf(&env->env, "SLURM_NODEID", "%d", env->nodeid)) { error("Unable to set SLURM_NODEID environment"); rc = SLURM_FAILURE; } if (env->procid >= 0 && setenvf(&env->env, "SLURM_PROCID", "%d", env->procid)) { error("Unable to set SLURM_PROCID environment"); rc = SLURM_FAILURE; } if (env->localid >= 0 && setenvf(&env->env, "SLURM_LOCALID", "%d", env->localid)) { error("Unable to set SLURM_LOCALID environment"); rc = SLURM_FAILURE; } if (env->stepid >= 0 && setenvf(&env->env, "SLURM_STEPID", "%d", env->stepid)) { error("Unable to set SLURM_STEPID environment"); rc = SLURM_FAILURE; } if (!preserve_env && env->nhosts && setenvf(&env->env, "SLURM_NNODES", "%d", env->nhosts)) { error("Unable to set SLURM_NNODES environment var"); rc = SLURM_FAILURE; } if (env->nodelist && setenvf(&env->env, "SLURM_NODELIST", "%s", env->nodelist)) { error("Unable to set SLURM_NODELIST environment var."); rc = SLURM_FAILURE; } if (!preserve_env && env->task_count && setenvf (&env->env, "SLURM_TASKS_PER_NODE", "%s", env->task_count)) { error ("Can't set SLURM_TASKS_PER_NODE env variable"); rc = SLURM_FAILURE; } if (env->comm_port && setenvf (&env->env, "SLURM_SRUN_COMM_PORT", "%u", env->comm_port)) { error ("Can't set SLURM_SRUN_COMM_PORT env variable"); rc = SLURM_FAILURE; } if (env->cli) { slurm_print_slurm_addr (env->cli, addrbuf, INET_ADDRSTRLEN); /* * XXX: Eventually, need a function for slurm_addrs that * returns just the IP address (not addr:port) */ if ((dist = strchr (addrbuf, ':')) != NULL) *dist = '\0'; setenvf (&env->env, "SLURM_LAUNCH_NODE_IPADDR", "%s", addrbuf); } if (env->sgtids && setenvf(&env->env, "SLURM_GTIDS", "%s", env->sgtids)) { error("Unable to set SLURM_GTIDS environment variable"); rc = SLURM_FAILURE; } if(cluster_flags & CLUSTER_FLAG_AIX) { char res_env[128]; char *debug_env = (char *)getenv("SLURM_LL_API_DEBUG"); int debug_num = 0; /* MP_POERESTART_ENV causes a warning message for "poe", but * is needed for "poerestart". Presently we have no means to * determine what command a user will execute. We could * possibly add a "srestart" command which would set * MP_POERESTART_ENV, but that presently seems unnecessary. */ /* setenvf(&env->env, "MP_POERESTART_ENV", res_env); */ if (debug_env) debug_num = atoi(debug_env); snprintf(res_env, sizeof(res_env), "SLURM_LL_API_DEBUG=%d", debug_num); /* Required for AIX/POE systems indicating pre-allocation */ setenvf(&env->env, "LOADLBATCH", "yes"); setenvf(&env->env, "LOADL_ACTIVE", "3.2.0"); } if (env->pty_port && setenvf(&env->env, "SLURM_PTY_PORT", "%hu", env->pty_port)) { error("Can't set SLURM_PTY_PORT env variable"); rc = SLURM_FAILURE; } if (env->ws_col && setenvf(&env->env, "SLURM_PTY_WIN_COL", "%hu", env->ws_col)) { error("Can't set SLURM_PTY_WIN_COL env variable"); rc = SLURM_FAILURE; } if (env->ws_row && setenvf(&env->env, "SLURM_PTY_WIN_ROW", "%hu", env->ws_row)) { error("Can't set SLURM_PTY_WIN_ROW env variable"); rc = SLURM_FAILURE; } if (env->ckpt_dir && setenvf(&env->env, "SLURM_CHECKPOINT_IMAGE_DIR", "%s", env->ckpt_dir)) { error("Can't set SLURM_CHECKPOINT_IMAGE_DIR env variable"); rc = SLURM_FAILURE; } if (env->restart_cnt && setenvf(&env->env, "SLURM_RESTART_COUNT", "%u", env->restart_cnt)) { error("Can't set SLURM_RESTART_COUNT env variable"); rc = SLURM_FAILURE; } return rc; }
/* * parse_command_line, fill in params data structure with data */ extern void parse_command_line(int argc, char **argv) { char *env_val = NULL; int opt_char; int option_index; hostlist_t host_list; bool long_form = false; bool opt_a_set = false, opt_p_set = false; bool env_a_set = false, env_p_set = false; static struct option long_options[] = { {"all", no_argument, 0, 'a'}, {"bg", no_argument, 0, 'b'}, {"dead", no_argument, 0, 'd'}, {"exact", no_argument, 0, 'e'}, {"federation",no_argument, 0, OPT_LONG_FEDR}, {"help", no_argument, 0, OPT_LONG_HELP}, {"hide", no_argument, 0, OPT_LONG_HIDE}, {"iterate", required_argument, 0, 'i'}, {"local", no_argument, 0, OPT_LONG_LOCAL}, {"long", no_argument, 0, 'l'}, {"cluster", required_argument, 0, 'M'}, {"clusters", required_argument, 0, 'M'}, {"nodes", required_argument, 0, 'n'}, {"noconvert", no_argument, 0, OPT_LONG_NOCONVERT}, {"noheader", no_argument, 0, 'h'}, {"Node", no_argument, 0, 'N'}, {"format", required_argument, 0, 'o'}, {"Format", required_argument, 0, 'O'}, {"partition", required_argument, 0, 'p'}, {"responding",no_argument, 0, 'r'}, {"list-reasons", no_argument, 0, 'R'}, {"summarize", no_argument, 0, 's'}, {"sort", required_argument, 0, 'S'}, {"states", required_argument, 0, 't'}, {"reservation",no_argument, 0, 'T'}, {"usage", no_argument, 0, OPT_LONG_USAGE}, {"verbose", no_argument, 0, 'v'}, {"version", no_argument, 0, 'V'}, {NULL, 0, 0, 0} }; params.convert_flags = CONVERT_NUM_UNIT_EXACT; if (slurmctld_conf.fed_params && strstr(slurmctld_conf.fed_params, "fed_display")) params.federation_flag = true; if (getenv("SINFO_ALL")) { env_a_set = true; params.all_flag = true; } if (getenv("SINFO_FEDERATION")) params.federation_flag = true; if (getenv("SINFO_LOCAL")) params.local = true; if ( ( env_val = getenv("SINFO_PARTITION") ) ) { env_p_set = true; params.partition = xstrdup(env_val); params.part_list = _build_part_list(env_val); params.all_flag = true; } if (env_a_set && env_p_set) { error("Conflicting options, SINFO_ALL and SINFO_PARTITION, specified. " "Please choose one or the other."); exit(1); } if ( ( env_val = getenv("SINFO_SORT") ) ) params.sort = xstrdup(env_val); if ( ( env_val = getenv("SLURM_CLUSTERS") ) ) { if (!(params.clusters = slurmdb_get_info_cluster(env_val))) { print_db_notok(env_val, 1); exit(1); } working_cluster_rec = list_peek(params.clusters); params.local = true; } while ((opt_char = getopt_long(argc, argv, "abdehi:lM:n:No:O:p:rRsS:t:TvV", long_options, &option_index)) != -1) { switch (opt_char) { case (int)'?': fprintf(stderr, "Try \"sinfo --help\" for more information\n"); exit(1); break; case (int)'a': opt_a_set = true; xfree(params.partition); FREE_NULL_LIST(params.part_list); params.all_flag = true; break; case (int)'b': params.cluster_flags = slurmdb_setup_cluster_flags(); if (params.cluster_flags & CLUSTER_FLAG_BG) params.bg_flag = true; else { error("Must be on a BG system to use --bg " "option, if using --cluster option " "put the --bg option " "after the --cluster option."); exit(1); } break; case (int)'d': params.dead_nodes = true; break; case (int)'e': params.exact_match = true; break; case (int)'h': params.no_header = true; break; case (int) 'i': params.iterate= atoi(optarg); if (params.iterate <= 0) { error ("Error: invalid entry for " "--iterate=%s", optarg); exit(1); } break; case (int) 'l': params.long_output = true; break; case (int) 'M': FREE_NULL_LIST(params.clusters); if (!(params.clusters = slurmdb_get_info_cluster(optarg))) { print_db_notok(optarg, 0); exit(1); } working_cluster_rec = list_peek(params.clusters); params.local = true; break; case OPT_LONG_NOCONVERT: params.convert_flags |= CONVERT_NUM_UNIT_NO; break; case (int) 'n': xfree(params.nodes); params.nodes = xstrdup(optarg); /* * confirm valid nodelist entry */ host_list = hostlist_create(params.nodes); if (!host_list) { error("'%s' invalid entry for --nodes", optarg); exit(1); } if (hostlist_count(host_list) == 1) { params.node_name_single = true; xfree(params.nodes); params.nodes = hostlist_deranged_string_xmalloc(host_list); } else params.node_name_single = false; hostlist_destroy(host_list); break; case (int) 'N': params.node_flag = true; break; case (int) 'o': xfree(params.format); params.format = xstrdup(optarg); break; case (int) 'O': long_form = true; xfree(params.format); params.format = xstrdup(optarg); break; case (int) 'p': opt_p_set = true; xfree(params.partition); FREE_NULL_LIST(params.part_list); params.partition = xstrdup(optarg); params.part_list = _build_part_list(optarg); params.all_flag = true; break; case (int) 'r': params.responding_nodes = true; break; case (int) 'R': params.list_reasons = true; break; case (int) 's': params.summarize = true; break; case (int) 'S': xfree(params.sort); params.sort = xstrdup(optarg); break; case (int) 't': xfree(params.states); params.states = xstrdup(optarg); if (!(params.state_list = _build_state_list(optarg))) { error ("valid states: %s", _node_state_list ()); exit (1); } break; case (int) 'T': params.reservation_flag = true; break; case (int) 'v': params.verbose++; break; case (int) 'V': print_slurm_version (); exit(0); case (int) OPT_LONG_FEDR: params.federation_flag = true; break; case (int) OPT_LONG_HELP: _help(); exit(0); case (int) OPT_LONG_USAGE: _usage(); exit(0); case OPT_LONG_HIDE: params.all_flag = false; break; case OPT_LONG_LOCAL: params.local = true; break; } } if (opt_a_set && opt_p_set) { error("Conflicting options, -a and -p, specified. " "Please choose one or the other."); exit(1); } params.cluster_flags = slurmdb_setup_cluster_flags(); if (params.federation_flag && !params.clusters && !params.local) { void *ptr = NULL; char *cluster_name = slurm_get_cluster_name(); if (slurm_load_federation(&ptr) || !cluster_in_federation(ptr, cluster_name)) { /* Not in federation */ params.local = true; slurm_destroy_federation_rec(ptr); } else { params.fed = (slurmdb_federation_rec_t *) ptr; } xfree(cluster_name); } if ( params.format == NULL ) { if ( params.summarize ) { params.part_field_flag = true; /* compute size later */ if (params.cluster_flags & CLUSTER_FLAG_BG) params.format = "%9P %.5a %.10l %.32F %N"; else params.format = "%9P %.5a %.10l %.16F %N"; } else if ( params.node_flag ) { params.node_field_flag = true; /* compute size later */ params.part_field_flag = true; /* compute size later */ params.format = params.long_output ? "%N %.6D %.9P %.11T %.4c %.8z %.6m %.8d %.6w %.8f %20E" : "%N %.6D %.9P %6t"; } else if (params.list_reasons) { params.format = params.long_output ? "%20E %12U %19H %6t %N" : "%20E %9u %19H %N"; } else if ((env_val = getenv ("SINFO_FORMAT"))) { params.format = xstrdup(env_val); } else if (params.fed) { params.part_field_flag = true; /* compute size later */ params.format = params.long_output ? "%9P %8V %.5a %.10l %.10s %.4r %.8h %.10g %.6D %.11T %N" : "%9P %8V %.5a %.10l %.6D %.6t %N"; } else { params.part_field_flag = true; /* compute size later */ params.format = params.long_output ? "%9P %.5a %.10l %.10s %.4r %.8h %.10g %.6D %.11T %N" : "%9P %.5a %.10l %.6D %.6t %N"; } } if (long_form) _parse_long_format(params.format); else _parse_format(params.format); if (params.list_reasons && (params.state_list == NULL)) { params.states = xstrdup ("down,drain,error"); if (!(params.state_list = _build_state_list (params.states))) fatal ("Unable to build state list for -R!"); } if (params.dead_nodes || params.nodes || params.partition || params.responding_nodes ||params.state_list) params.filtering = true; if (params.verbose) _print_options(); }
/* * Set in "dest" the environment variables relevant to a SLURM job * allocation, overwriting any environment variables of the same name. * If the address pointed to by "dest" is NULL, memory will automatically be * xmalloc'ed. The array is terminated by a NULL pointer, and thus is * suitable for use by execle() and other env_array_* functions. * * Sets the variables: * SLURM_JOB_ID * SLURM_JOB_NUM_NODES * SLURM_JOB_NODELIST * SLURM_JOB_CPUS_PER_NODE * LOADLBATCH (AIX only) * SLURM_BG_NUM_NODES, MPIRUN_PARTITION, MPIRUN_NOFREE, and * MPIRUN_NOALLOCATE (BG only) * * Sets OBSOLETE variables (needed for MPI, do not remove): * SLURM_JOBID * SLURM_NNODES * SLURM_NODELIST * SLURM_TASKS_PER_NODE */ int env_array_for_job(char ***dest, const resource_allocation_response_msg_t *alloc, const job_desc_msg_t *desc) { char *tmp = NULL; char *dist = NULL, *lllp_dist = NULL; slurm_step_layout_t *step_layout = NULL; uint32_t num_tasks = desc->num_tasks; int rc = SLURM_SUCCESS; uint32_t node_cnt = alloc->node_cnt; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); _setup_particulars(cluster_flags, dest, alloc->select_jobinfo); if (cluster_flags & CLUSTER_FLAG_BG) { select_g_select_jobinfo_get(alloc->select_jobinfo, SELECT_JOBDATA_NODE_CNT, &node_cnt); if (!node_cnt) node_cnt = alloc->node_cnt; env_array_overwrite_fmt(dest, "SLURM_BG_NUM_NODES", "%u", node_cnt); } env_array_overwrite_fmt(dest, "SLURM_JOB_ID", "%u", alloc->job_id); env_array_overwrite_fmt(dest, "SLURM_JOB_NUM_NODES", "%u", node_cnt); env_array_overwrite_fmt(dest, "SLURM_JOB_NODELIST", "%s", alloc->node_list); _set_distribution(desc->task_dist, &dist, &lllp_dist); if(dist) env_array_overwrite_fmt(dest, "SLURM_DISTRIBUTION", "%s", dist); if(desc->task_dist == SLURM_DIST_PLANE) env_array_overwrite_fmt(dest, "SLURM_DIST_PLANESIZE", "%u", desc->plane_size); if(lllp_dist) env_array_overwrite_fmt(dest, "SLURM_DIST_LLLP", "%s", lllp_dist); tmp = uint32_compressed_to_str(alloc->num_cpu_groups, alloc->cpus_per_node, alloc->cpu_count_reps); env_array_overwrite_fmt(dest, "SLURM_JOB_CPUS_PER_NODE", "%s", tmp); xfree(tmp); /* OBSOLETE, but needed by MPI, do not remove */ env_array_overwrite_fmt(dest, "SLURM_JOBID", "%u", alloc->job_id); env_array_overwrite_fmt(dest, "SLURM_NNODES", "%u", node_cnt); env_array_overwrite_fmt(dest, "SLURM_NODELIST", "%s", alloc->node_list); if(num_tasks == NO_VAL) { /* If we know how many tasks we are going to do then we set SLURM_TASKS_PER_NODE */ int i=0; /* If no tasks were given we can figure it out here * by totalling up the cpus and then dividing by the * number of cpus per task */ num_tasks = 0; for (i = 0; i < alloc->num_cpu_groups; i++) { num_tasks += alloc->cpu_count_reps[i] * alloc->cpus_per_node[i]; } if((int)desc->cpus_per_task > 1 && desc->cpus_per_task != (uint16_t)NO_VAL) num_tasks /= desc->cpus_per_task; //num_tasks = desc->min_cpus; } if(desc->task_dist == SLURM_DIST_ARBITRARY) { tmp = desc->req_nodes; env_array_overwrite_fmt(dest, "SLURM_ARBITRARY_NODELIST", "%s", tmp); } else tmp = alloc->node_list; if(!(step_layout = slurm_step_layout_create(tmp, alloc->cpus_per_node, alloc->cpu_count_reps, node_cnt, num_tasks, desc->cpus_per_task, desc->task_dist, desc->plane_size))) return SLURM_ERROR; tmp = _uint16_array_to_str(step_layout->node_cnt, step_layout->tasks); slurm_step_layout_destroy(step_layout); env_array_overwrite_fmt(dest, "SLURM_TASKS_PER_NODE", "%s", tmp); xfree(tmp); return rc; }
extern void pack_job_resources(job_resources_t *job_resrcs_ptr, Buf buffer, uint16_t protocol_version) { uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (protocol_version >= SLURM_2_5_PROTOCOL_VERSION) { if (job_resrcs_ptr == NULL) { uint32_t empty = NO_VAL; pack32(empty, buffer); return; } pack32(job_resrcs_ptr->nhosts, buffer); pack32(job_resrcs_ptr->ncpus, buffer); pack32(job_resrcs_ptr->node_req, buffer); packstr(job_resrcs_ptr->nodes, buffer); if (job_resrcs_ptr->cpu_array_reps) pack32_array(job_resrcs_ptr->cpu_array_reps, job_resrcs_ptr->cpu_array_cnt, buffer); else pack32_array(job_resrcs_ptr->cpu_array_reps, 0, buffer); if (job_resrcs_ptr->cpu_array_value) pack16_array(job_resrcs_ptr->cpu_array_value, job_resrcs_ptr->cpu_array_cnt, buffer); else pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer); if (job_resrcs_ptr->cpus) pack16_array(job_resrcs_ptr->cpus, job_resrcs_ptr->nhosts, buffer); else pack16_array(job_resrcs_ptr->cpus, 0, buffer); if (job_resrcs_ptr->cpus_used) pack16_array(job_resrcs_ptr->cpus_used, job_resrcs_ptr->nhosts, buffer); else pack16_array(job_resrcs_ptr->cpus_used, 0, buffer); if (job_resrcs_ptr->memory_allocated) pack32_array(job_resrcs_ptr->memory_allocated, job_resrcs_ptr->nhosts, buffer); else pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer); if (job_resrcs_ptr->memory_used) pack32_array(job_resrcs_ptr->memory_used, job_resrcs_ptr->nhosts, buffer); else pack32_array(job_resrcs_ptr->memory_used, 0, buffer); if (!(cluster_flags & CLUSTER_FLAG_BG)) { int i; uint32_t core_cnt = 0, sock_recs = 0; xassert(job_resrcs_ptr->cores_per_socket); xassert(job_resrcs_ptr->sock_core_rep_count); xassert(job_resrcs_ptr->sockets_per_node); for (i=0; i<job_resrcs_ptr->nhosts; i++) { core_cnt += job_resrcs_ptr->sockets_per_node[i] * job_resrcs_ptr->cores_per_socket[i] * job_resrcs_ptr->sock_core_rep_count[i]; sock_recs += job_resrcs_ptr-> sock_core_rep_count[i]; if (sock_recs >= job_resrcs_ptr->nhosts) break; } i++; pack16_array(job_resrcs_ptr->sockets_per_node, (uint32_t) i, buffer); pack16_array(job_resrcs_ptr->cores_per_socket, (uint32_t) i, buffer); pack32_array(job_resrcs_ptr->sock_core_rep_count, (uint32_t) i, buffer); xassert(job_resrcs_ptr->core_bitmap); xassert(job_resrcs_ptr->core_bitmap_used); pack_bit_str(job_resrcs_ptr->core_bitmap, buffer); pack_bit_str(job_resrcs_ptr->core_bitmap_used, buffer); } } else if (protocol_version >= SLURM_2_3_PROTOCOL_VERSION) { uint8_t tmp_8; if (job_resrcs_ptr == NULL) { uint32_t empty = NO_VAL; pack32(empty, buffer); return; } pack32(job_resrcs_ptr->nhosts, buffer); pack32(job_resrcs_ptr->ncpus, buffer); tmp_8 = job_resrcs_ptr->node_req; /* 32-bit in v2.5 */ pack8(tmp_8, buffer); packstr(job_resrcs_ptr->nodes, buffer); if (job_resrcs_ptr->cpu_array_reps) pack32_array(job_resrcs_ptr->cpu_array_reps, job_resrcs_ptr->cpu_array_cnt, buffer); else pack32_array(job_resrcs_ptr->cpu_array_reps, 0, buffer); if (job_resrcs_ptr->cpu_array_value) pack16_array(job_resrcs_ptr->cpu_array_value, job_resrcs_ptr->cpu_array_cnt, buffer); else pack16_array(job_resrcs_ptr->cpu_array_value, 0, buffer); if (job_resrcs_ptr->cpus) pack16_array(job_resrcs_ptr->cpus, job_resrcs_ptr->nhosts, buffer); else pack16_array(job_resrcs_ptr->cpus, 0, buffer); if (job_resrcs_ptr->cpus_used) pack16_array(job_resrcs_ptr->cpus_used, job_resrcs_ptr->nhosts, buffer); else pack16_array(job_resrcs_ptr->cpus_used, 0, buffer); if (job_resrcs_ptr->memory_allocated) pack32_array(job_resrcs_ptr->memory_allocated, job_resrcs_ptr->nhosts, buffer); else pack32_array(job_resrcs_ptr->memory_allocated, 0, buffer); if (job_resrcs_ptr->memory_used) pack32_array(job_resrcs_ptr->memory_used, job_resrcs_ptr->nhosts, buffer); else pack32_array(job_resrcs_ptr->memory_used, 0, buffer); if (!(cluster_flags & CLUSTER_FLAG_BG)) { int i; uint32_t core_cnt = 0, sock_recs = 0; xassert(job_resrcs_ptr->cores_per_socket); xassert(job_resrcs_ptr->sock_core_rep_count); xassert(job_resrcs_ptr->sockets_per_node); for (i=0; i<job_resrcs_ptr->nhosts; i++) { core_cnt += job_resrcs_ptr->sockets_per_node[i] * job_resrcs_ptr->cores_per_socket[i] * job_resrcs_ptr->sock_core_rep_count[i]; sock_recs += job_resrcs_ptr-> sock_core_rep_count[i]; if (sock_recs >= job_resrcs_ptr->nhosts) break; } i++; pack16_array(job_resrcs_ptr->sockets_per_node, (uint32_t) i, buffer); pack16_array(job_resrcs_ptr->cores_per_socket, (uint32_t) i, buffer); pack32_array(job_resrcs_ptr->sock_core_rep_count, (uint32_t) i, buffer); xassert(job_resrcs_ptr->core_bitmap); xassert(job_resrcs_ptr->core_bitmap_used); pack_bit_str(job_resrcs_ptr->core_bitmap, buffer); pack_bit_str(job_resrcs_ptr->core_bitmap_used, buffer); } } else { error("pack_job_resources: protocol_version %hu not supported", protocol_version); } }
/* * slurm_sprint_partition_info - output information about a specific Slurm * partition based upon message as loaded using slurm_load_partitions * IN part_ptr - an individual partition information record pointer * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char *slurm_sprint_partition_info ( partition_info_t * part_ptr, int one_liner ) { char tmp1[16], tmp2[16]; char tmp_line[MAXHOSTRANGELEN]; char *out = NULL; char *allow_deny, *value; uint16_t force, preempt_mode, val; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); /****** Line 1 ******/ snprintf(tmp_line, sizeof(tmp_line), "PartitionName=%s", part_ptr->name); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 2 ******/ if ((part_ptr->allow_groups == NULL) || (part_ptr->allow_groups[0] == '\0')) sprintf(tmp_line, "AllowGroups=ALL"); else { snprintf(tmp_line, sizeof(tmp_line), "AllowGroups=%s", part_ptr->allow_groups); } xstrcat(out, tmp_line); if (part_ptr->allow_accounts || !part_ptr->deny_accounts) { allow_deny = "Allow"; if ((part_ptr->allow_accounts == NULL) || (part_ptr->allow_accounts[0] == '\0')) value = "ALL"; else value = part_ptr->allow_accounts; } else { allow_deny = "Deny"; value = part_ptr->deny_accounts; } snprintf(tmp_line, sizeof(tmp_line), " %sAccounts=%s", allow_deny, value); xstrcat(out, tmp_line); if (part_ptr->allow_qos || !part_ptr->deny_qos) { allow_deny = "Allow"; if ((part_ptr->allow_qos == NULL) || (part_ptr->allow_qos[0] == '\0')) value = "ALL"; else value = part_ptr->allow_qos; } else { allow_deny = "Deny"; value = part_ptr->deny_qos; } snprintf(tmp_line, sizeof(tmp_line), " %sQos=%s", allow_deny, value); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 3 ******/ if (part_ptr->allow_alloc_nodes == NULL) snprintf(tmp_line, sizeof(tmp_line), "AllocNodes=%s","ALL"); else snprintf(tmp_line, sizeof(tmp_line), "AllocNodes=%s", part_ptr->allow_alloc_nodes); xstrcat(out, tmp_line); if (part_ptr->alternate != NULL) { snprintf(tmp_line, sizeof(tmp_line), " Alternate=%s", part_ptr->alternate); xstrcat(out, tmp_line); } if (part_ptr->flags & PART_FLAG_DEFAULT) sprintf(tmp_line, " Default=YES"); else sprintf(tmp_line, " Default=NO"); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 4 added here for BG partitions only ****** to maintain alphabetized output ******/ if (cluster_flags & CLUSTER_FLAG_BG) { snprintf(tmp_line, sizeof(tmp_line), "BasePartitions=%s", part_ptr->nodes); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); } /****** Line 5 ******/ if (part_ptr->default_time == INFINITE) sprintf(tmp_line, "DefaultTime=UNLIMITED"); else if (part_ptr->default_time == NO_VAL) sprintf(tmp_line, "DefaultTime=NONE"); else { char time_line[32]; secs2time_str(part_ptr->default_time * 60, time_line, sizeof(time_line)); sprintf(tmp_line, "DefaultTime=%s", time_line); } xstrcat(out, tmp_line); if (part_ptr->flags & PART_FLAG_NO_ROOT) sprintf(tmp_line, " DisableRootJobs=YES"); else sprintf(tmp_line, " DisableRootJobs=NO"); xstrcat(out, tmp_line); sprintf(tmp_line, " GraceTime=%u", part_ptr->grace_time); xstrcat(out, tmp_line); if (part_ptr->flags & PART_FLAG_HIDDEN) sprintf(tmp_line, " Hidden=YES"); else sprintf(tmp_line, " Hidden=NO"); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 6 ******/ if (part_ptr->max_nodes == INFINITE) sprintf(tmp_line, "MaxNodes=UNLIMITED"); else { if (cluster_flags & CLUSTER_FLAG_BG) convert_num_unit((float)part_ptr->max_nodes, tmp1, sizeof(tmp1), UNIT_NONE); else snprintf(tmp1, sizeof(tmp1),"%u", part_ptr->max_nodes); sprintf(tmp_line, "MaxNodes=%s", tmp1); } xstrcat(out, tmp_line); if (part_ptr->max_time == INFINITE) sprintf(tmp_line, " MaxTime=UNLIMITED"); else { char time_line[32]; secs2time_str(part_ptr->max_time * 60, time_line, sizeof(time_line)); sprintf(tmp_line, " MaxTime=%s", time_line); } xstrcat(out, tmp_line); if (cluster_flags & CLUSTER_FLAG_BG) convert_num_unit((float)part_ptr->min_nodes, tmp1, sizeof(tmp1), UNIT_NONE); else snprintf(tmp1, sizeof(tmp1), "%u", part_ptr->min_nodes); sprintf(tmp_line, " MinNodes=%s", tmp1); xstrcat(out, tmp_line); if (part_ptr->max_cpus_per_node == INFINITE) sprintf(tmp_line, " MaxCPUsPerNode=UNLIMITED"); else { sprintf(tmp_line, " MaxCPUsPerNode=%u", part_ptr->max_cpus_per_node); } xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line added here for non BG nodes to keep with alphabetized output******/ if (!(cluster_flags & CLUSTER_FLAG_BG)) { snprintf(tmp_line, sizeof(tmp_line), "Nodes=%s", part_ptr->nodes); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); } /****** Line 7 ******/ sprintf(tmp_line, "Priority=%u", part_ptr->priority); xstrcat(out, tmp_line); if (part_ptr->flags & PART_FLAG_ROOT_ONLY) sprintf(tmp_line, " RootOnly=YES"); else sprintf(tmp_line, " RootOnly=NO"); xstrcat(out, tmp_line); if (part_ptr->flags & PART_FLAG_REQ_RESV) sprintf(tmp_line, " ReqResv=YES"); else sprintf(tmp_line, " ReqResv=NO"); xstrcat(out, tmp_line); force = part_ptr->max_share & SHARED_FORCE; val = part_ptr->max_share & (~SHARED_FORCE); if (val == 0) xstrcat(out, " Shared=EXCLUSIVE"); else if (force) { sprintf(tmp_line, " Shared=FORCE:%u", val); xstrcat(out, tmp_line); } else if (val == 1) xstrcat(out, " Shared=NO"); else { sprintf(tmp_line, " Shared=YES:%u", val); xstrcat(out, tmp_line); } preempt_mode = part_ptr->preempt_mode; if (preempt_mode == (uint16_t) NO_VAL) preempt_mode = slurm_get_preempt_mode(); /* use cluster param */ snprintf(tmp_line, sizeof(tmp_line), " PreemptMode=%s", preempt_mode_string(preempt_mode)); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 8 ******/ if (part_ptr->state_up == PARTITION_UP) sprintf(tmp_line, "State=UP"); else if (part_ptr->state_up == PARTITION_DOWN) sprintf(tmp_line, "State=DOWN"); else if (part_ptr->state_up == PARTITION_INACTIVE) sprintf(tmp_line, "State=INACTIVE"); else if (part_ptr->state_up == PARTITION_DRAIN) sprintf(tmp_line, "State=DRAIN"); else sprintf(tmp_line, "State=UNKNOWN"); xstrcat(out, tmp_line); if (cluster_flags & CLUSTER_FLAG_BG) convert_num_unit((float)part_ptr->total_cpus, tmp1, sizeof(tmp1), UNIT_NONE); else snprintf(tmp1, sizeof(tmp1), "%u", part_ptr->total_cpus); sprintf(tmp_line, " TotalCPUs=%s", tmp1); xstrcat(out, tmp_line); if (cluster_flags & CLUSTER_FLAG_BG) convert_num_unit((float)part_ptr->total_nodes, tmp2, sizeof(tmp2), UNIT_NONE); else snprintf(tmp2, sizeof(tmp2), "%u", part_ptr->total_nodes); sprintf(tmp_line, " TotalNodes=%s", tmp2); xstrcat(out, tmp_line); if (part_ptr->cr_type & CR_CORE) sprintf(tmp_line, " SelectTypeParameters=CR_CORE"); else if (part_ptr->cr_type & CR_SOCKET) sprintf(tmp_line, " SelectTypeParameters=CR_SOCKET"); else sprintf(tmp_line, " SelectTypeParameters=N/A"); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 9 ******/ if (part_ptr->def_mem_per_cpu & MEM_PER_CPU) { snprintf(tmp_line, sizeof(tmp_line), "DefMemPerCPU=%u", part_ptr->def_mem_per_cpu & (~MEM_PER_CPU)); xstrcat(out, tmp_line); } else if (part_ptr->def_mem_per_cpu == 0) { xstrcat(out, "DefMemPerNode=UNLIMITED"); } else { snprintf(tmp_line, sizeof(tmp_line), "DefMemPerNode=%u", part_ptr->def_mem_per_cpu); xstrcat(out, tmp_line); } if (part_ptr->max_mem_per_cpu & MEM_PER_CPU) { snprintf(tmp_line, sizeof(tmp_line), " MaxMemPerCPU=%u", part_ptr->max_mem_per_cpu & (~MEM_PER_CPU)); xstrcat(out, tmp_line); } else if (part_ptr->max_mem_per_cpu == 0) { xstrcat(out, " MaxMemPerNode=UNLIMITED"); } else { snprintf(tmp_line, sizeof(tmp_line), " MaxMemPerNode=%u", part_ptr->max_mem_per_cpu); xstrcat(out, tmp_line); } if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }
int main(int argc, char **argv) { GtkWidget *menubar = NULL; GtkWidget *table = NULL; GtkWidget *combo = NULL; GtkBin *bin = NULL; GtkViewport *view = NULL; int i=0; log_options_t lopts = LOG_OPTS_STDERR_ONLY; if (!getenv("SLURM_BITSTR_LEN")) setenv("SLURM_BITSTR_LEN", "128", 1); /* More array info */ slurm_conf_init(NULL); log_init(argv[0], lopts, SYSLOG_FACILITY_USER, NULL); load_defaults(); cluster_flags = slurmdb_setup_cluster_flags(); cluster_dims = slurmdb_setup_cluster_dims(); _init_pages(); sview_thread_init(NULL); gdk_threads_init(); gdk_threads_enter(); /* Initialize GTK */ gtk_init (&argc, &argv); sview_mutex_new(&sview_mutex); sview_mutex_new(&grid_mutex); sview_cond_new(&grid_cond); /* make sure the system is up */ grid_window = GTK_WIDGET(create_scrolled_window()); bin = GTK_BIN(>K_SCROLLED_WINDOW(grid_window)->container); view = GTK_VIEWPORT(bin->child); bin = GTK_BIN(&view->bin); main_grid_table = GTK_TABLE(bin->child); gtk_table_set_homogeneous(main_grid_table, true); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(grid_window), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); /* fill in all static info for pages */ /* Make a window */ main_window = gtk_dialog_new(); g_signal_connect(G_OBJECT(main_window), "delete_event", G_CALLBACK(_delete), NULL); gtk_window_set_title(GTK_WINDOW(main_window), "Sview"); gtk_window_set_default_size(GTK_WINDOW(main_window), working_sview_config.main_width, working_sview_config.main_height); gtk_container_set_border_width( GTK_CONTAINER(GTK_DIALOG(main_window)->vbox), 1); /* Create the main notebook, place the position of the tabs */ main_notebook = gtk_notebook_new(); g_signal_connect(G_OBJECT(main_notebook), "switch_page", G_CALLBACK(_page_switched), NULL); table = gtk_table_new(1, 3, false); gtk_table_set_homogeneous(GTK_TABLE(table), false); gtk_container_set_border_width(GTK_CONTAINER(table), 1); /* Create a menu */ menubar = _get_menubar_menu(main_window, main_notebook); gtk_table_attach_defaults(GTK_TABLE(table), menubar, 0, 1, 0, 1); if ((combo = _create_cluster_combo())) { GtkWidget *label = gtk_label_new("Cluster "); gtk_table_attach(GTK_TABLE(table), label, 1, 2, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); gtk_table_attach(GTK_TABLE(table), combo, 2, 3, 0, 1, GTK_FILL, GTK_SHRINK, 0, 0); } gtk_notebook_popup_enable(GTK_NOTEBOOK(main_notebook)); gtk_notebook_set_scrollable(GTK_NOTEBOOK(main_notebook), true); gtk_notebook_set_tab_pos(GTK_NOTEBOOK(main_notebook), working_sview_config.tab_pos); main_statusbar = gtk_statusbar_new(); gtk_statusbar_set_has_resize_grip(GTK_STATUSBAR(main_statusbar), false); /* Pack it all together */ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(main_window)->vbox), table, false, false, 0); table = gtk_table_new(1, 2, false); gtk_table_attach(GTK_TABLE(table), grid_window, 0, 1, 0, 1, GTK_SHRINK, GTK_EXPAND | GTK_FILL, 0, 0); gtk_table_attach_defaults(GTK_TABLE(table), main_notebook, 1, 2, 0, 1); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(main_window)->vbox), table, true, true, 0); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(main_window)->vbox), main_statusbar, false, false, 0); in_process_cursor = gdk_cursor_new(GDK_WATCH); for(i=0; i<PAGE_CNT; i++) { if (main_display_data[i].id == -1) break; create_page(GTK_NOTEBOOK(main_notebook), &main_display_data[i]); } /* tell signal we are done adding */ popup_list = list_create(destroy_popup_info); signal_params_list = list_create(destroy_signal_params); gtk_widget_show_all(main_window); adding = 0; /* apply default settings */ if (!working_sview_config.show_grid) gtk_widget_hide(grid_window); for(i=0; i<PAGE_CNT; i++) { GtkWidget *visible_tab = NULL; if (main_display_data[i].id == -1) break; visible_tab = gtk_notebook_get_nth_page( GTK_NOTEBOOK(main_notebook), i); if (working_sview_config.page_visible[i] || (i == working_sview_config.default_page) || (i == TAB_PAGE)) gtk_widget_show(visible_tab); else gtk_widget_hide(visible_tab); } /* Set the default page. This has to be done after the * gtk_widget_show_all since it, for some reason always sets * 0 to be the default page and will just overwrite this. */ /* Also if we already are set at the current page we need to start up the page thread, so just call the _page_switched function. If we aren't already there, then set the current page which will inturn call the _page_switched. If the pages is already this the signal doesn't happen so handle it here. */ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(main_notebook)) == working_sview_config.default_page) _page_switched(GTK_NOTEBOOK(main_notebook), NULL, working_sview_config.default_page, NULL); else gtk_notebook_set_current_page(GTK_NOTEBOOK(main_notebook), working_sview_config. default_page); /* Finished! */ gtk_main (); gdk_threads_leave(); return 0; }
extern void _change_cluster_main(GtkComboBox *combo, gpointer extra) { GtkTreeModel *model; display_data_t *display_data; GtkTreeIter iter; slurmdb_cluster_rec_t *cluster_rec = NULL; char *tmp, *ui_description; GError *error = NULL; GtkWidget *node_tab = NULL; int rc; bool got_grid = 0; if (!gtk_combo_box_get_active_iter(combo, &iter)) { g_print("nothing selected\n"); return; } model = gtk_combo_box_get_model(combo); if (!model) { g_print("nothing selected\n"); return; } gtk_tree_model_get(model, &iter, 1, &cluster_rec, -1); if (!cluster_rec) { g_print("no cluster_rec pointer here!"); return; } /* From testing it doesn't appear you can get here without a legitimate change, so there isn't a need to check if we are going back to the same cluster we were just at. */ /* if (working_cluster_rec) { */ /* if (!xstrcmp(cluster_rec->name, working_cluster_rec->name)) */ /* return; */ /* } */ /* free old info under last cluster */ slurm_free_block_info_msg(g_block_info_ptr); g_block_info_ptr = NULL; slurm_free_front_end_info_msg(g_front_end_info_ptr); g_front_end_info_ptr = NULL; slurm_free_burst_buffer_info_msg(g_bb_info_ptr); g_bb_info_ptr = NULL; slurm_free_job_info_msg(g_job_info_ptr); g_job_info_ptr = NULL; slurm_free_node_info_msg(g_node_info_ptr); g_node_info_ptr = NULL; slurm_free_partition_info_msg(g_part_info_ptr); g_part_info_ptr = NULL; slurm_free_reservation_info_msg(g_resv_info_ptr); g_resv_info_ptr = NULL; slurm_free_ctl_conf(g_ctl_info_ptr); g_ctl_info_ptr = NULL; slurm_free_job_step_info_response_msg(g_step_info_ptr); g_step_info_ptr = NULL; slurm_free_topo_info_msg(g_topo_info_msg_ptr); g_topo_info_msg_ptr = NULL; /* set up working_cluster_rec */ if (cluster_dims > 1) { /* reset from a multi-dim cluster */ working_sview_config.grid_x_width = default_sview_config.grid_x_width; working_sview_config.grid_hori = default_sview_config.grid_hori; working_sview_config.grid_vert = default_sview_config.grid_vert; } gtk_table_set_col_spacings(main_grid_table, 0); gtk_table_set_row_spacings(main_grid_table, 0); if (!orig_cluster_name) orig_cluster_name = slurm_get_cluster_name(); if (!xstrcmp(cluster_rec->name, orig_cluster_name)) working_cluster_rec = NULL; else working_cluster_rec = cluster_rec; cluster_dims = slurmdb_setup_cluster_dims(); cluster_flags = slurmdb_setup_cluster_flags(); display_data = main_display_data; while (display_data++) { if (display_data->id == -1) break; if (cluster_flags & CLUSTER_FLAG_BG) { switch(display_data->id) { case BLOCK_PAGE: display_data->show = true; break; case NODE_PAGE: display_data->name = "Midplanes"; break; default: break; } } else { switch(display_data->id) { case BLOCK_PAGE: display_data->show = false; break; case NODE_PAGE: display_data->name = "Nodes"; break; default: break; } } } /* set up menu */ ui_description = _get_ui_description(); gtk_ui_manager_remove_ui(g_ui_manager, g_menu_id); if (!(g_menu_id = gtk_ui_manager_add_ui_from_string( g_ui_manager, ui_description, -1, &error))) { xfree(ui_description); g_error("building menus failed: %s", error->message); g_error_free (error); exit (0); } xfree(ui_description); /* make changes for each object */ cluster_change_block(); cluster_change_front_end(); cluster_change_resv(); cluster_change_part(); cluster_change_job(); cluster_change_node(); cluster_change_bb(); /* destroy old stuff */ if (grid_button_list) { FREE_NULL_LIST(grid_button_list); got_grid = 1; } select_g_ba_fini(); /* sorry popups can't survive a cluster change */ if (popup_list) list_flush(popup_list); if (signal_params_list) list_flush(signal_params_list); if (signal_params_list) list_flush(signal_params_list); if (g_switch_nodes_maps) free_switch_nodes_maps(g_switch_nodes_maps); /* change the node tab name if needed */ node_tab = gtk_notebook_get_nth_page( GTK_NOTEBOOK(main_notebook), NODE_PAGE); node_tab = gtk_notebook_get_tab_label(GTK_NOTEBOOK(main_notebook), node_tab); #ifdef GTK2_USE_GET_FOCUS /* ok, now we have a table which we have set up to contain an * event_box which contains the label we are interested. We * setup this label to be the focus child of the table, so all * we have to do is grab that and we are set. */ node_tab = gtk_container_get_focus_child(GTK_CONTAINER(node_tab)); #else /* See above comment. Since gtk_container_get_focus_child * doesn't exist yet we will just traverse the children until * we find the label widget and then break. */ { int i = 0; GList *children = gtk_container_get_children( GTK_CONTAINER(node_tab)); while ((node_tab = g_list_nth_data(children, i++))) { int j = 0; GList *children2 = gtk_container_get_children( GTK_CONTAINER(node_tab)); while ((node_tab = g_list_nth_data(children2, j++))) { if (GTK_IS_LABEL(node_tab)) break; } g_list_free(children2); if (node_tab) break; } g_list_free(children); } #endif if (node_tab) gtk_label_set_text(GTK_LABEL(node_tab), main_display_data[NODE_PAGE].name); /* The name in the visible tabs is easier since it is really just a button with a label on it. */ if (default_sview_config.page_check_widget[NODE_PAGE]) { gtk_button_set_label(GTK_BUTTON(default_sview_config. page_check_widget[NODE_PAGE]), main_display_data[NODE_PAGE].name); } /* reinit */ rc = get_system_stats(main_grid_table); if (rc == SLURM_SUCCESS) { /* It turns out if we didn't have the grid (cluster not responding) before the new grid doesn't get set up correctly. Redoing the system_stats fixes it. There is probably a better way of doing this, but it doesn't happen very often and isn't that bad to handle every once in a while. */ if (!got_grid) { /* I know we just did this before, but it needs to be done again here. */ FREE_NULL_LIST(grid_button_list); get_system_stats(main_grid_table); } refresh_main(NULL, NULL); } tmp = g_strdup_printf("Cluster changed to %s", cluster_rec->name); display_edit_note(tmp); g_free(tmp); }
/* * slurm_sprint_node_table - output information about a specific Slurm nodes * based upon message as loaded using slurm_load_node * IN node_ptr - an individual node information record pointer * IN node_scaling - number of nodes each node represents * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char * slurm_sprint_node_table (node_info_t * node_ptr, int node_scaling, int one_liner ) { uint32_t my_state = node_ptr->node_state; char *cloud_str = "", *comp_str = "", *drain_str = "", *power_str = ""; char time_str[32]; char *out = NULL, *reason_str = NULL, *select_reason_str = NULL; uint16_t err_cpus = 0, alloc_cpus = 0; int cpus_per_node = 1; int idle_cpus; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); uint64_t alloc_memory; char *node_alloc_tres = NULL; char *line_end = (one_liner) ? " " : "\n "; if (node_scaling) cpus_per_node = node_ptr->cpus / node_scaling; if (my_state & NODE_STATE_CLOUD) { my_state &= (~NODE_STATE_CLOUD); cloud_str = "+CLOUD"; } if (my_state & NODE_STATE_COMPLETING) { my_state &= (~NODE_STATE_COMPLETING); comp_str = "+COMPLETING"; } if (my_state & NODE_STATE_DRAIN) { my_state &= (~NODE_STATE_DRAIN); drain_str = "+DRAIN"; } if (my_state & NODE_STATE_FAIL) { my_state &= (~NODE_STATE_FAIL); drain_str = "+FAIL"; } if (my_state & NODE_STATE_POWER_SAVE) { my_state &= (~NODE_STATE_POWER_SAVE); power_str = "+POWER"; } slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_SUBCNT, NODE_STATE_ALLOCATED, &alloc_cpus); if (cluster_flags & CLUSTER_FLAG_BG) { if (!alloc_cpus && (IS_NODE_ALLOCATED(node_ptr) || IS_NODE_COMPLETING(node_ptr))) alloc_cpus = node_ptr->cpus; else alloc_cpus *= cpus_per_node; } idle_cpus = node_ptr->cpus - alloc_cpus; slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_SUBCNT, NODE_STATE_ERROR, &err_cpus); if (cluster_flags & CLUSTER_FLAG_BG) err_cpus *= cpus_per_node; idle_cpus -= err_cpus; if ((alloc_cpus && err_cpus) || (idle_cpus && (idle_cpus != node_ptr->cpus))) { my_state &= NODE_STATE_FLAGS; my_state |= NODE_STATE_MIXED; } /****** Line 1 ******/ xstrfmtcat(out, "NodeName=%s ", node_ptr->name); if (cluster_flags & CLUSTER_FLAG_BG) { slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_RACK_MP, 0, &select_reason_str); if (select_reason_str) { xstrfmtcat(out, "RackMidplane=%s ", select_reason_str); xfree(select_reason_str); } } if (node_ptr->arch) xstrfmtcat(out, "Arch=%s ", node_ptr->arch); xstrfmtcat(out, "CoresPerSocket=%u", node_ptr->cores); xstrcat(out, line_end); /****** Line ******/ xstrfmtcat(out, "CPUAlloc=%u CPUErr=%u CPUTot=%u ", alloc_cpus, err_cpus, node_ptr->cpus); if (node_ptr->cpu_load == NO_VAL) xstrcat(out, "CPULoad=N/A"); else xstrfmtcat(out, "CPULoad=%.2f", (node_ptr->cpu_load / 100.0)); xstrcat(out, line_end); /****** Line ******/ xstrfmtcat(out, "AvailableFeatures=%s", node_ptr->features); xstrcat(out, line_end); /****** Line ******/ xstrfmtcat(out, "ActiveFeatures=%s", node_ptr->features_act); xstrcat(out, line_end); /****** Line ******/ xstrfmtcat(out, "Gres=%s", node_ptr->gres); xstrcat(out, line_end); /****** Line (optional) ******/ if (node_ptr->gres_drain) { xstrfmtcat(out, "GresDrain=%s", node_ptr->gres_drain); xstrcat(out, line_end); } /****** Line (optional) ******/ if (node_ptr->gres_used) { xstrfmtcat(out, "GresUsed=%s", node_ptr->gres_used); xstrcat(out, line_end); } /****** Line (optional) ******/ if (node_ptr->node_hostname || node_ptr->node_addr) { xstrfmtcat(out, "NodeAddr=%s NodeHostName=%s Version=%s", node_ptr->node_addr, node_ptr->node_hostname, node_ptr->version); xstrcat(out, line_end); } /****** Line ******/ if (node_ptr->os) xstrfmtcat(out, "OS=%s ", node_ptr->os); slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_MEM_ALLOC, NODE_STATE_ALLOCATED, &alloc_memory); xstrfmtcat(out, "RealMemory=%"PRIu64" AllocMem=%"PRIu64" ", node_ptr->real_memory, alloc_memory); if (node_ptr->free_mem == NO_VAL64) xstrcat(out, "FreeMem=N/A "); else xstrfmtcat(out, "FreeMem=%"PRIu64" ", node_ptr->free_mem); xstrfmtcat(out, "Sockets=%u Boards=%u", node_ptr->sockets, node_ptr->boards); xstrcat(out, line_end); /****** core & memory specialization Line (optional) ******/ if (node_ptr->core_spec_cnt || node_ptr->cpu_spec_list || node_ptr->mem_spec_limit) { if (node_ptr->core_spec_cnt) { xstrfmtcat(out, "CoreSpecCount=%u ", node_ptr->core_spec_cnt); } if (node_ptr->cpu_spec_list) { xstrfmtcat(out, "CPUSpecList=%s ", node_ptr->cpu_spec_list); } if (node_ptr->mem_spec_limit) { xstrfmtcat(out, "MemSpecLimit=%"PRIu64"", node_ptr->mem_spec_limit); } xstrcat(out, line_end); } /****** Line ******/ xstrfmtcat(out, "State=%s%s%s%s%s ThreadsPerCore=%u TmpDisk=%u Weight=%u ", node_state_string(my_state), cloud_str, comp_str, drain_str, power_str, node_ptr->threads, node_ptr->tmp_disk, node_ptr->weight); if (node_ptr->owner == NO_VAL) { xstrcat(out, "Owner=N/A "); } else { char *user_name = uid_to_string((uid_t) node_ptr->owner); xstrfmtcat(out, "Owner=%s(%u) ", user_name, node_ptr->owner); xfree(user_name); } xstrfmtcat(out, "MCS_label=%s", (node_ptr->mcs_label == NULL) ? "N/A" : node_ptr->mcs_label); xstrcat(out, line_end); /****** Line ******/ if (node_ptr->partitions) { xstrfmtcat(out, "Partitions=%s ", node_ptr->partitions); xstrcat(out, line_end); } /****** Line ******/ if (node_ptr->boot_time) { slurm_make_time_str((time_t *)&node_ptr->boot_time, time_str, sizeof(time_str)); xstrfmtcat(out, "BootTime=%s ", time_str); } else { xstrcat(out, "BootTime=None "); } if (node_ptr->slurmd_start_time) { slurm_make_time_str ((time_t *)&node_ptr->slurmd_start_time, time_str, sizeof(time_str)); xstrfmtcat(out, "SlurmdStartTime=%s", time_str); } else { xstrcat(out, "SlurmdStartTime=None"); } xstrcat(out, line_end); /****** TRES Line ******/ select_g_select_nodeinfo_get(node_ptr->select_nodeinfo, SELECT_NODEDATA_TRES_ALLOC_FMT_STR, NODE_STATE_ALLOCATED, &node_alloc_tres); xstrfmtcat(out, "CfgTRES=%s", node_ptr->tres_fmt_str); xstrcat(out, line_end); xstrfmtcat(out, "AllocTRES=%s", (node_alloc_tres) ? node_alloc_tres : ""); xfree(node_alloc_tres); xstrcat(out, line_end); /****** Power Management Line ******/ if (!node_ptr->power || (node_ptr->power->cap_watts == NO_VAL)) xstrcat(out, "CapWatts=n/a"); else xstrfmtcat(out, "CapWatts=%u", node_ptr->power->cap_watts); xstrcat(out, line_end); /****** Power Consumption Line ******/ if (!node_ptr->energy || node_ptr->energy->current_watts == NO_VAL) xstrcat(out, "CurrentWatts=n/s LowestJoules=n/s ConsumedJoules=n/s"); else xstrfmtcat(out, "CurrentWatts=%u " "LowestJoules=%"PRIu64" " "ConsumedJoules=%"PRIu64"", node_ptr->energy->current_watts, node_ptr->energy->base_consumed_energy, node_ptr->energy->consumed_energy); xstrcat(out, line_end); /****** external sensors Line ******/ if (!node_ptr->ext_sensors || node_ptr->ext_sensors->consumed_energy == NO_VAL) xstrcat(out, "ExtSensorsJoules=n/s "); else xstrfmtcat(out, "ExtSensorsJoules=%"PRIu64" ", node_ptr->ext_sensors->consumed_energy); if (!node_ptr->ext_sensors || node_ptr->ext_sensors->current_watts == NO_VAL) xstrcat(out, "ExtSensorsWatts=n/s "); else xstrfmtcat(out, "ExtSensorsWatts=%u ", node_ptr->ext_sensors->current_watts); if (!node_ptr->ext_sensors || node_ptr->ext_sensors->temperature == NO_VAL) xstrcat(out, "ExtSensorsTemp=n/s"); else xstrfmtcat(out, "ExtSensorsTemp=%u", node_ptr->ext_sensors->temperature); xstrcat(out, line_end); /****** Line ******/ if (node_ptr->reason && node_ptr->reason[0]) xstrcat(reason_str, node_ptr->reason); slurm_get_select_nodeinfo(node_ptr->select_nodeinfo, SELECT_NODEDATA_EXTRA_INFO, 0, &select_reason_str); if (select_reason_str && select_reason_str[0]) { if (reason_str) xstrcat(reason_str, "\n"); xstrcat(reason_str, select_reason_str); } xfree(select_reason_str); if (reason_str) { int inx = 1; char *save_ptr = NULL, *tok, *user_name; tok = strtok_r(reason_str, "\n", &save_ptr); while (tok) { if (inx == 1) { xstrcat(out, "Reason="); } else { xstrcat(out, line_end); xstrcat(out, " "); } xstrfmtcat(out, "%s", tok); if ((inx++ == 1) && node_ptr->reason_time) { user_name = uid_to_string(node_ptr->reason_uid); slurm_make_time_str((time_t *)&node_ptr->reason_time, time_str, sizeof(time_str)); xstrfmtcat(out, " [%s@%s]", user_name, time_str); xfree(user_name); } tok = strtok_r(NULL, "\n", &save_ptr); } xfree(reason_str); } if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }
/* * slurm_get_node_energy_n - issue RPC to get the energy data of all * configured sensors on the target machine * IN host - name of node to query, NULL if localhost * IN delta - Use cache if data is newer than this in seconds * OUT sensors_cnt - number of sensors * OUT energy - array of acct_gather_energy_t structures on success or * NULL other wise * RET 0 on success or a slurm error code * NOTE: free the response using xfree */ extern int slurm_get_node_energy(char *host, uint16_t delta, uint16_t *sensor_cnt, acct_gather_energy_t **energy) { int rc; slurm_msg_t req_msg; slurm_msg_t resp_msg; acct_gather_energy_req_msg_t req; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *this_addr; xassert(sensor_cnt); xassert(energy); *sensor_cnt = 0; *energy = NULL; slurm_msg_t_init(&req_msg); slurm_msg_t_init(&resp_msg); if (host) slurm_conf_get_addr(host, &req_msg.address); else if (cluster_flags & CLUSTER_FLAG_MULTSD) { if ((this_addr = getenv("SLURMD_NODENAME"))) { slurm_conf_get_addr(this_addr, &req_msg.address); } else { this_addr = "localhost"; slurm_set_addr(&req_msg.address, (uint16_t)slurm_get_slurmd_port(), this_addr); } } else { char this_host[256]; /* * Set request message address to slurmd on localhost */ gethostname_short(this_host, sizeof(this_host)); this_addr = slurm_conf_get_nodeaddr(this_host); if (this_addr == NULL) this_addr = xstrdup("localhost"); slurm_set_addr(&req_msg.address, (uint16_t)slurm_get_slurmd_port(), this_addr); xfree(this_addr); } req.delta = delta; req_msg.msg_type = REQUEST_ACCT_GATHER_ENERGY; req_msg.data = &req; rc = slurm_send_recv_node_msg(&req_msg, &resp_msg, 0); if (rc != 0 || !resp_msg.auth_cred) { error("slurm_get_node_energy: %m"); if (resp_msg.auth_cred) g_slurm_auth_destroy(resp_msg.auth_cred); return SLURM_ERROR; } if (resp_msg.auth_cred) g_slurm_auth_destroy(resp_msg.auth_cred); switch (resp_msg.msg_type) { case RESPONSE_ACCT_GATHER_ENERGY: *sensor_cnt = ((acct_gather_node_resp_msg_t *) resp_msg.data)->sensor_cnt; *energy = ((acct_gather_node_resp_msg_t *) resp_msg.data)->energy; ((acct_gather_node_resp_msg_t *) resp_msg.data)->energy = NULL; slurm_free_acct_gather_node_resp_msg(resp_msg.data); break; case RESPONSE_SLURM_RC: rc = ((return_code_msg_t *) resp_msg.data)->return_code; slurm_free_return_code_msg(resp_msg.data); if (rc) slurm_seterrno_ret(rc); break; default: slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); break; } return SLURM_PROTOCOL_SUCCESS; }
/* * slurm_sprint_job_step_info - output information about a specific Slurm * job step based upon message as loaded using slurm_get_job_steps * IN job_ptr - an individual job step information record pointer * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char * slurm_sprint_job_step_info ( job_step_info_t * job_step_ptr, int one_liner ) { char tmp_node_cnt[40]; char time_str[32]; char limit_str[32]; char tmp_line[128]; char *out = NULL; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); /****** Line 1 ******/ slurm_make_time_str ((time_t *)&job_step_ptr->start_time, time_str, sizeof(time_str)); if (job_step_ptr->time_limit == INFINITE) sprintf(limit_str, "UNLIMITED"); else secs2time_str ((time_t)job_step_ptr->time_limit * 60, limit_str, sizeof(limit_str)); snprintf(tmp_line, sizeof(tmp_line), "StepId=%u.%u UserId=%u StartTime=%s TimeLimit=%s", job_step_ptr->job_id, job_step_ptr->step_id, job_step_ptr->user_id, time_str, limit_str); out = xstrdup(tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 2 ******/ snprintf(tmp_line, sizeof(tmp_line), "State=%s ", job_state_string(job_step_ptr->state)); xstrcat(out, tmp_line); if (cluster_flags & CLUSTER_FLAG_BG) { char *io_nodes; select_g_select_jobinfo_get(job_step_ptr->select_jobinfo, SELECT_JOBDATA_IONODES, &io_nodes); if (io_nodes) { snprintf(tmp_line, sizeof(tmp_line), "Partition=%s MidplaneList=%s[%s] Gres=%s", job_step_ptr->partition, job_step_ptr->nodes, io_nodes, job_step_ptr->gres); xfree(io_nodes); } else snprintf(tmp_line, sizeof(tmp_line), "Partition=%s MidplaneList=%s Gres=%s", job_step_ptr->partition, job_step_ptr->nodes, job_step_ptr->gres); } else { snprintf(tmp_line, sizeof(tmp_line), "Partition=%s NodeList=%s Gres=%s", job_step_ptr->partition, job_step_ptr->nodes, job_step_ptr->gres); } xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 3 ******/ if (cluster_flags & CLUSTER_FLAG_BGQ) { uint32_t nodes = 0; select_g_select_jobinfo_get(job_step_ptr->select_jobinfo, SELECT_JOBDATA_NODE_CNT, &nodes); convert_num_unit((float)nodes, tmp_node_cnt, sizeof(tmp_node_cnt), UNIT_NONE); } else { convert_num_unit((float)_nodes_in_list(job_step_ptr->nodes), tmp_node_cnt, sizeof(tmp_node_cnt), UNIT_NONE); } snprintf(tmp_line, sizeof(tmp_line), "Nodes=%s Tasks=%u Name=%s Network=%s", tmp_node_cnt, job_step_ptr->num_tasks, job_step_ptr->name, job_step_ptr->network); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 4 ******/ snprintf(tmp_line, sizeof(tmp_line), "ResvPorts=%s Checkpoint=%u CheckpointDir=%s", job_step_ptr->resv_ports, job_step_ptr->ckpt_interval, job_step_ptr->ckpt_dir); xstrcat(out, tmp_line); if (one_liner) xstrcat(out, " "); else xstrcat(out, "\n "); /****** Line 5 ******/ if (job_step_ptr->cpu_freq == NO_VAL) { snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=Default\n\n"); } else if (job_step_ptr->cpu_freq & CPU_FREQ_RANGE_FLAG) { switch (job_step_ptr->cpu_freq) { case CPU_FREQ_LOW : snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=Low\n\n"); break; case CPU_FREQ_MEDIUM : snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=Medium\n\n"); break; case CPU_FREQ_HIGH : snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=High\n\n"); break; default : snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=Unknown\n\n"); } } else { snprintf(tmp_line, sizeof(tmp_line), "CPUFreqReq=%u\n\n", job_step_ptr->cpu_freq); } xstrcat(out, tmp_line); return out; }
extern void bg_figure_nodes_tasks(int *min_nodes, int *max_nodes, int *ntasks_per_node, bool *ntasks_set, int *ntasks, bool nodes_set, bool nodes_set_opt, bool overcommit, bool set_tasks) { /* BGQ has certain restrictions to run a job. So lets validate * and correct what the user asked for if possible. */ int32_t node_cnt; bool figured = false; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (!(cluster_flags & CLUSTER_FLAG_BGQ)) fatal("bg_figure_nodes_tasks is only valid on a BGQ system."); if (!(*ntasks_set) && (*ntasks_per_node) && (*ntasks_per_node != NO_VAL)) { if ((*ntasks_per_node != 1) && (*ntasks_per_node != 2) && (*ntasks_per_node != 4) && (*ntasks_per_node != 8) && (*ntasks_per_node != 16) && (*ntasks_per_node != 32) && (*ntasks_per_node != 64)) fatal("You requested --ntasks-per-node=%d, " "which is not valid, it must be a power of 2. " "Please validate your request and try again.", *ntasks_per_node); else if (!overcommit && ((*ntasks_per_node == 32) || (*ntasks_per_node == 64))) fatal("You requested --ntasks-per-node=%d, " "which is not valid without --overcommit.", *ntasks_per_node); } if (*max_nodes) node_cnt = *max_nodes; else node_cnt = *min_nodes; if (*ntasks_set) { int32_t ntpn; if (nodes_set) { if (node_cnt > *ntasks) { if (nodes_set_opt) info("You asked for %d nodes, " "but only %d tasks, resetting " "node count to %u.", node_cnt, *ntasks, *ntasks); *max_nodes = *min_nodes = node_cnt = *ntasks; } } /* If nodes not set do not try to set min/max nodes yet since that would result in an incorrect allocation. For a step allocation it is figured out later in srun_job.c _job_create_structure(). */ if ((!*ntasks_per_node || (*ntasks_per_node == NO_VAL))) { /* We always want the next larger number if there is a fraction so we try to stay in the allocation requested. */ *ntasks_per_node = (*ntasks + node_cnt - 1) / node_cnt; figured = true; } /* On a Q we need ntasks_per_node to be a multiple of 2 */ ntpn = *ntasks_per_node; while (!_check_is_pow_of_2(ntpn)) ntpn++; if (!figured && ntpn > 64) fatal("You requested --ntasks-per-node=%d, " "which is not a power of 2. But the next " "largest power of 2 (%d) is greater than the " "largest valid power which is 64. Please " "validate your request and try again.", *ntasks_per_node, ntpn); if (!figured && (ntpn != *ntasks_per_node)) { info("You requested --ntasks-per-node=%d, which is not " "a power of 2. Setting --ntasks-per-node=%d " "for you.", *ntasks_per_node, ntpn); figured = true; } *ntasks_per_node = ntpn; /* We always want the next larger number if there is a fraction so we try to stay in the allocation requested. */ ntpn = ((*ntasks) + (*ntasks_per_node) - 1) / (*ntasks_per_node); /* Make sure we are requesting the correct number of nodes. */ if (node_cnt < ntpn) { *max_nodes = *min_nodes = ntpn; if (nodes_set && !figured) { fatal("You requested -N %d and -n %d " "with --ntasks-per-node=%d. " "This isn't a valid request.", node_cnt, *ntasks, *ntasks_per_node); } node_cnt = *max_nodes; } /* Do this again to make sure we have a legitimate ratio. */ ntpn = *ntasks_per_node; if ((node_cnt * ntpn) < *ntasks) { ntpn++; while (!_check_is_pow_of_2(ntpn)) ntpn++; if (!figured && (ntpn != *ntasks_per_node)) info("You requested --ntasks-per-node=%d, " "which cannot spread across %d nodes " "correctly. Setting --ntasks-per-node=%d " "for you.", *ntasks_per_node, node_cnt, ntpn); *ntasks_per_node = ntpn; } else if (!overcommit && ((node_cnt * ntpn) > *ntasks)) { ntpn = (*ntasks + node_cnt - 1) / node_cnt; while (!_check_is_pow_of_2(ntpn)) ntpn++; if (!figured && (ntpn != *ntasks_per_node)) info("You requested --ntasks-per-node=%d, " "which is more than the tasks you " "requested. Setting --ntasks-per-node=%d " "for you.", *ntasks_per_node, ntpn); *ntasks_per_node = ntpn; } } else if (set_tasks) { if (*ntasks_per_node && (*ntasks_per_node != NO_VAL)) *ntasks = node_cnt * (*ntasks_per_node); else { *ntasks = node_cnt; *ntasks_per_node = 1; } *ntasks_set = true; } /* If set_tasks isn't set we are coming in for the allocation so verify it will work first before we go any futher. */ if (nodes_set && (*ntasks_per_node && (*ntasks_per_node != NO_VAL))) { if ((*ntasks_per_node != 1) && (*ntasks_per_node != 2) && (*ntasks_per_node != 4) && (*ntasks_per_node != 8) && (*ntasks_per_node != 16) && (*ntasks_per_node != 32) && (*ntasks_per_node != 64)) { if (*ntasks_set) fatal("You requested -N %d and -n %d " "which gives --ntasks-per-node=%d. " "This isn't a valid request.", node_cnt, *ntasks, *ntasks_per_node); else fatal("You requested -N %d and " "--ntasks-per-node=%d. " "This isn't a valid request.", node_cnt, *ntasks_per_node); } else if (!overcommit && ((*ntasks_per_node == 32) || (*ntasks_per_node == 64))) { if (*ntasks_set) fatal("You requested -N %d and -n %d " "which gives --ntasks-per-node=%d. " "This isn't a valid request " "without --overcommit.", node_cnt, *ntasks, *ntasks_per_node); else fatal("You requested -N %d and " "--ntasks-per-node=%d. " "This isn't a valid request " "without --overcommit.", node_cnt, *ntasks_per_node); } } /* If we aren't setting tasks reset ntasks_per_node as well. */ if (!set_tasks && figured) *ntasks_per_node = 0; }
/* * slurm_job_will_run - determine if a job would execute immediately if * submitted now * IN job_desc_msg - description of resource allocation request * RET 0 on success, otherwise return -1 and set errno to indicate the error */ int slurm_job_will_run (job_desc_msg_t *req) { slurm_msg_t req_msg, resp_msg; will_run_response_msg_t *will_run_resp; char buf[64]; bool host_set = false; int rc; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); char *type = "processors"; /* req.immediate = true; implicit */ if ((req->alloc_node == NULL) && (gethostname_short(buf, sizeof(buf)) == 0)) { req->alloc_node = buf; host_set = true; } slurm_msg_t_init(&req_msg); req_msg.msg_type = REQUEST_JOB_WILL_RUN; req_msg.data = req; rc = slurm_send_recv_controller_msg(&req_msg, &resp_msg); if (host_set) req->alloc_node = NULL; if (rc < 0) return SLURM_SOCKET_ERROR; switch (resp_msg.msg_type) { case RESPONSE_SLURM_RC: if (_handle_rc_msg(&resp_msg) < 0) return SLURM_PROTOCOL_ERROR; break; case RESPONSE_JOB_WILL_RUN: if(cluster_flags & CLUSTER_FLAG_BG) type = "cnodes"; will_run_resp = (will_run_response_msg_t *) resp_msg.data; slurm_make_time_str(&will_run_resp->start_time, buf, sizeof(buf)); info("Job %u to start at %s using %u %s" " on %s", will_run_resp->job_id, buf, will_run_resp->proc_cnt, type, will_run_resp->node_list); if (will_run_resp->preemptee_job_id) { ListIterator itr; uint32_t *job_id_ptr; char *job_list = NULL, *sep = ""; itr = list_iterator_create(will_run_resp-> preemptee_job_id); while ((job_id_ptr = list_next(itr))) { if (job_list) sep = ","; xstrfmtcat(job_list, "%s%u", sep, *job_id_ptr); } info(" Preempts: %s", job_list); xfree(job_list); } slurm_free_will_run_response_msg(will_run_resp); break; default: slurm_seterrno_ret(SLURM_UNEXPECTED_MSG_ERROR); break; } return SLURM_PROTOCOL_SUCCESS; }
/* * slurm_sprint_reservation_info - output information about a specific Slurm * reservation based upon message as loaded using slurm_load_reservations * IN resv_ptr - an individual reservation information record pointer * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char *slurm_sprint_reservation_info ( reserve_info_t * resv_ptr, int one_liner ) { char tmp1[32], tmp2[32], tmp3[32], *flag_str = NULL; char *state="INACTIVE"; char *out = NULL; uint32_t duration; time_t now = time(NULL); uint32_t cluster_flags = slurmdb_setup_cluster_flags(); bool is_bluegene = cluster_flags & CLUSTER_FLAG_BG; char *line_end = (one_liner) ? " " : "\n "; /****** Line 1 ******/ slurm_make_time_str(&resv_ptr->start_time, tmp1, sizeof(tmp1)); slurm_make_time_str(&resv_ptr->end_time, tmp2, sizeof(tmp2)); if (resv_ptr->end_time >= resv_ptr->start_time) { duration = difftime(resv_ptr->end_time, resv_ptr->start_time); secs2time_str(duration, tmp3, sizeof(tmp3)); } else { snprintf(tmp3, sizeof(tmp3), "N/A"); } xstrfmtcat(out, "ReservationName=%s StartTime=%s EndTime=%s Duration=%s", resv_ptr->name, tmp1, tmp2, tmp3); xstrcat(out, line_end); /****** Line 2 ******/ flag_str = reservation_flags_string(resv_ptr->flags); xstrfmtcat(out, "%s=%s %sCnt=%u %sCnt=%u Features=%s " "PartitionName=%s Flags=%s", is_bluegene ? "Midplanes" : "Nodes", resv_ptr->node_list, is_bluegene ? "Midplane" : "Node", (resv_ptr->node_cnt == NO_VAL) ? 0 : resv_ptr->node_cnt, is_bluegene ? "Cnode" : "Core", resv_ptr->core_cnt, resv_ptr->features, resv_ptr->partition, flag_str); xfree(flag_str); xstrcat(out, line_end); /****** Line 3 ******/ xstrfmtcat(out, "TRES=%s", resv_ptr->tres_str); xstrcat(out, line_end); /****** Line 4 ******/ if (resv_ptr->resv_watts != (time_t) NO_VAL) { snprintf(tmp1, 32, "%u", resv_ptr->resv_watts); } else snprintf(tmp1, 32, "n/a"); if ((resv_ptr->start_time <= now) && (resv_ptr->end_time >= now)) state = "ACTIVE"; xstrfmtcat(out, "Users=%s Accounts=%s Licenses=%s State=%s BurstBuffer=%s " "Watts=%s", resv_ptr->users, resv_ptr->accounts, resv_ptr->licenses, state, resv_ptr->burst_buffer, tmp1); if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }
extern int unpack_job_resources(job_resources_t **job_resrcs_pptr, Buf buffer, uint16_t protocol_version) { char *bit_fmt = NULL; uint32_t empty, tmp32; job_resources_t *job_resrcs; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); xassert(job_resrcs_pptr); if (protocol_version >= SLURM_2_5_PROTOCOL_VERSION) { safe_unpack32(&empty, buffer); if (empty == NO_VAL) { *job_resrcs_pptr = NULL; return SLURM_SUCCESS; } job_resrcs = xmalloc(sizeof(struct job_resources)); job_resrcs->nhosts = empty; safe_unpack32(&job_resrcs->ncpus, buffer); safe_unpack32(&job_resrcs->node_req, buffer); safe_unpackstr_xmalloc(&job_resrcs->nodes, &tmp32, buffer); safe_unpack32_array(&job_resrcs->cpu_array_reps, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpu_array_reps); job_resrcs->cpu_array_cnt = tmp32; safe_unpack16_array(&job_resrcs->cpu_array_value, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpu_array_value); if (tmp32 != job_resrcs->cpu_array_cnt) goto unpack_error; safe_unpack16_array(&job_resrcs->cpus, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpus); if (tmp32 != job_resrcs->nhosts) goto unpack_error; safe_unpack16_array(&job_resrcs->cpus_used, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpus_used); safe_unpack32_array(&job_resrcs->memory_allocated, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->memory_allocated); safe_unpack32_array(&job_resrcs->memory_used, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->memory_used); if (!(cluster_flags & CLUSTER_FLAG_BG)) { safe_unpack16_array(&job_resrcs->sockets_per_node, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->sockets_per_node); safe_unpack16_array(&job_resrcs->cores_per_socket, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cores_per_socket); safe_unpack32_array(&job_resrcs->sock_core_rep_count, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->sock_core_rep_count); unpack_bit_str(&job_resrcs->core_bitmap, buffer); unpack_bit_str(&job_resrcs->core_bitmap_used, buffer); } } else if (protocol_version >= SLURM_2_3_PROTOCOL_VERSION) { uint8_t tmp_8; safe_unpack32(&empty, buffer); if (empty == NO_VAL) { *job_resrcs_pptr = NULL; return SLURM_SUCCESS; } job_resrcs = xmalloc(sizeof(struct job_resources)); job_resrcs->nhosts = empty; safe_unpack32(&job_resrcs->ncpus, buffer); safe_unpack8(&tmp_8, buffer); if (tmp_8 < 100) /* Not NODE_CR_RESERVED */ job_resrcs->node_req = tmp_8; /* 32-bit in v2.5 */ else job_resrcs->node_req = NODE_CR_RESERVED; safe_unpackstr_xmalloc(&job_resrcs->nodes, &tmp32, buffer); safe_unpack32_array(&job_resrcs->cpu_array_reps, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpu_array_reps); job_resrcs->cpu_array_cnt = tmp32; safe_unpack16_array(&job_resrcs->cpu_array_value, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpu_array_value); if (tmp32 != job_resrcs->cpu_array_cnt) goto unpack_error; safe_unpack16_array(&job_resrcs->cpus, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpus); if (tmp32 != job_resrcs->nhosts) goto unpack_error; safe_unpack16_array(&job_resrcs->cpus_used, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cpus_used); safe_unpack32_array(&job_resrcs->memory_allocated, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->memory_allocated); safe_unpack32_array(&job_resrcs->memory_used, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->memory_used); if (!(cluster_flags & CLUSTER_FLAG_BG)) { safe_unpack16_array(&job_resrcs->sockets_per_node, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->sockets_per_node); safe_unpack16_array(&job_resrcs->cores_per_socket, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->cores_per_socket); safe_unpack32_array(&job_resrcs->sock_core_rep_count, &tmp32, buffer); if (tmp32 == 0) xfree(job_resrcs->sock_core_rep_count); unpack_bit_str(&job_resrcs->core_bitmap, buffer); unpack_bit_str(&job_resrcs->core_bitmap_used, buffer); } } else { error("unpack_job_resources: protocol_version %hu not " "supported", protocol_version); goto unpack_error; } *job_resrcs_pptr = job_resrcs; return SLURM_SUCCESS; unpack_error: error("unpack_job_resources: unpack error"); free_job_resources(&job_resrcs); xfree(bit_fmt); *job_resrcs_pptr = NULL; return SLURM_ERROR; }
/* * slurm_sprint_block_info - output information about a specific Bluegene * block based upon message as loaded using slurm_load_block * IN block_ptr - an individual partition information record pointer * IN one_liner - print as a single line if true * RET out - char * containing formatted output (must be freed after call) * NULL is returned on failure. */ char *slurm_sprint_block_info( block_info_t * block_ptr, int one_liner) { int j; char tmp1[16], tmp2[16], *tmp_char = NULL; char *out = NULL; char *line_end = "\n "; uint32_t cluster_flags = slurmdb_setup_cluster_flags(); if (one_liner) line_end = " "; /****** Line 1 ******/ convert_num_unit((float)block_ptr->cnode_cnt, tmp1, sizeof(tmp1), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); if (cluster_flags & CLUSTER_FLAG_BGQ) { convert_num_unit((float)block_ptr->cnode_err_cnt, tmp2, sizeof(tmp2), UNIT_NONE, NO_VAL, CONVERT_NUM_UNIT_EXACT); tmp_char = xstrdup_printf("%s/%s", tmp1, tmp2); } else tmp_char = tmp1; out = xstrdup_printf("BlockName=%s TotalNodes=%s State=%s%s", block_ptr->bg_block_id, tmp_char, bg_block_state_string(block_ptr->state), line_end); if (cluster_flags & CLUSTER_FLAG_BGQ) xfree(tmp_char); /****** Line 2 ******/ j = 0; if (block_ptr->job_list) j = list_count(block_ptr->job_list); if (!j) xstrcat(out, "JobRunning=NONE "); else if (j == 1) { block_job_info_t *block_job = list_peek(block_ptr->job_list); xstrfmtcat(out, "JobRunning=%u ", block_job->job_id); } else xstrcat(out, "JobRunning=Multiple "); tmp_char = conn_type_string_full(block_ptr->conn_type); xstrfmtcat(out, "ConnType=%s", tmp_char); xfree(tmp_char); if (cluster_flags & CLUSTER_FLAG_BGL) xstrfmtcat(out, " NodeUse=%s", node_use_string(block_ptr->node_use)); xstrcat(out, line_end); /****** Line 3 ******/ if (block_ptr->ionode_str) xstrfmtcat(out, "MidPlanes=%s[%s] MPIndices=", block_ptr->mp_str, block_ptr->ionode_str); else xstrfmtcat(out, "MidPlanes=%s MPIndices=", block_ptr->mp_str); for (j = 0; (block_ptr->mp_inx && (block_ptr->mp_inx[j] != -1)); j+=2) { if (j > 0) xstrcat(out, ","); xstrfmtcat(out, "%d-%d", block_ptr->mp_inx[j], block_ptr->mp_inx[j+1]); } xstrcat(out, line_end); /****** Line 4 ******/ xstrfmtcat(out, "MloaderImage=%s%s", block_ptr->mloaderimage, line_end); if (cluster_flags & CLUSTER_FLAG_BGL) { /****** Line 5 ******/ xstrfmtcat(out, "BlrtsImage=%s%s", block_ptr->blrtsimage, line_end); /****** Line 6 ******/ xstrfmtcat(out, "LinuxImage=%s%s", block_ptr->linuximage, line_end); /****** Line 7 ******/ xstrfmtcat(out, "RamdiskImage=%s", block_ptr->ramdiskimage); } else if (cluster_flags & CLUSTER_FLAG_BGP) { /****** Line 5 ******/ xstrfmtcat(out, "CnloadImage=%s%s", block_ptr->linuximage, line_end); /****** Line 6 ******/ xstrfmtcat(out, "IoloadImage=%s", block_ptr->ramdiskimage); } if (block_ptr->reason) xstrfmtcat(out, "Reason=%s%s", block_ptr->reason, line_end); if (one_liner) xstrcat(out, "\n"); else xstrcat(out, "\n\n"); return out; }