From 1c48e2ddc95c76bdffb50c36b9c945b4bce8cf26 Mon Sep 17 00:00:00 2001
From: Moe Jette <jette1@llnl.gov>
Date: Sat, 26 Mar 2011 02:55:47 +0000
Subject: [PATCH]  Patch #20: Implements the job_signal() function pointer for
 select/cray, building on top             of patches #17 and #18.

---
 src/plugins/select/cray/basil_alps.h      |  2 ++
 src/plugins/select/cray/basil_interface.c | 23 +++++++++++++++++++++++
 src/plugins/select/cray/basil_interface.h |  6 ++++++
 src/plugins/select/cray/select_cray.c     |  2 ++
 4 files changed, 33 insertions(+)

diff --git a/src/plugins/select/cray/basil_alps.h b/src/plugins/select/cray/basil_alps.h
index af6f100464f..a993d3d976b 100644
--- a/src/plugins/select/cray/basil_alps.h
+++ b/src/plugins/select/cray/basil_alps.h
@@ -546,6 +546,8 @@ extern const struct basil_rsvn *basil_rsvn_by_id(const struct basil_inventory *i
 extern uint64_t *basil_get_rsvn_aprun_apids(const struct basil_inventory *inv,
 					    uint32_t rsvn_id);
 extern int basil_release(uint32_t rsvn_id);
+extern int basil_signal_apids(int32_t rsvn_id, int signal,
+			      struct basil_inventory *inv);
 extern int basil_safe_release(int32_t rsvn_id, struct basil_inventory *inv);
 
 #endif /* __BASIL_ALPS_H__ */
diff --git a/src/plugins/select/cray/basil_interface.c b/src/plugins/select/cray/basil_interface.c
index bb94b25c681..e6be0b5cd2c 100644
--- a/src/plugins/select/cray/basil_interface.c
+++ b/src/plugins/select/cray/basil_interface.c
@@ -725,6 +725,29 @@ extern int do_basil_confirm(struct job_record *job_ptr)
 	return READY_JOB_FATAL;
 }
 
+/**
+ * do_basil_signal  -  pass job signal on to any APIDs
+ * IN job_ptr - job to be signalled
+ * IN signal  - signal(7) number
+ * Only signal job if an ALPS reservation exists (non-0 reservation ID).
+ */
+extern int do_basil_signal(struct job_record *job_ptr, int signal)
+{
+	uint32_t resv_id;
+
+	if (_get_select_jobinfo(job_ptr->select_jobinfo->data,
+			SELECT_JOBDATA_RESV_ID, &resv_id) != SLURM_SUCCESS) {
+		error("can not read resId for JobId=%u", job_ptr->job_id);
+	} else if (resv_id != 0) {
+		int rc = basil_signal_apids(resv_id, signal, NULL);
+
+		if (rc)
+			error("could not signal APIDS of resId %u: %s", resv_id,
+				basil_strerror(rc));
+	}
+	return SLURM_SUCCESS;
+}
+
 /**
  * do_basil_release - release an (unconfirmed) BASIL reservation
  * IN job_ptr - pointer to job which has just been deallocated resources
diff --git a/src/plugins/select/cray/basil_interface.h b/src/plugins/select/cray/basil_interface.h
index ec59c981317..e28b6c4d8f5 100644
--- a/src/plugins/select/cray/basil_interface.h
+++ b/src/plugins/select/cray/basil_interface.h
@@ -41,6 +41,7 @@ extern int basil_inventory(void);
 extern int basil_geometry(struct node_record *node_ptr_array, int node_cnt);
 extern int do_basil_reserve(struct job_record *job_ptr);
 extern int do_basil_confirm(struct job_record *job_ptr);
+extern int do_basil_signal(struct job_record *job_ptr, int signal);
 extern int do_basil_release(struct job_record *job_ptr);
 #else	/* !HAVE_CRAY */
 static inline int basil_node_ranking(struct node_record *ig, int nore)
@@ -67,6 +68,11 @@ static inline int do_basil_confirm(struct job_record *job_ptr)
 	return SLURM_SUCCESS;
 }
 
+static inline int do_basil_signal(struct job_record *job_ptr, int signal)
+{
+	return SLURM_SUCCESS;
+}
+
 static inline int do_basil_release(struct job_record *job_ptr)
 {
 	return SLURM_SUCCESS;
diff --git a/src/plugins/select/cray/select_cray.c b/src/plugins/select/cray/select_cray.c
index d3e4301f6e6..29af7fb6183 100644
--- a/src/plugins/select/cray/select_cray.c
+++ b/src/plugins/select/cray/select_cray.c
@@ -281,6 +281,8 @@ extern int select_p_job_expand(struct job_record *from_job_ptr,
 
 extern int select_p_job_signal(struct job_record *job_ptr, int signal)
 {
+	if (do_basil_signal(job_ptr, signal) != SLURM_SUCCESS)
+		return SLURM_ERROR;
 	return other_job_signal(job_ptr, signal);
 }
 
-- 
GitLab