diff --git a/slurm/slurm.h.in b/slurm/slurm.h.in index e4016689f7f909d2858861081eaa7d3443f5310c..d1b8f89c49d44a261f67586b5f5fc12200873bd3 100644 --- a/slurm/slurm.h.in +++ b/slurm/slurm.h.in @@ -216,7 +216,6 @@ enum select_data_type { SELECT_DATA_START, /* data-> uint16_t start[SYSTEM_DIMENSIONS] */ SELECT_DATA_GEOMETRY, /* data-> uint16_t geometry[SYSTEM_DIMENSIONS] */ SELECT_DATA_ROTATE, /* data-> uint16_t rotate */ - SELECT_DATA_NODE_USE, /* data-> uint16_t node_use */ SELECT_DATA_CONN_TYPE, /* data-> uint16_t connection_type */ SELECT_DATA_BLOCK_ID, /* data-> char bg_block_id */ SELECT_DATA_QUARTER, /* data-> uint16_t quarter */ diff --git a/src/common/node_select.c b/src/common/node_select.c index 13b875d1c05f4e584d59256f262e08d49f552b5d..14e34479b5b375230b90229604d148db07182b5e 100644 --- a/src/common/node_select.c +++ b/src/common/node_select.c @@ -127,7 +127,6 @@ struct select_jobinfo { * dimensions, e.g. XYZ */ uint16_t conn_type; /* see enum connection_type */ uint16_t rotate; /* permit geometry rotation if set */ - uint16_t node_use; /* see enum node_use_type */ char *bg_block_id; /* Blue Gene block ID */ uint16_t magic; /* magic number */ uint16_t quarter; /* for bg to tell which quarter of a small @@ -617,8 +616,6 @@ static int _unpack_node_info(bg_info_record_t *bg_info_record, Buf buffer) safe_unpack16(&uint16_tmp, buffer); bg_info_record->conn_type = (int) uint16_tmp; safe_unpack16(&uint16_tmp, buffer); - bg_info_record->node_use = (int) uint16_tmp; - safe_unpack16(&uint16_tmp, buffer); bg_info_record->quarter = (int) uint16_tmp; safe_unpack16(&uint16_tmp, buffer); bg_info_record->nodecard = (int) uint16_tmp; @@ -686,7 +683,6 @@ extern int select_g_alloc_jobinfo (select_jobinfo_t *jobinfo) } (*jobinfo)->conn_type = SELECT_NAV; (*jobinfo)->rotate = (uint16_t) NO_VAL; - (*jobinfo)->node_use = SELECT_NAV; (*jobinfo)->bg_block_id = NULL; (*jobinfo)->magic = JOBINFO_MAGIC; (*jobinfo)->quarter = (uint16_t) NO_VAL; @@ -735,9 +731,6 @@ extern int select_g_set_jobinfo (select_jobinfo_t jobinfo, case SELECT_DATA_ROTATE: jobinfo->rotate = *uint16; break; - case SELECT_DATA_NODE_USE: - jobinfo->node_use = *uint16; - break; case SELECT_DATA_CONN_TYPE: jobinfo->conn_type = *uint16; break; @@ -826,9 +819,6 @@ extern int select_g_get_jobinfo (select_jobinfo_t jobinfo, case SELECT_DATA_ROTATE: *uint16 = jobinfo->rotate; break; - case SELECT_DATA_NODE_USE: - *uint16 = jobinfo->node_use; - break; case SELECT_DATA_CONN_TYPE: *uint16 = jobinfo->conn_type; break; @@ -914,7 +904,6 @@ extern select_jobinfo_t select_g_copy_jobinfo(select_jobinfo_t jobinfo) } rc->conn_type = jobinfo->conn_type; rc->rotate = jobinfo->rotate; - rc->node_use = jobinfo->node_use; rc->bg_block_id = xstrdup(jobinfo->bg_block_id); rc->magic = JOBINFO_MAGIC; rc->quarter = jobinfo->quarter; diff --git a/src/plugins/select/bluegene/block_allocator/bridge_linker.c b/src/plugins/select/bluegene/block_allocator/bridge_linker.c index 76f6019415be4609f33130dacda662ec236e61ee..154ffd50249d2a102b356c9c8860c5a3d6cc8c35 100644 --- a/src/plugins/select/bluegene/block_allocator/bridge_linker.c +++ b/src/plugins/select/bluegene/block_allocator/bridge_linker.c @@ -48,6 +48,8 @@ typedef struct { rm_partition_t **partition); status_t (*get_partition_info)(pm_partition_id_t pid, rm_partition_t **partition); + status_t (*modify_partition)(rm_partition_t *partition, + enum rm_modify_op op, const void *data); status_t (*set_part_owner)(pm_partition_id_t pid, const char *name); status_t (*add_part_user)(pm_partition_id_t pid, const char *name); status_t (*remove_part_user)(pm_partition_id_t pid, const char *name); @@ -72,7 +74,7 @@ typedef struct { enum rm_specification field, void *data); status_t (*set_data)(rm_element_t* element, enum rm_specification field, void *data); - + /* all the jm functions */ status_t (*signal_job)(db_job_id_t jid, rm_signal_t sig); status_t (*cancel_job)(db_job_id_t jid); @@ -142,6 +144,7 @@ extern int bridge_init() "rm_add_partition", "rm_get_partition", "rm_get_partition_info", + "rm_modify_partition", "rm_set_part_owner", "rm_add_part_user", "rm_remove_part_user", @@ -250,6 +253,20 @@ extern status_t bridge_get_block_info(pm_partition_id_t pid, } +extern status_t bridge_modify_block(rm_partition_t *partition, + enum rm_modify_op op, const void *data) +{ + int rc = CONNECTION_ERROR; + if(!bridge_init()) + return rc; + + slurm_mutex_lock(&api_file_mutex); + rc = (*(bridge_api.modify_partition))(partition, op, data); + slurm_mutex_unlock(&api_file_mutex); + return rc; + +} + extern status_t bridge_set_block_owner(pm_partition_id_t pid, const char *name) { int rc = CONNECTION_ERROR; diff --git a/src/plugins/select/bluegene/block_allocator/bridge_linker.h b/src/plugins/select/bluegene/block_allocator/bridge_linker.h index d959ddba792f9afb597f4395ccd18c52a916c139..60bd755e7671d5f9a82d2f1eea51d150291a79bf 100644 --- a/src/plugins/select/bluegene/block_allocator/bridge_linker.h +++ b/src/plugins/select/bluegene/block_allocator/bridge_linker.h @@ -15,7 +15,7 @@ * 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 + * 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 @@ -86,6 +86,8 @@ extern status_t bridge_get_block(pm_partition_id_t pid, rm_partition_t **partition); extern status_t bridge_get_block_info(pm_partition_id_t pid, rm_partition_t **partition); +extern status_t bridge_modify_block(rm_partition_t *partition, + enum rm_modify_op op, const void *data); extern status_t bridge_set_block_owner(pm_partition_id_t, const char *); extern status_t bridge_add_block_user(pm_partition_id_t, const char *); extern status_t bridge_remove_block_user(pm_partition_id_t, const char *); diff --git a/src/plugins/select/bluegene/plugin/bg_job_place.c b/src/plugins/select/bluegene/plugin/bg_job_place.c index 9baf7605dbaa4983af178990706f9ced2e3a380e..2c4f9aa81b8dad8a4a47ef74bc9565402326cb13 100644 --- a/src/plugins/select/bluegene/plugin/bg_job_place.c +++ b/src/plugins/select/bluegene/plugin/bg_job_place.c @@ -881,7 +881,7 @@ extern int submit_job(struct job_record *job_ptr, bitstr_t *slurm_block_bitmap, max_nodes, req_nodes, spec, &record, test_only); - if (rc == SLURM_SUCCESS) { + if(rc == SLURM_SUCCESS) { if(!record) { debug2("can run, but block not made"); select_g_set_jobinfo(job_ptr->select_jobinfo, @@ -898,7 +898,7 @@ extern int submit_job(struct job_record *job_ptr, bitstr_t *slurm_block_bitmap, SELECT_DATA_NODE_CNT, &min_nodes); - for (i=0; i<BA_SYSTEM_DIMENSIONS; i++) + for(i=0; i<BA_SYSTEM_DIMENSIONS; i++) geo[i] = 0; select_g_set_jobinfo(job_ptr->select_jobinfo, SELECT_DATA_GEOMETRY, @@ -906,9 +906,11 @@ extern int submit_job(struct job_record *job_ptr, bitstr_t *slurm_block_bitmap, } else { slurm_mutex_lock(&block_state_mutex); - if ((record->full_block == 0) - && (job_ptr->part_ptr->shared == 0)) - error("Small block used in non-shared partition"); + + if((record->quarter != (uint16_t)NO_VAL) + && (job_ptr->part_ptr->shared == 0)) + error("Small block used in " + "non-shared partition"); /* set the block id and info about block */ select_g_set_jobinfo(job_ptr->select_jobinfo, @@ -930,21 +932,6 @@ extern int submit_job(struct job_record *job_ptr, bitstr_t *slurm_block_bitmap, select_g_set_jobinfo(job_ptr->select_jobinfo, SELECT_DATA_CONN_TYPE, &tmp16); - - select_g_set_jobinfo(job_ptr->select_jobinfo, - SELECT_DATA_BLRTS_IMAGE, - record->blrtsimage); - select_g_set_jobinfo(job_ptr->select_jobinfo, - SELECT_DATA_LINUX_IMAGE, - record->linuximage); - select_g_set_jobinfo(job_ptr->select_jobinfo, - SELECT_DATA_MLOADER_IMAGE, - record->mloaderimage); - select_g_set_jobinfo(job_ptr->select_jobinfo, - SELECT_DATA_RAMDISK_IMAGE, - record->ramdiskimage); - - slurm_mutex_unlock(&block_state_mutex); } if(test_only) { diff --git a/src/plugins/select/bluegene/plugin/bg_job_run.c b/src/plugins/select/bluegene/plugin/bg_job_run.c index 107ae095a9077283c8d12347bf42af30908ba464..53a585764df4a78c4494997b701686c6b6bc0f2b 100644 --- a/src/plugins/select/bluegene/plugin/bg_job_run.c +++ b/src/plugins/select/bluegene/plugin/bg_job_run.c @@ -72,8 +72,11 @@ typedef struct bg_update { enum update_op op; /* start | terminate | sync */ uid_t uid; /* new user */ uint32_t job_id; /* SLURM job id */ - uint16_t node_use; /* SLURM job node_use */ pm_partition_id_t bg_block_id; + char *blrtsimage; /* BlrtsImage for this block */ + char *linuximage; /* LinuxImage for this block */ + char *mloaderimage; /* mloaderImage for this block */ + char *ramdiskimage; /* RamDiskImage for this block */ } bg_update_t; static List bg_update_list = NULL; @@ -242,12 +245,12 @@ static void _sync_agent(bg_update_t *bg_update_ptr) /* Perform job initiation work */ static void _start_agent(bg_update_t *bg_update_ptr) { - int rc; + int rc = 0; bg_record_t *bg_record = NULL; bg_record_t *found_record = NULL; ListIterator itr; List delete_list; - + slurm_mutex_lock(&job_start_mutex); bg_record = @@ -322,7 +325,76 @@ static void _start_agent(bg_update_t *bg_update_ptr) bg_update_ptr->job_id); return; } - + rc = 0; + if(bg_update_ptr->blrtsimage + && strcasecmp(bg_update_ptr->blrtsimage, bg_record->blrtsimage)) { + debug3("changeing BlrtsImage from %s to %s", + bg_record->blrtsimage, bg_update_ptr->blrtsimage); + xfree(bg_record->blrtsimage); + bg_record->blrtsimage = xstrdup(bg_update_ptr->blrtsimage); + rc = 1; + } + if(bg_update_ptr->linuximage + && strcasecmp(bg_update_ptr->linuximage, bg_record->linuximage)) { + debug3("changeing LinuxImage from %s to %s", + bg_record->linuximage, bg_update_ptr->linuximage); + xfree(bg_record->linuximage); + bg_record->linuximage = xstrdup(bg_update_ptr->linuximage); + rc = 1; + } + if(bg_update_ptr->mloaderimage + && strcasecmp(bg_update_ptr->mloaderimage, + bg_record->mloaderimage)) { + debug3("changeing MloaderImage from %s to %s", + bg_record->mloaderimage, bg_update_ptr->mloaderimage); + xfree(bg_record->mloaderimage); + bg_record->mloaderimage = xstrdup(bg_update_ptr->mloaderimage); + rc = 1; + } + if(bg_update_ptr->ramdiskimage + && strcasecmp(bg_update_ptr->ramdiskimage, + bg_record->ramdiskimage)) { + debug3("changeing RamDiskImage from %s to %s", + bg_record->ramdiskimage, bg_update_ptr->ramdiskimage); + xfree(bg_record->ramdiskimage); + bg_record->ramdiskimage = xstrdup(bg_update_ptr->ramdiskimage); + rc = 1; + } + + if(rc) { + bg_free_block(bg_record); +#ifdef HAVE_BG_FILES + if ((rc = bridge_modify_block(bg_record->bg_block, + RM_MODIFY_BlrtsImg, + bg_record->blrtsimage)) + != STATUS_OK) + error("bridge_modify_block(RM_MODIFY_BlrtsImg)", + bg_err_str(rc)); + + if ((rc = bridge_modify_block(bg_record->bg_block, + RM_MODIFY_LinuxImg, + bg_record->linuximage)) + != STATUS_OK) + error("bridge_modify_block(RM_MODIFY_LinuxImg)", + bg_err_str(rc)); + + if ((rc = bridge_modify_block(bg_record->bg_block, + RM_MODIFY_MloaderImg, + bg_record->mloaderimage)) + != STATUS_OK) + error("bridge_modify_block(RM_MODIFY_MloaderImg)", + bg_err_str(rc)); + + if ((rc = bridge_modify_block(bg_record->bg_block, + RM_MODIFY_RamdiskImg, + bg_record->ramdiskimage)) + != STATUS_OK) + error("bridge_modify_block(RM_MODIFY_RamdiskImg)", + bg_err_str(rc)); +#endif + + } + if(bg_record->state == RM_PARTITION_FREE) { if((rc = boot_block(bg_record)) != SLURM_SUCCESS) { sleep(2); @@ -738,7 +810,17 @@ extern int start_job(struct job_record *job_ptr) SELECT_DATA_BLOCK_ID, &(bg_update_ptr->bg_block_id)); select_g_get_jobinfo(job_ptr->select_jobinfo, - SELECT_DATA_NODE_USE, &(bg_update_ptr->node_use)); + SELECT_DATA_BLRTS_IMAGE, + &(bg_update_ptr->blrtsimage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_LINUX_IMAGE, + &(bg_update_ptr->linuximage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_MLOADER_IMAGE, + &(bg_update_ptr->mloaderimage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_RAMDISK_IMAGE, + &(bg_update_ptr->ramdiskimage)); bg_record = find_bg_record_in_list(bg_list, bg_update_ptr->bg_block_id); if (bg_record) { @@ -830,7 +912,19 @@ extern int sync_jobs(List job_list) select_g_get_jobinfo(job_ptr->select_jobinfo, SELECT_DATA_BLOCK_ID, &(bg_update_ptr->bg_block_id)); - + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_BLRTS_IMAGE, + &(bg_update_ptr->blrtsimage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_LINUX_IMAGE, + &(bg_update_ptr->linuximage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_MLOADER_IMAGE, + &(bg_update_ptr->mloaderimage)); + select_g_get_jobinfo(job_ptr->select_jobinfo, + SELECT_DATA_RAMDISK_IMAGE, + &(bg_update_ptr->ramdiskimage)); + if (bg_update_ptr->bg_block_id == NULL) { error("Running job %u has bgblock==NULL", job_ptr->job_id); diff --git a/src/plugins/select/bluegene/plugin/block_sys.c b/src/plugins/select/bluegene/plugin/block_sys.c index d579bc3d98b0c882a90ab89a325165db0c0c7eb2..4619577392ed24314729119b9d47540f81275871 100755 --- a/src/plugins/select/bluegene/plugin/block_sys.c +++ b/src/plugins/select/bluegene/plugin/block_sys.c @@ -675,8 +675,59 @@ int read_bg_blocks() bg_record->user_uid = pw_ent->pw_uid; } } - - bg_record->block_lifecycle = STATIC; + + /* get the images of the block */ + if ((rc = bridge_get_data(block_ptr, + RM_PartitionBlrtsImg, + &user_name)) + != STATUS_OK) { + error("bridge_get_data(RM_PartitionBlrtsImg): %s", + bg_err_str(rc)); + } + if(!user_name) { + error("No BlrtsImg was returned from database"); + goto clean_up; + } + bg_record->blrtsimage = xstrdup(user_name); + + if ((rc = bridge_get_data(block_ptr, + RM_PartitionLinuxImg, + &user_name)) + != STATUS_OK) { + error("bridge_get_data(RM_PartitionLinuxImg): %s", + bg_err_str(rc)); + } + if(!user_name) { + error("No LinuxImg was returned from database"); + goto clean_up; + } + bg_record->linuximage = xstrdup(user_name); + + if ((rc = bridge_get_data(block_ptr, + RM_PartitionMloaderImg, + &user_name)) + != STATUS_OK) { + error("bridge_get_data(RM_PartitionMloaderImg): %s", + bg_err_str(rc)); + } + if(!user_name) { + error("No MloaderImg was returned from database"); + goto clean_up; + } + bg_record->mloaderimage = xstrdup(user_name); + + if ((rc = bridge_get_data(block_ptr, + RM_PartitionRamdiskImg, + &user_name)) + != STATUS_OK) { + error("bridge_get_data(RM_PartitionRamdiskImg): %s", + bg_err_str(rc)); + } + if(!user_name) { + error("No RamdiskImg was returned from database"); + goto clean_up; + } + bg_record->ramdiskimage = xstrdup(user_name); clean_up: if (bg_recover diff --git a/src/plugins/select/bluegene/plugin/bluegene.c b/src/plugins/select/bluegene/plugin/bluegene.c index 86d077b1e605e926b7c9d3d0c6ef8a613832a64a..d61328321db771a8bb887af717b5f6a21184016b 100644 --- a/src/plugins/select/bluegene/plugin/bluegene.c +++ b/src/plugins/select/bluegene/plugin/bluegene.c @@ -235,7 +235,6 @@ extern void print_bg_record(bg_record_t* bg_record) bg_record->cpus_per_bp * bg_record->bp_count); info("\tgeo: %ux%ux%u", bg_record->geo[X], bg_record->geo[Y], bg_record->geo[Z]); - info("\tlifecycle: %s", convert_lifecycle(bg_record->block_lifecycle)); info("\tconn_type: %s", convert_conn_type(bg_record->conn_type)); info("\tnode_use: %s", convert_node_use(bg_record->node_use)); if (bg_record->bitmap) { @@ -468,7 +467,6 @@ extern void copy_bg_record(bg_record_t *fir_record, bg_record_t *sec_record) sec_record->ramdiskimage = xstrdup(fir_record->ramdiskimage); sec_record->user_uid = fir_record->user_uid; - sec_record->block_lifecycle = fir_record->block_lifecycle; sec_record->state = fir_record->state; sec_record->conn_type = fir_record->conn_type; sec_record->node_use = fir_record->node_use; @@ -838,14 +836,6 @@ extern int set_block_user(bg_record_t *bg_record) return rc; } -extern char* convert_lifecycle(lifecycle_type_t lifecycle) -{ - if (lifecycle == DYNAMIC) - return "DYNAMIC"; - else - return "STATIC"; -} - extern char* convert_conn_type(rm_connection_type_t conn_type) { switch (conn_type) { @@ -2254,6 +2244,23 @@ static int _validate_config_nodes(void) if(bg_record->nodecard != init_bg_record->nodecard) continue; /* wrong nodecard */ + if(bg_record->blrtsimage && + strcasecmp(bg_record->blrtsimage, + init_bg_record->blrtsimage)) + continue; + if(bg_record->linuximage && + strcasecmp(bg_record->linuximage, + init_bg_record->linuximage)) + continue; + if(bg_record->mloaderimage && + strcasecmp(bg_record->mloaderimage, + init_bg_record->mloaderimage)) + continue; + if(bg_record->ramdiskimage && + strcasecmp(bg_record->ramdiskimage, + init_bg_record->ramdiskimage)) + continue; + copy_bg_record(init_bg_record, bg_record); break; diff --git a/src/plugins/select/bluegene/plugin/bluegene.h b/src/plugins/select/bluegene/plugin/bluegene.h index 4286ff59d957940a1bcea8420c191557b4e7dce6..bece2c1a38a2f2f58f30379f726bbfbda2247a1d 100644 --- a/src/plugins/select/bluegene/plugin/bluegene.h +++ b/src/plugins/select/bluegene/plugin/bluegene.h @@ -56,17 +56,13 @@ #include "src/slurmctld/slurmctld.h" #include "../block_allocator/block_allocator.h" -typedef int lifecycle_type_t; - -enum block_lifecycle {DYNAMIC, STATIC}; - typedef enum bg_layout_type { LAYOUT_STATIC, /* no overlaps, except for full system block blocks never change */ LAYOUT_OVERLAP, /* overlaps permitted, must be defined in bluegene.conf file */ LAYOUT_DYNAMIC /* slurm will make all blocks */ -}bg_layout_t; +} bg_layout_t; typedef struct bg_record { pm_partition_id_t bg_block_id; /* ID returned from MMCS */ @@ -78,7 +74,6 @@ typedef struct bg_record { int full_block; /* whether or not block is the full block */ uid_t user_uid; /* Owner of block uid */ - lifecycle_type_t block_lifecycle;/* either STATIC or DYNAMIC */ rm_partition_state_t state; /* the allocated block */ int start[BA_SYSTEM_DIMENSIONS];/* start node */ uint16_t geo[BA_SYSTEM_DIMENSIONS]; /* geometry */ @@ -209,7 +204,6 @@ extern int remove_all_users(char *bg_block_id, char *user_name); extern int set_block_user(bg_record_t *bg_record); /* Return strings representing blue gene data types */ -extern char *convert_lifecycle(lifecycle_type_t lifecycle); extern char *convert_conn_type(rm_connection_type_t conn_type); extern char *convert_node_use(rm_partition_mode_t pt);