106106int orte_odls_base_default_get_add_procs_data (opal_buffer_t * buffer ,
107107 orte_jobid_t job )
108108{
109- int rc ;
109+ int rc , v ;
110110 orte_job_t * jdata = NULL , * jptr ;
111111 orte_job_map_t * map = NULL ;
112112 opal_buffer_t * wireup , jobdata ;
@@ -116,6 +116,9 @@ int orte_odls_base_default_get_add_procs_data(opal_buffer_t *buffer,
116116 void * nptr ;
117117 uint32_t key ;
118118 char * nidmap ;
119+ orte_proc_t * dmn ;
120+ opal_value_t * val = NULL , * kv ;
121+ opal_list_t * modex ;
119122
120123 /* get the job data pointer */
121124 if (NULL == (jdata = orte_get_job_data_object (job ))) {
@@ -156,36 +159,106 @@ int orte_odls_base_default_get_add_procs_data(opal_buffer_t *buffer,
156159 ORTE_ERROR_LOG (rc );
157160 return rc ;
158161 }
159- if (!orte_static_ports && !orte_fwd_mpirun_port ) {
160- /* pack a flag indicating wiring info is provided */
161- flag = 1 ;
162- opal_dss .pack (buffer , & flag , 1 , OPAL_INT8 );
163- /* get wireup info for daemons per the selected routing module */
164- wireup = OBJ_NEW (opal_buffer_t );
165- if (ORTE_SUCCESS != (rc = orte_rml_base_get_contact_info (ORTE_PROC_MY_NAME -> jobid , wireup ))) {
162+ /* get wireup info for daemons */
163+ if (NULL == (jptr = orte_get_job_data_object (ORTE_PROC_MY_NAME -> jobid ))) {
164+ ORTE_ERROR_LOG (ORTE_ERR_BAD_PARAM );
165+ return ORTE_ERR_BAD_PARAM ;
166+ }
167+ wireup = OBJ_NEW (opal_buffer_t );
168+ /* always include data for mpirun as the daemons can't have it yet */
169+ val = NULL ;
170+ if (OPAL_SUCCESS != (rc = opal_pmix .get (ORTE_PROC_MY_NAME , NULL , NULL , & val )) || NULL == val ) {
171+ ORTE_ERROR_LOG (rc );
172+ OBJ_RELEASE (wireup );
173+ return rc ;
174+ } else {
175+ /* the data is returned as a list of key-value pairs in the opal_value_t */
176+ if (OPAL_PTR != val -> type ) {
177+ ORTE_ERROR_LOG (ORTE_ERR_NOT_FOUND );
178+ OBJ_RELEASE (wireup );
179+ return ORTE_ERR_NOT_FOUND ;
180+ }
181+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , ORTE_PROC_MY_NAME , 1 , ORTE_NAME ))) {
166182 ORTE_ERROR_LOG (rc );
167183 OBJ_RELEASE (wireup );
168184 return rc ;
169185 }
170- /* put it in a byte object for xmission */
171- opal_dss .unload (wireup , (void * * )& bo .bytes , & numbytes );
172- /* pack the byte object - zero-byte objects are fine */
173- bo .size = numbytes ;
174- boptr = & bo ;
175- if (ORTE_SUCCESS != (rc = opal_dss .pack (buffer , & boptr , 1 , OPAL_BYTE_OBJECT ))) {
186+ modex = (opal_list_t * )val -> data .ptr ;
187+ numbytes = (int32_t )opal_list_get_size (modex );
188+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , & numbytes , 1 , OPAL_INT32 ))) {
176189 ORTE_ERROR_LOG (rc );
177190 OBJ_RELEASE (wireup );
178191 return rc ;
179192 }
180- /* release the data since it has now been copied into our buffer */
181- if (NULL != bo .bytes ) {
182- free (bo .bytes );
193+ OPAL_LIST_FOREACH (kv , modex , opal_value_t ) {
194+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , & kv , 1 , OPAL_VALUE ))) {
195+ ORTE_ERROR_LOG (rc );
196+ OBJ_RELEASE (wireup );
197+ return rc ;
198+ }
183199 }
184- OBJ_RELEASE (wireup );
185- } else {
186- /* pack a flag indicating no wireup data is provided */
187- flag = 0 ;
188- opal_dss .pack (buffer , & flag , 1 , OPAL_INT8 );
200+ OPAL_LIST_RELEASE (modex );
201+ OBJ_RELEASE (val );
202+ }
203+ /* if we didn't rollup the connection info, then we have
204+ * to provide a complete map of connection info */
205+ if (!orte_static_ports && !orte_fwd_mpirun_port ) {
206+ for (v = 1 ; v < jptr -> procs -> size ; v ++ ) {
207+ if (NULL == (dmn = (orte_proc_t * )opal_pointer_array_get_item (jptr -> procs , v ))) {
208+ continue ;
209+ }
210+ val = NULL ;
211+ if (OPAL_SUCCESS != (rc = opal_pmix .get (& dmn -> name , NULL , NULL , & val )) || NULL == val ) {
212+ ORTE_ERROR_LOG (rc );
213+ OBJ_RELEASE (buffer );
214+ return rc ;
215+ } else {
216+ /* the data is returned as a list of key-value pairs in the opal_value_t */
217+ if (OPAL_PTR != val -> type ) {
218+ ORTE_ERROR_LOG (ORTE_ERR_NOT_FOUND );
219+ OBJ_RELEASE (buffer );
220+ return ORTE_ERR_NOT_FOUND ;
221+ }
222+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , & dmn -> name , 1 , ORTE_NAME ))) {
223+ ORTE_ERROR_LOG (rc );
224+ OBJ_RELEASE (buffer );
225+ OBJ_RELEASE (wireup );
226+ return rc ;
227+ }
228+ modex = (opal_list_t * )val -> data .ptr ;
229+ numbytes = (int32_t )opal_list_get_size (modex );
230+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , & numbytes , 1 , OPAL_INT32 ))) {
231+ ORTE_ERROR_LOG (rc );
232+ OBJ_RELEASE (buffer );
233+ OBJ_RELEASE (wireup );
234+ return rc ;
235+ }
236+ OPAL_LIST_FOREACH (kv , modex , opal_value_t ) {
237+ if (ORTE_SUCCESS != (rc = opal_dss .pack (wireup , & kv , 1 , OPAL_VALUE ))) {
238+ ORTE_ERROR_LOG (rc );
239+ OBJ_RELEASE (buffer );
240+ OBJ_RELEASE (wireup );
241+ return rc ;
242+ }
243+ }
244+ OPAL_LIST_RELEASE (modex );
245+ OBJ_RELEASE (val );
246+ }
247+ }
248+ }
249+ /* put it in a byte object for xmission */
250+ opal_dss .unload (wireup , (void * * )& bo .bytes , & numbytes );
251+ OBJ_RELEASE (wireup );
252+ /* pack the byte object - zero-byte objects are fine */
253+ bo .size = numbytes ;
254+ boptr = & bo ;
255+ if (ORTE_SUCCESS != (rc = opal_dss .pack (buffer , & boptr , 1 , OPAL_BYTE_OBJECT ))) {
256+ ORTE_ERROR_LOG (rc );
257+ return rc ;
258+ }
259+ /* release the data since it has now been copied into our buffer */
260+ if (NULL != bo .bytes ) {
261+ free (bo .bytes );
189262 }
190263
191264 /* we need to ensure that any new daemons get a complete
0 commit comments