From 3e6a656047bb4c92be22108e6e8a649d03d5111f Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Mon, 9 Dec 2002 21:29:44 +0000 Subject: [PATCH] Add immediate flag to job request RPC, remove the indepentent system call REQUEST_IMMEDIATE_RESOURCE_ALLOCATION. This immediate flag also applies to the slurm_allocate_and_run_job_step() function. --- src/api/allocate.c | 13 ++----- src/api/init_msg.c | 1 + src/api/slurm.h | 7 ++-- src/api/submit.c | 1 + src/common/slurm_protocol_defs.h | 2 -- src/common/slurm_protocol_pack.c | 6 ++-- src/slurmctld/controller.c | 61 +++++++++++++------------------- src/srun/srun.c | 9 +++-- 8 files changed, 41 insertions(+), 59 deletions(-) diff --git a/src/api/allocate.c b/src/api/allocate.c index f50a383db00..0c0ef4f4a63 100644 --- a/src/api/allocate.c +++ b/src/api/allocate.c @@ -38,15 +38,12 @@ * slurm_allocate_resources - allocate resources for a job request * IN job_desc_msg - description of resource allocation request * OUT slurm_alloc_msg - response to request - * IN immediate - if set then resource allocation must be satisfied - * immediately or fail * RET 0 on success or slurm error code * NOTE: free the allocated using slurm_free_resource_allocation_response_msg */ int slurm_allocate_resources (job_desc_msg_t * job_desc_msg , - resource_allocation_response_msg_t ** slurm_alloc_msg, - int immediate ) + resource_allocation_response_msg_t ** slurm_alloc_msg ) { int msg_size ; int rc ; @@ -63,10 +60,7 @@ slurm_allocate_resources (job_desc_msg_t * job_desc_msg , } /* send request message */ - if ( immediate ) - request_msg.msg_type = REQUEST_IMMEDIATE_RESOURCE_ALLOCATION ; - else - request_msg . msg_type = REQUEST_RESOURCE_ALLOCATION ; + request_msg . msg_type = REQUEST_RESOURCE_ALLOCATION ; request_msg . data = job_desc_msg ; if ( ( rc = slurm_send_controller_msg ( sockfd , & request_msg ) ) == SLURM_SOCKET_ERROR ) { @@ -104,7 +98,6 @@ slurm_allocate_resources (job_desc_msg_t * job_desc_msg , *slurm_alloc_msg = NULL; break ; case RESPONSE_RESOURCE_ALLOCATION: - case RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION: /* Calling method is responsible to free this memory */ *slurm_alloc_msg = ( resource_allocation_response_msg_t * ) @@ -146,6 +139,7 @@ int slurm_job_will_run (job_desc_msg_t * job_desc_msg , } /* send request message */ + /* job_desc_msg.immediate = true; implicit */ request_msg . msg_type = REQUEST_JOB_WILL_RUN ; request_msg . data = job_desc_msg ; if ( ( rc = slurm_send_controller_msg ( sockfd , & request_msg ) ) @@ -437,4 +431,3 @@ slurm_confirm_allocation (old_job_alloc_msg_t * job_desc_msg , return SLURM_PROTOCOL_SUCCESS ; } - diff --git a/src/api/init_msg.c b/src/api/init_msg.c index 6fd6a5f1ac3..4008e66efd9 100644 --- a/src/api/init_msg.c +++ b/src/api/init_msg.c @@ -45,6 +45,7 @@ void slurm_init_job_desc_msg(job_desc_msg_t * job_desc_msg) job_desc_msg->environment = ((char **) NULL); job_desc_msg->env_size = 0; job_desc_msg->features = NULL; + job_desc_msg->immediate = 0; job_desc_msg->job_id = NO_VAL; job_desc_msg->kill_on_node_fail = (uint16_t) NO_VAL; job_desc_msg->name = NULL; diff --git a/src/api/slurm.h b/src/api/slurm.h index 09f73c5602a..293b5949870 100644 --- a/src/api/slurm.h +++ b/src/api/slurm.h @@ -132,6 +132,8 @@ typedef struct job_descriptor { /* For submit, allocate, and update requests */ uint16_t env_size; /* element count in environment */ char *features; /* comma separated list of required features, * default NONE */ + uint16_t immediate; /* 1 if allocate to run or fail immediately, + * 0 if to be queued awaiting resources */ uint32_t job_id; /* job ID, default set by SLURM */ char *name; /* name of the job, default "" */ uint32_t min_procs; /* minimum processors per node, default=0 */ @@ -377,14 +379,11 @@ extern void slurm_init_job_desc_msg (job_desc_msg_t * job_desc_msg); * slurm_allocate_resources - allocate resources for a job request * IN job_desc_msg - description of resource allocation request * OUT slurm_alloc_msg - response to request - * IN immediate - if set then resource allocation must be satisfied - * immediately or fail * RET 0 on success or slurm error code * NOTE: free the allocated using slurm_free_resource_allocation_response_msg */ extern int slurm_allocate_resources (job_desc_msg_t * job_desc_msg , - resource_allocation_response_msg_t ** job_alloc_resp_msg, - int immediate ) ; + resource_allocation_response_msg_t ** job_alloc_resp_msg ) ; /* * slurm_free_resource_allocation_response_msg - free slurm resource diff --git a/src/api/submit.c b/src/api/submit.c index 9c8b98ccb50..875e0b757d3 100644 --- a/src/api/submit.c +++ b/src/api/submit.c @@ -61,6 +61,7 @@ slurm_submit_batch_job (job_desc_msg_t * job_desc_msg, } /* send request message */ + /* job_desc_msg.immediate = false; implicit */ request_msg . msg_type = REQUEST_SUBMIT_BATCH_JOB ; request_msg . data = job_desc_msg ; if ( ( rc = slurm_send_controller_msg ( sockfd , & request_msg ) ) diff --git a/src/common/slurm_protocol_defs.h b/src/common/slurm_protocol_defs.h index 1147d93a2fb..50d7a87c499 100644 --- a/src/common/slurm_protocol_defs.h +++ b/src/common/slurm_protocol_defs.h @@ -112,8 +112,6 @@ typedef enum { RESPONSE_JOB_RESOURCE, REQUEST_JOB_ATTACH, RESPONSE_JOB_ATTACH, - REQUEST_IMMEDIATE_RESOURCE_ALLOCATION, - RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION, REQUEST_JOB_WILL_RUN, RESPONSE_JOB_WILL_RUN, REQUEST_REVOKE_JOB_CREDENTIAL, diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c index 091844a398f..118d7049d6b 100644 --- a/src/common/slurm_protocol_pack.c +++ b/src/common/slurm_protocol_pack.c @@ -320,7 +320,6 @@ pack_msg(slurm_msg_t const *msg, Buf buffer) break; case REQUEST_RESOURCE_ALLOCATION: case REQUEST_SUBMIT_BATCH_JOB: - case REQUEST_IMMEDIATE_RESOURCE_ALLOCATION: case REQUEST_JOB_WILL_RUN: case REQUEST_ALLOCATION_AND_RUN_JOB_STEP: case REQUEST_UPDATE_JOB: @@ -346,7 +345,6 @@ pack_msg(slurm_msg_t const *msg, Buf buffer) msg->data, buffer); break; case RESPONSE_RESOURCE_ALLOCATION: - case RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION: case RESPONSE_JOB_WILL_RUN: _pack_resource_allocation_response_msg ((resource_allocation_response_msg_t *) msg->data, @@ -507,7 +505,6 @@ unpack_msg(slurm_msg_t * msg, Buf buffer) break; case REQUEST_RESOURCE_ALLOCATION: case REQUEST_SUBMIT_BATCH_JOB: - case REQUEST_IMMEDIATE_RESOURCE_ALLOCATION: case REQUEST_JOB_WILL_RUN: case REQUEST_ALLOCATION_AND_RUN_JOB_STEP: case REQUEST_UPDATE_JOB: @@ -534,7 +531,6 @@ unpack_msg(slurm_msg_t * msg, Buf buffer) & (msg->data), buffer); break; case RESPONSE_RESOURCE_ALLOCATION: - case RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION: case RESPONSE_JOB_WILL_RUN: rc = _unpack_resource_allocation_response_msg( (resource_allocation_response_msg_t **) @@ -1683,6 +1679,7 @@ _pack_job_desc_msg(job_desc_msg_t * job_desc_ptr, Buf buffer) packstr(job_desc_ptr->out, buffer); packstr(job_desc_ptr->work_dir, buffer); + pack16(job_desc_ptr->immediate, buffer); pack16(job_desc_ptr->shared, buffer); pack32(job_desc_ptr->time_limit, buffer); @@ -1733,6 +1730,7 @@ _unpack_job_desc_msg(job_desc_msg_t ** job_desc_buffer_ptr, Buf buffer) safe_unpackstr_xmalloc(&job_desc_ptr->out, &uint16_tmp, buffer); safe_unpackstr_xmalloc(&job_desc_ptr->work_dir, &uint16_tmp, buffer); + safe_unpack16(&job_desc_ptr->immediate, buffer); safe_unpack16(&job_desc_ptr->shared, buffer); safe_unpack32(&job_desc_ptr->time_limit, buffer); diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c index b3b1f1f520c..3246e657c34 100644 --- a/src/slurmctld/controller.c +++ b/src/slurmctld/controller.c @@ -114,8 +114,7 @@ static void _run_backup(void); inline static void _save_all_state(void); static void * _service_connection(void *arg); static int _shutdown_backup_controller(void); -inline static void _slurm_rpc_allocate_resources(slurm_msg_t * msg, - uint8_t immediate); +inline static void _slurm_rpc_allocate_resources(slurm_msg_t * msg); inline static void _slurm_rpc_allocate_and_run(slurm_msg_t * msg); inline static void _slurm_rpc_dump_build(slurm_msg_t * msg); inline static void _slurm_rpc_dump_nodes(slurm_msg_t * msg); @@ -692,11 +691,7 @@ static void _slurmctld_req (slurm_msg_t * msg) slurm_free_last_update_msg(msg->data); break; case REQUEST_RESOURCE_ALLOCATION: - _slurm_rpc_allocate_resources(msg, false); - slurm_free_job_desc_msg(msg->data); - break; - case REQUEST_IMMEDIATE_RESOURCE_ALLOCATION: - _slurm_rpc_allocate_resources(msg, true); + _slurm_rpc_allocate_resources(msg); slurm_free_job_desc_msg(msg->data); break; case REQUEST_ALLOCATION_AND_RUN_JOB_STEP: @@ -1366,7 +1361,7 @@ static void _slurm_rpc_submit_batch_job(slurm_msg_t * msg) /* _slurm_rpc_allocate_resources: process RPC to allocate resources for * a job */ -static void _slurm_rpc_allocate_resources(slurm_msg_t * msg, uint8_t immediate) +static void _slurm_rpc_allocate_resources(slurm_msg_t * msg) { /* init */ int error_code = 0; @@ -1387,11 +1382,7 @@ static void _slurm_rpc_allocate_resources(slurm_msg_t * msg, uint8_t immediate) slurm_addr *node_addr; start_time = clock(); - if (immediate) - debug - ("Processing RPC: REQUEST_IMMEDIATE_RESOURCE_ALLOCATION"); - else - debug("Processing RPC: REQUEST_RESOURCE_ALLOCATION"); + debug("Processing RPC: REQUEST_RESOURCE_ALLOCATION"); /* do RPC call */ dump_job_desc(job_desc_msg); @@ -1403,6 +1394,7 @@ static void _slurm_rpc_allocate_resources(slurm_msg_t * msg, uint8_t immediate) (unsigned int) uid); } if (error_code == 0) { + int immediate = job_desc_msg->immediate; lock_slurmctld(job_write_lock); error_code = job_allocate(job_desc_msg, &job_id, &node_list_ptr, &num_cpu_groups, @@ -1432,9 +1424,7 @@ static void _slurm_rpc_allocate_resources(slurm_msg_t * msg, uint8_t immediate) alloc_msg.cpu_count_reps = cpu_count_reps; alloc_msg.node_cnt = node_cnt; alloc_msg.node_addr = node_addr; - response_msg.msg_type = (immediate) ? - RESPONSE_IMMEDIATE_RESOURCE_ALLOCATION : - RESPONSE_RESOURCE_ALLOCATION; + response_msg.msg_type = RESPONSE_RESOURCE_ALLOCATION; response_msg.data = &alloc_msg; slurm_send_node_msg(msg->conn_fd, &response_msg); @@ -1481,11 +1471,12 @@ static void _slurm_rpc_allocate_and_run(slurm_msg_t * msg) } if (error_code == 0) { + int immediate = job_desc_msg->immediate; lock_slurmctld(job_write_lock); error_code = job_allocate(job_desc_msg, &job_id, &node_list_ptr, &num_cpu_groups, &cpus_per_node, &cpu_count_reps, - true, false, true, uid, + immediate, false, true, uid, &node_cnt, &node_addr); } @@ -1520,22 +1511,22 @@ static void _slurm_rpc_allocate_and_run(slurm_msg_t * msg) node_list_ptr, job_id, (long) (clock() - start_time)); /* send job_ID and node_name_ptr */ - alloc_msg.job_id = job_id; - alloc_msg.node_list = node_list_ptr; + alloc_msg.job_id = job_id; + alloc_msg.node_list = node_list_ptr; alloc_msg.num_cpu_groups = num_cpu_groups; - alloc_msg.cpus_per_node = cpus_per_node; + alloc_msg.cpus_per_node = cpus_per_node; alloc_msg.cpu_count_reps = cpu_count_reps; - alloc_msg.job_step_id = step_rec->step_id; - alloc_msg.node_cnt = node_cnt; - alloc_msg.node_addr = node_addr; - alloc_msg.credentials = - &step_rec->job_ptr->details->credential; + alloc_msg.job_step_id = step_rec->step_id; + alloc_msg.node_cnt = node_cnt; + alloc_msg.node_addr = node_addr; + alloc_msg.credentials = + &step_rec->job_ptr->details->credential; #ifdef HAVE_LIBELAN3 alloc_msg.qsw_job = step_rec->qsw_job; #endif unlock_slurmctld(job_write_lock); response_msg.msg_type = - RESPONSE_ALLOCATION_AND_RUN_JOB_STEP; + RESPONSE_ALLOCATION_AND_RUN_JOB_STEP; response_msg.data = &alloc_msg; slurm_send_node_msg(msg->conn_fd, &response_msg); @@ -1557,8 +1548,7 @@ static void _slurm_rpc_old_job_alloc(slurm_msg_t * msg) resource_allocation_response_msg_t alloc_msg; /* Locks: Read job, read node */ slurmctld_lock_t job_read_lock = { NO_LOCK, READ_LOCK, - READ_LOCK, NO_LOCK - }; + READ_LOCK, NO_LOCK }; uint16_t node_cnt; slurm_addr *node_addr; uid_t uid; @@ -1598,18 +1588,17 @@ static void _slurm_rpc_old_job_alloc(slurm_msg_t * msg) /* send job_ID and node_name_ptr */ - alloc_msg.job_id = job_desc_msg->job_id; - alloc_msg.node_list = node_list_ptr; + alloc_msg.job_id = job_desc_msg->job_id; + alloc_msg.node_list = node_list_ptr; alloc_msg.num_cpu_groups = num_cpu_groups; - alloc_msg.cpus_per_node = cpus_per_node; + alloc_msg.cpus_per_node = cpus_per_node; alloc_msg.cpu_count_reps = cpu_count_reps; - alloc_msg.node_cnt = node_cnt; - alloc_msg.node_addr = node_addr; - response_msg.msg_type = RESPONSE_RESOURCE_ALLOCATION; - response_msg.data = &alloc_msg; + alloc_msg.node_cnt = node_cnt; + alloc_msg.node_addr = node_addr; + response_msg.msg_type = RESPONSE_RESOURCE_ALLOCATION; + response_msg.data = &alloc_msg; slurm_send_node_msg(msg->conn_fd, &response_msg); - (void) dump_all_job_state(); } } diff --git a/src/srun/srun.c b/src/srun/srun.c index fdd28dfe9fd..95659ef7228 100644 --- a/src/srun/srun.c +++ b/src/srun/srun.c @@ -307,6 +307,7 @@ _allocate_nodes(void) job.contiguous = opt.contiguous; job.features = opt.constraints; + job.immediate = opt.immediate; job.name = opt.job_name; job.req_nodes = opt.nodelist; job.partition = opt.partition; @@ -333,7 +334,7 @@ _allocate_nodes(void) job.shared = 1; retries = 0; - while ((rc = slurm_allocate_resources(&job, &resp, opt.immediate)) + while ((rc = slurm_allocate_resources(&job, &resp)) == SLURM_FAILURE) { if ((slurm_get_errno() == ESLURM_ERROR_ON_DESC_TO_RECORD_COPY) && (retries < MAX_RETRIES)) { @@ -366,9 +367,10 @@ _allocate_nodes(void) /* Keep polling until the job is allocated resources */ while (slurm_confirm_allocation(&old_job, &resp) == SLURM_FAILURE) { - if (slurm_get_errno() == ESLURM_JOB_PENDING) + if (slurm_get_errno() == ESLURM_JOB_PENDING) { + debug3("Still waiting for allocation"); sleep (10); - else { + } else { error("Unable to confirm resource allocation for job %u: %s", old_job.job_id, slurm_strerror(errno)); exit (1); @@ -395,6 +397,7 @@ _alloc_nodes_step(void) job.contiguous = opt.contiguous; job.features = opt.constraints; + job.immediate = opt.immediate; job.name = opt.job_name; job.req_nodes = opt.nodelist; job.partition = opt.partition; -- GitLab