<div dir="ltr"><div><div><div><div><div><div><div><div>Hello i migrated from slurm 16 to slurm 17.11.4<br><br></div>but my node feature not work, i apply my feature and i reboot but when machine is rebooted slurm make my node in drain<br><br></div>with sinfo -r i have this error message :<br>Failed to reboot nodes machine415 into expected state for job 945<br><br></div>My problem is located in slurm source at this file :<br>slurm-17.11.4/src/slurmctld/job_sheduler.c<br>ligne 4222<br><br>static void *_wait_boot(void *arg)<br>{<br>    <br>    if (boot_node_bitmap && bit_set_count(boot_node_bitmap)) {<br>        char *node_list = bitmap2node_name(boot_node_bitmap);<br>        error("Failed to reboot nodes %s into expected state for job %u",<br>              node_list, job_ptr->job_id);<br>        (void) drain_nodes(node_list, "Node mode change failure",<br>                   getuid());<br>        xfree(node_list);<br>        (void) job_requeue(getuid(), job_ptr->job_id, NULL, false, 0);<br>    }<br><br><br><br><br></div>i comment this function and my node feature plugin work !<br><br><br></div>but i want to solve my problem with modify my plugin code<br></div>but I don't know what to change in my code<br>what should I save as a variable in my code? with xalloc or xrealloc.<br><br></div>i share my basic sour ce code, i think that i save active_features when function node_features_p_node_set is called, but how can i save this variable ? i try to save *active_features into char **current_mode but i have same error<br><br></div>thanks for advance for your help<br><div><br><br><br><br>#include "config.h"<br><br>#define _GNU_SOURCE    /* For POLLRDHUP */<br>#include <ctype.h><br>#include <poll.h><br>#include <signal.h><br>#include <stdlib.h><br>#include <sys/stat.h><br>#include <sys/types.h><br>#include <unistd.h><br><br>#if defined(__FreeBSD__) || defined(__NetBSD__)<br>#define POLLRDHUP POLLHUP<br>#endif<br><br>#include "slurm/slurm.h"<br><br>#include "src/common/assoc_mgr.h"<br>#include "src/common/bitstring.h"<br>#include "src/common/fd.h"<br>#include "src/common/gres.h"<br>#include "src/common/list.h"<br>#include "src/common/macros.h"<br>#include "src/common/pack.h"<br>#include "src/common/parse_config.h"<br>#include "src/common/slurm_protocol_api.h"<br>//#include "src/common/slurm_strcasestr.h"<br>#include "src/common/timers.h"<br>#include "src/common/uid.h"<br>#include "src/common/xmalloc.h"<br>#include "src/common/xstring.h"<br>#include "src/slurmctld/job_scheduler.h"<br>#include "src/slurmctld/locks.h"<br>#include "src/slurmctld/node_scheduler.h"<br>#include "src/slurmctld/reservation.h"<br>#include "src/slurmctld/slurmctld.h"<br>#include "src/slurmctld/state_save.h"<br><br><br>const char plugin_name[]        = "node_features update_linux plugin";<br>const char plugin_type[]        = "node_features/update_linux";<br>const uint32_t plugin_version   = SLURM_VERSION_NUMBER;<br><br><br>extern int node_features_p_get_config()  {<br>}<br><br>extern bool node_features_p_node_update_valid(void *node_ptr, update_node_msg_t *update_node_msg) {<br>    return true;<br>}<br><br>extern uint32_t node_features_p_boot_time(void) {<br>    uint32_t boot_time = (6 * 60);    /* 6 minute estimated boot time */<br>    return boot_time;<br>}<br><br>extern bool node_features_p_changible_feature(char *feature) {<br>    return true;<br>}<br><br>extern bool node_features_p_changeable_feature(char *feature) {<br>    return true;<br>}<br><br>extern void node_features_p_step_config(bool mem_sort, bitstr_t *numa_bitmap)  {<br>}<br><br>extern char *node_features_p_node_xlate2(char *new_features)  {<br>    return new_features;<br>}<br><br><br>/* Load configuration */<br>extern int init(void)<br>{<br>    debug("init_new plugin*********************************************************************************");<br>    int rc = SLURM_SUCCESS;<br>    return rc;<br>}<br><br>extern int fini(void)<br>{<br>    debug("fini_*********************************************************************************");<br>    return SLURM_SUCCESS;<br>}<br><br>extern int node_features_p_get_node(char *node_list)<br>{<br>    debug("node_features_p_get_node_*********************************************************************************");<br>    return SLURM_SUCCESS;<br>}<br><br>extern char *node_features_p_node_xlate(char *new_features, char *orig_features, char *avail_features)<br>{<br>    return avail_features;<br>}<br><br>extern void node_features_p_node_state(char **avail_modes, char **current_mode)<br>{<br>    debug("node_features_p_node_state_*********************************************************************************");<br>}<br><br>/* Translate a job's feature request to the node features needed at boot time */<br>extern char *node_features_p_job_xlate(char *job_features)<br>{<br>    debug("node_features_p_job_xlate_*********************************************************************************");<br>    return job_features;<br>}<br><br>/* Test if a job's feature specification is valid */<br>extern int node_features_p_job_valid(char *job_features)<br>{<br>    debug("node_features_p_job_valid_*********************************************************************************");<br>    return SLURM_SUCCESS;<br>}<br><br>bool node_features_g_node_update_valid(void *node_ptr, update_node_msg_t *update_node_msg) {<br>    return true;<br>}<br><br>/* Set's the node's active features based upon job constraints.<br> * NOTE: Executed by the slurmd daemon.<br> * IN active_features - New active features<br> * RET error code */<br>extern int node_features_p_node_set(char *active_features)<br>{<br>    debug("node_features_p_node_set_*********************************************************************************");<br>    int error_code = SLURM_SUCCESS;<br>    active_features[0] = '\0';<br>    return error_code;<br>}<br><br>/* Return true if the plugin requires PowerSave mode for booting nodes */<br>extern bool node_features_p_node_power(void)<br>{<br>    debug("node_features_p_node_power_*********************************************************************************");<br>    return false;<br>}<br><br>extern int node_features_p_node_update(char *active_features, bitstr_t *node_bitmap)<br>{<br>    debug("_node_features_p_node_update********************************************************************************");<br>    return SLURM_SUCCESS;<br>}<br><br>/* Reload configuration */<br>extern int node_features_p_reconfig(void)<br>{<br>    debug("_node_features_p_reconfig********************************************************************************");<br>    return 1;<br>}<br><br>/* Determine if the specified user can modify the currently available node<br> * features */<br>extern bool node_features_p_user_update(uid_t uid)<br>{<br>    debug("_node_features_p_user_update********************************************************************************");<br>    return true;<br>}<br><br><div><br></div></div></div>