From 3a75b7333d071f8a51583904bc3defba77aa036a Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Fri, 14 Jun 2002 01:27:39 +0000
Subject: [PATCH] Added more of the code needed for job submit APIs. Fixed some
 code for zero size memory allocates, and zero size messages.

---
 src/common/slurm_protocol_pack.c              | 11 +++++--
 .../slurm_protocol_socket_implementation.c    |  3 +-
 src/common/xmalloc.c                          |  4 +--
 src/slurmctld/controller.c                    | 30 ++++++++++++++++++-
 src/slurmctld/job_mgr.c                       |  5 +---
 src/slurmctld/slurmctld.h                     |  6 ++++
 6 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/src/common/slurm_protocol_pack.c b/src/common/slurm_protocol_pack.c
index b387cda8f34..c25f317e506 100644
--- a/src/common/slurm_protocol_pack.c
+++ b/src/common/slurm_protocol_pack.c
@@ -429,11 +429,9 @@ int unpack_job_info_msg ( job_info_msg_t ** msg , void ** buf_ptr , int * buffer
 	if ( *msg == NULL )
 		return ENOMEM ;
 
-
 	/* load buffer's header (data structure version and time) */
 	unpack32 (&((*msg) -> record_count), buf_ptr, buffer_size);
 	unpack32 (&((*msg) -> last_update ) , buf_ptr, buffer_size);
-
 	job = (*msg) -> job_array = xmalloc ( sizeof ( job_table_t ) * (*msg)->record_count ) ;
 
 	/* load individual job info */
@@ -577,7 +575,14 @@ void pack_job_desc ( job_desc_msg_t * job_desc_ptr, void ** buf_ptr , int * buff
 	packstr (job_desc_ptr->groups, buf_ptr, buffer_size);
 	pack32 (job_desc_ptr->job_id, buf_ptr, buffer_size);
 	packstr (job_desc_ptr->name, buf_ptr, buffer_size);
-	packmem (job_desc_ptr->partition_key, 32, buf_ptr, buffer_size);
+	if (job_desc_ptr->partition_key)
+		packmem (job_desc_ptr->partition_key, 32, buf_ptr, buffer_size);
+	else {
+		char *no_key;
+		no_key = xmalloc (32);
+		packmem (no_key, 32, buf_ptr, buffer_size);
+		xfree (no_key);
+	}
 	
 	pack32 (job_desc_ptr->min_procs, buf_ptr, buffer_size);
 	pack32 (job_desc_ptr->min_memory, buf_ptr, buffer_size);
diff --git a/src/common/slurm_protocol_socket_implementation.c b/src/common/slurm_protocol_socket_implementation.c
index b87014d0849..e82785a9b25 100644
--- a/src/common/slurm_protocol_socket_implementation.c
+++ b/src/common/slurm_protocol_socket_implementation.c
@@ -68,7 +68,8 @@ ssize_t _slurm_msg_recvfrom ( slurm_fd open_fd, char *buffer , size_t size , uin
 */	
 	if ( ( recv_len = _slurm_recv ( open_fd , size_buffer_temp , sizeof ( uint32_t ) , SLURM_PROTOCOL_NO_SEND_RECV_FLAGS ) )  != sizeof ( uint32_t ) )
 	{
-		info ( "Error receiving length of datagram.  Total Bytes Sent %i \n", recv_len ) ;
+		info ( "Error receiving length of datagram.  Total bytes received %i \n", recv_len ) ;
+		return 0 ;
 	}
 	unpack32 ( & transmit_size , ( void ** ) & size_buffer , & size_buffer_len ) ;
 
diff --git a/src/common/xmalloc.c b/src/common/xmalloc.c
index e331e727752..6c35908f615 100644
--- a/src/common/xmalloc.c
+++ b/src/common/xmalloc.c
@@ -55,7 +55,7 @@ void *_xmalloc(size_t size, const char *file, int line, const char *func)
 	void *new;
 	int *p;
 
-	xmalloc_assert(size > 0 && size <= INT_MAX);
+	xmalloc_assert(size >= 0 && size <= INT_MAX);
 	MALLOC_LOCK();
 	p = (int *)malloc(size + 2*sizeof(int));
 	MALLOC_UNLOCK();
@@ -82,7 +82,7 @@ void *_try_xmalloc(size_t size, const char *file, int line, const char *func)
 	void *new;
 	int *p;
 
-	xmalloc_assert(size > 0 && size <= INT_MAX);
+	xmalloc_assert(size >= 0 && size <= INT_MAX);
 	MALLOC_LOCK();
 	p = (int *)malloc(size + 2*sizeof(int));
 	MALLOC_UNLOCK();
diff --git a/src/slurmctld/controller.c b/src/slurmctld/controller.c
index 1946aeb20b3..3abb3fe4d0a 100644
--- a/src/slurmctld/controller.c
+++ b/src/slurmctld/controller.c
@@ -53,7 +53,7 @@ inline static void slurm_rpc_dump_nodes ( slurm_msg_t * msg ) ;
 inline static void slurm_rpc_dump_partitions ( slurm_msg_t * msg ) ;
 inline static void slurm_rpc_dump_jobs ( slurm_msg_t * msg ) ;
 inline static void slurm_rpc_job_cancel ( slurm_msg_t * msg ) ;
-inline static void slurm_rpc_job_will_run ( slurm_msg_t * msg ) ;
+inline static void slurm_rpc_job_submit ( slurm_msg_t * msg ) ;
 inline static void slurm_rpc_reconfigure_controller ( slurm_msg_t * msg ) ;
 inline static void slurm_rpc_node_registration ( slurm_msg_t * msg ) ;
 
@@ -149,6 +149,8 @@ slurmctld_req ( slurm_msg_t * msg )
 			slurm_free_job_id_msg ( msg -> data ) ;
 			break;
 		case REQUEST_SUBMIT_BATCH_JOB: 
+/*			slurm_rpc_job_submit ( msg ) ;
+			slurm_free_??? ( msg -> data ) ; */
 			break;
 		case REQUEST_NODE_REGISRATION_STATUS:
 			break;
@@ -356,6 +358,32 @@ slurm_rpc_job_cancel ( slurm_msg_t * msg )
 
 }
 
+void
+slurm_rpc_job_submit ( slurm_msg_t * msg )
+{
+	clock_t start_time;
+	char *dump;
+	int dump_size;
+	slurm_msg_t response_msg ;
+	job_desc_msg_t * job_desc_ptr = ( job_desc_msg_t * ) msg-> data ;
+
+	start_time = clock ();
+
+		pack_all_part (&dump, &dump_size, &last_update);
+		/* init response_msg structure */
+		response_msg . address = msg -> address ;
+		response_msg . msg_type = RESPONSE_SUBMIT_BATCH_JOB ;
+/*
+		response_msg . data = dump ;
+		response_msg . data_size = dump_size ;
+
+		/* send message */
+		slurm_send_node_msg( msg -> conn_fd , &response_msg ) ;
+		info ("slurmctld_req: job_submit, size=%d, time=%ld", 
+		      dump_size, (long) (clock () - start_time));
+*/
+}
+
 /* UpdateNode - */
 /* Update - modify node or partition configuration */
 	void 
diff --git a/src/slurmctld/job_mgr.c b/src/slurmctld/job_mgr.c
index a1eda807ed8..b3af5264c95 100644
--- a/src/slurmctld/job_mgr.c
+++ b/src/slurmctld/job_mgr.c
@@ -39,8 +39,6 @@ static int max_hash_over = 0;
 void	list_delete_job (void *job_entry);
 int	list_find_job_id (void *job_entry, void *key);
 int	list_find_job_old (void *job_entry, void *key);
-void	set_job_id (struct job_record *job_ptr);
-void	set_job_prio (struct job_record *job_ptr);
 int	top_priority (struct job_record *job_ptr);
 int copy_job_desc_to_job_record ( job_desc_msg_t * job_desc , struct job_record ** job_ptr , struct part_record *part_ptr, bitstr_t *req_bitmap) ;
 int validate_job_desc ( job_desc_msg_t * job_desc_msg , int allocate ) ;
@@ -1157,8 +1155,7 @@ reset_job_bitmaps ()
 
 
 /*
- * set_job_id - set a default job_id: partition name, ".", sequence number
- *	insure that the job_id is unique
+ * set_job_id - set a default job_id, insure that it is unique
  * input: job_ptr - pointer to the job_record
  */
 	void
diff --git a/src/slurmctld/slurmctld.h b/src/slurmctld/slurmctld.h
index 1f943bb0f61..172364a26fe 100644
--- a/src/slurmctld/slurmctld.h
+++ b/src/slurmctld/slurmctld.h
@@ -742,6 +742,12 @@ void schedule();
  */
 extern int select_nodes (struct job_record *job_ptr, int test_only);
 
+/* set_job_id - set a default job_id, insure that it is unique */
+extern void	set_job_id (struct job_record *job_ptr);
+
+/* set_job_prio - set a default job priority */
+extern void	set_job_prio (struct job_record *job_ptr);
+
 /* 
  * slurm_parser - parse the supplied specification into keyword/value pairs
  *	only the keywords supplied will be searched for. the supplied specification
-- 
GitLab