@@ -485,9 +485,11 @@ static void _query(int sd, short args, void *cbdata)
485485 orte_pmix_server_op_caddy_t * cd = (orte_pmix_server_op_caddy_t * )cbdata ;
486486 opal_pmix_query_t * q ;
487487 opal_value_t * kv ;
488+ orte_jobid_t jobid ;
488489 orte_job_t * jdata ;
489490 orte_proc_t * proct ;
490- int rc , i , num_replies ;
491+ orte_app_context_t * app ;
492+ int rc = ORTE_SUCCESS , i , k , num_replies ;
491493 opal_list_t * results , targets , * array ;
492494 size_t n ;
493495 uint32_t key ;
@@ -703,16 +705,117 @@ static void _query(int sd, short args, void *cbdata)
703705 kv -> type = OPAL_STRING ;
704706 kv -> data .string = strdup (orte_process_info .my_hnp_uri );
705707 opal_list_append (results , & kv -> super );
708+ } else if (0 == strcmp (q -> keys [n ], OPAL_PMIX_QUERY_PROC_TABLE )) {
709+ /* the job they are asking about is in the qualifiers */
710+ jobid = ORTE_JOBID_INVALID ;
711+ OPAL_LIST_FOREACH (kv , & q -> qualifiers , opal_value_t ) {
712+ if (0 == strcmp (kv -> key , OPAL_PMIX_PROCID )) {
713+ /* save the id */
714+ jobid = kv -> data .name .jobid ;
715+ break ;
716+ }
717+ }
718+ if (ORTE_JOBID_INVALID == jobid ) {
719+ rc = ORTE_ERR_NOT_FOUND ;
720+ goto done ;
721+ }
722+ /* construct a list of values with opal_proc_info_t
723+ * entries for each proc in the indicated job */
724+ jdata = orte_get_job_data_object (jobid );
725+ if (NULL == jdata ) {
726+ rc = ORTE_ERR_NOT_FOUND ;
727+ goto done ;
728+ }
729+ /* setup the reply */
730+ kv = OBJ_NEW (opal_value_t );
731+ kv -> key = strdup (OPAL_PMIX_QUERY_PROC_TABLE );
732+ kv -> type = OPAL_PTR ;
733+ array = OBJ_NEW (opal_list_t );
734+ kv -> data .ptr = array ;
735+ opal_list_append (results , & kv -> super );
736+ /* cycle thru the job and create an entry for each proc */
737+ for (k = 0 ; k < jdata -> procs -> size ; k ++ ) {
738+ if (NULL == (proct = (orte_proc_t * )opal_pointer_array_get_item (jdata -> procs , k ))) {
739+ continue ;
740+ }
741+ kv = OBJ_NEW (opal_value_t );
742+ kv -> type = OPAL_PROC_INFO ;
743+ kv -> data .pinfo .name .jobid = jobid ;
744+ kv -> data .pinfo .name .vpid = proct -> name .vpid ;
745+ if (NULL != proct -> node && NULL != proct -> node -> name ) {
746+ kv -> data .pinfo .hostname = strdup (proct -> node -> name );
747+ }
748+ app = (orte_app_context_t * )opal_pointer_array_get_item (jdata -> apps , proct -> app_idx );
749+ if (NULL != app && NULL != app -> app ) {
750+ kv -> data .pinfo .executable_name = strdup (app -> app );
751+ }
752+ kv -> data .pinfo .pid = proct -> pid ;
753+ kv -> data .pinfo .exit_code = proct -> exit_code ;
754+ kv -> data .pinfo .state = proct -> state ;
755+ opal_list_append (array , & kv -> super );
756+ }
757+ } else if (0 == strcmp (q -> keys [n ], OPAL_PMIX_QUERY_LOCAL_PROC_TABLE )) {
758+ /* the job they are asking about is in the qualifiers */
759+ jobid = ORTE_JOBID_INVALID ;
760+ OPAL_LIST_FOREACH (kv , & q -> qualifiers , opal_value_t ) {
761+ if (0 == strcmp (kv -> key , OPAL_PMIX_PROCID )) {
762+ /* save the id */
763+ jobid = kv -> data .name .jobid ;
764+ break ;
765+ }
766+ }
767+ if (ORTE_JOBID_INVALID == jobid ) {
768+ rc = ORTE_ERR_BAD_PARAM ;
769+ goto done ;
770+ }
771+ /* construct a list of values with opal_proc_info_t
772+ * entries for each LOCAL proc in the indicated job */
773+ jdata = orte_get_job_data_object (jobid );
774+ if (NULL == jdata ) {
775+ rc = ORTE_ERR_NOT_FOUND ;
776+ goto done ;
777+ }
778+ /* setup the reply */
779+ kv = OBJ_NEW (opal_value_t );
780+ kv -> key = strdup (OPAL_PMIX_QUERY_LOCAL_PROC_TABLE );
781+ kv -> type = OPAL_PTR ;
782+ array = OBJ_NEW (opal_list_t );
783+ kv -> data .ptr = array ;
784+ opal_list_append (results , & kv -> super );
785+ /* cycle thru the job and create an entry for each proc */
786+ for (k = 0 ; k < jdata -> procs -> size ; k ++ ) {
787+ if (NULL == (proct = (orte_proc_t * )opal_pointer_array_get_item (jdata -> procs , k ))) {
788+ continue ;
789+ }
790+ if (ORTE_FLAG_TEST (proct , ORTE_PROC_FLAG_LOCAL )) {
791+ kv = OBJ_NEW (opal_value_t );
792+ kv -> type = OPAL_PROC_INFO ;
793+ kv -> data .pinfo .name .jobid = jobid ;
794+ kv -> data .pinfo .name .vpid = proct -> name .vpid ;
795+ if (NULL != proct -> node && NULL != proct -> node -> name ) {
796+ kv -> data .pinfo .hostname = strdup (proct -> node -> name );
797+ }
798+ app = (orte_app_context_t * )opal_pointer_array_get_item (jdata -> apps , proct -> app_idx );
799+ if (NULL != app && NULL != app -> app ) {
800+ kv -> data .pinfo .executable_name = strdup (app -> app );
801+ }
802+ kv -> data .pinfo .pid = proct -> pid ;
803+ kv -> data .pinfo .exit_code = proct -> exit_code ;
804+ kv -> data .pinfo .state = proct -> state ;
805+ opal_list_append (array , & kv -> super );
806+ }
807+ }
706808 }
707809 }
708810 }
709811
710- if (0 == opal_list_get_size (results )) {
711- rc = ORTE_ERR_NOT_FOUND ;
712- } else if (opal_list_get_size (results ) < opal_list_get_size (cd -> info )) {
713- rc = ORTE_ERR_PARTIAL_SUCCESS ;
714- } else {
715- rc = ORTE_SUCCESS ;
812+ done :
813+ if (ORTE_SUCCESS == rc ) {
814+ if (0 == opal_list_get_size (results )) {
815+ rc = ORTE_ERR_NOT_FOUND ;
816+ } else if (opal_list_get_size (results ) < opal_list_get_size (cd -> info )) {
817+ rc = ORTE_ERR_PARTIAL_SUCCESS ;
818+ }
716819 }
717820 cd -> infocbfunc (rc , results , cd -> cbdata , qrel , results );
718821}
0 commit comments