| /*****************************************************************************\ |
| * node_scheduler.h - definitions of functions in node_scheduler.c |
| ***************************************************************************** |
| * Copyright (C) 2004-2007 The Regents of the University of California. |
| * Copyright (C) 2008 Lawrence Livermore National Security. |
| * Produced at Lawrence Livermore National Laboratory (cf, DISCLAIMER). |
| * Written by Morris Jette <jette@llnl.gov> et. al. |
| * CODE-OCEC-09-009. All rights reserved. |
| * |
| * This file is part of Slurm, a resource management program. |
| * For details, see <https://slurm.schedmd.com/>. |
| * Please also read the included file: DISCLAIMER. |
| * |
| * Slurm is free software; you can redistribute it and/or modify it under |
| * the terms of the GNU General Public License as published by the Free |
| * Software Foundation; either version 2 of the License, or (at your option) |
| * any later version. |
| * |
| * In addition, as a special exception, the copyright holders give permission |
| * to link the code of portions of this program with the OpenSSL library under |
| * certain conditions as described in each individual source file, and |
| * distribute linked combinations including the two. You must obey the GNU |
| * General Public License in all respects for all of the code used other than |
| * OpenSSL. If you modify file(s) with this exception, you may extend this |
| * exception to your version of the file(s), but you are not obligated to do |
| * so. If you do not wish to do so, delete this exception statement from your |
| * version. If you delete this exception statement from all source files in |
| * the program, then also delete it here. |
| * |
| * Slurm is distributed in the hope that it will be useful, but WITHOUT ANY |
| * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more |
| * details. |
| * |
| * You should have received a copy of the GNU General Public License along |
| * with Slurm; if not, write to the Free Software Foundation, Inc., |
| * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
| \*****************************************************************************/ |
| |
| #ifndef _HAVE_NODE_SCHEDULER_H |
| #define _HAVE_NODE_SCHEDULER_H |
| |
| typedef struct { |
| char **err_msg; |
| job_record_t *job_ptr; |
| int rc; |
| int rc_best; |
| int rc_part_limits; |
| int rc_qos; |
| int rc_resv; |
| bool test_only; |
| } job_node_select_t; |
| |
| /* |
| * allocate_nodes - change state of specified nodes to NODE_STATE_ALLOCATED |
| * also claim required licenses |
| * IN job_ptr - job being allocated resources |
| */ |
| extern void allocate_nodes(job_record_t *job_ptr); |
| |
| /* For a given job, if the available nodes differ from those with currently |
| * active features, return a bitmap of nodes with the job's required |
| * features currently active |
| * IN job_ptr - job requesting resource allocation |
| * IN avail_bitmap - nodes currently available for this job |
| * OUT active_bitmap - nodes with job's features currently active, NULL if |
| * identical to avail_bitmap |
| * NOTE: Currently supports only simple AND of features |
| */ |
| extern void build_active_feature_bitmap(job_record_t *job_ptr, |
| bitstr_t *avail_bitmap, |
| bitstr_t **active_bitmap); |
| |
| /* Return bitmap of nodes with all specified features currently active */ |
| extern bitstr_t *build_active_feature_bitmap2(char *reboot_features); |
| |
| /* |
| * build_node_details - sets addresses for allocated nodes |
| * IN job_ptr - pointer to a job record |
| * IN new_alloc - set if new job allocation, cleared if state recovery |
| */ |
| extern void build_node_details(job_record_t *job_ptr, bool new_alloc); |
| |
| /* |
| * deallocate_nodes - for a given job, deallocate its nodes and make |
| * their state NODE_STATE_COMPLETING |
| * also release the job's licenses |
| * IN job_ptr - pointer to terminating job (already in some COMPLETING state) |
| * IN timeout - true if job exhausted time limit, send REQUEST_KILL_TIMELIMIT |
| * RPC instead of REQUEST_TERMINATE_JOB |
| * IN suspended - true if job was already suspended (node's run_job_cnt |
| * already decremented); |
| * IN preempted - true if job is being preempted |
| */ |
| extern void deallocate_nodes(job_record_t *job_ptr, bool timeout, |
| bool suspended, bool preempted); |
| |
| /* Remove nodes from consideration for allocation based upon "mcs" by |
| * other users |
| * job_ptr IN - Job to be scheduled |
| * usable_node_mask IN/OUT - Nodes available for use by this job's mcs |
| */ |
| extern void filter_by_node_mcs(job_record_t *job_ptr, int mcs_select, |
| bitstr_t *usable_node_mask); |
| |
| /* Remove nodes from consideration for allocation based upon "ownership" by |
| * other users |
| * job_ptr IN - Job to be scheduled |
| * usable_node_mask IN/OUT - Nodes available for use by this job's user |
| */ |
| extern void filter_by_node_owner(job_record_t *job_ptr, |
| bitstr_t *usable_node_mask); |
| |
| /* |
| * For every element in the feature_list, identify the nodes with that feature |
| * either active or available and set the feature_list's node_bitmap_active and |
| * node_bitmap_avail fields accordingly. |
| */ |
| extern void find_feature_nodes(list_t *feature_list, bool can_reboot); |
| |
| /* |
| * re_kill_job - for a given job, deallocate its nodes for a second time, |
| * basically a cleanup for failed deallocate() calls |
| * IN job_ptr - pointer to terminating job (already in some COMPLETING state) |
| * globals: node_record_count - number of nodes in the system |
| * node_record_table_ptr - pointer to global node table |
| */ |
| extern void re_kill_job(job_record_t *job_ptr); |
| |
| /* |
| * select_nodes - select and allocate nodes to a specific job |
| * IN job_node_select - pointer with at least a pointer to the job record |
| * IN test_only - if set do not allocate nodes, just confirm they |
| * could be allocated now |
| * IN submission - if set ignore reservations |
| * IN scheduler_type - which scheduler is calling this |
| * (i.e. SLURMDB_JOB_FLAG_BACKFILL, SLURMDB_JOB_FLAG_SCHED, etc) |
| * RET 0 on success, ESLURM code from slurm_errno.h otherwise |
| * globals: list_part - global list of partition info |
| * default_part_loc - pointer to default partition |
| * config_list - global list of node configuration info |
| * Notes: The algorithm is |
| * 1) Build a table (node_set_ptr) of nodes with the requisite |
| * configuration. Each table entry includes their weight, |
| * node_list, features, etc. |
| * 2) Call _pick_best_nodes() to select those nodes best satisfying |
| * the request, (e.g. best-fit or other criterion) |
| * 3) Call allocate_nodes() to perform the actual allocation |
| */ |
| extern int select_nodes(job_node_select_t *job_node_select, |
| bool test_only, bool submission, |
| uint32_t scheduler_type); |
| |
| /* |
| * get_node_cnts - determine the number of nodes for the requested job. |
| * IN job_ptr - pointer to the job record. |
| * IN qos_flags - Flags of the job_ptr's qos. This is so we don't have to send |
| * in a pointer or lock the qos read lock before calling. |
| * IN part_ptr - pointer to the job's partition. |
| * OUT min_nodes - The minimum number of nodes for the job. |
| * OUT req_nodes - The number of node the select plugin should target. |
| * OUT max_nodes - The max number of nodes for the job. |
| * RET SLURM_SUCCESS on success, ESLURM code from slurm_errno.h otherwise. |
| */ |
| extern int get_node_cnts(job_record_t *job_ptr, uint32_t qos_flags, |
| part_record_t *part_ptr, uint32_t *min_nodes, |
| uint32_t *req_nodes, uint32_t *max_nodes); |
| |
| /* launch_prolog - launch job prolog script by slurmd on allocated nodes |
| * IN job_ptr - pointer to the job record |
| */ |
| extern void launch_prolog(job_record_t *job_ptr); |
| |
| /* |
| * valid_feature_counts - validate a job's features can be satisfied |
| * by the selected nodes (NOTE: does not process MOR or XAND operators) |
| * IN job_ptr - job to operate on |
| * IN use_active - if set, then only consider nodes with the identified features |
| * active, otherwise use available features |
| * IN/OUT node_bitmap - nodes available for use, clear if unusable |
| * OUT has_mor - set if MOR/XAND found in feature expression |
| * RET SLURM_SUCCESS or error |
| */ |
| extern int valid_feature_counts(job_record_t *job_ptr, bool use_active, |
| bitstr_t *node_bitmap, bool *has_mor); |
| |
| #endif /* !_HAVE_NODE_SCHEDULER_H */ |