This source file includes following definitions.
- isolated_init
- isolated_fini
- isolated_initialized
- isolated_abort
- isolated_spawn
- isolated_spawn_nb
- isolated_job_connect
- isolated_job_disconnect
- isolated_job_disconnect_nb
- isolated_resolve_peers
- isolated_resolve_nodes
- isolated_put
- isolated_commit
- isolated_fence
- isolated_fence_nb
- isolated_get
- isolated_get_nb
- isolated_publish
- isolated_publish_nb
- isolated_lookup
- isolated_lookup_nb
- isolated_unpublish
- isolated_unpublish_nb
- isolated_get_version
- isolated_store_local
- isolated_get_nspace
- isolated_register_jobid
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include "opal_config.h"
15 #include "opal/constants.h"
16 #include "opal/types.h"
17
18 #ifdef HAVE_STRING_H
19 #include <string.h>
20 #endif
21 #ifdef HAVE_UNISTD_H
22 #include <unistd.h>
23 #endif
24
25 #include "opal/dss/dss.h"
26 #include "opal/mca/event/event.h"
27 #include "opal/mca/hwloc/base/base.h"
28 #include "opal/runtime/opal.h"
29 #include "opal/runtime/opal_progress_threads.h"
30 #include "opal/util/argv.h"
31 #include "opal/util/error.h"
32 #include "opal/util/output.h"
33 #include "opal/util/proc.h"
34 #include "opal/util/show_help.h"
35
36 #include "pmix_isolated.h"
37 #include "opal/mca/pmix/base/base.h"
38 #include "opal/mca/pmix/base/pmix_base_hash.h"
39
40
41 static int isolated_init(opal_list_t *ilist);
42 static int isolated_fini(void);
43 static int isolated_initialized(void);
44 static int isolated_abort(int flat, const char *msg,
45 opal_list_t *procs);
46 static int isolated_spawn(opal_list_t *jobinfo, opal_list_t *apps, opal_jobid_t *jobid);
47 static int isolated_spawn_nb(opal_list_t *jobinfo, opal_list_t *apps,
48 opal_pmix_spawn_cbfunc_t cbfunc,
49 void *cbdata);
50 static int isolated_job_connect(opal_list_t *procs);
51 static int isolated_job_disconnect(opal_list_t *procs);
52 static int isolated_job_disconnect_nb(opal_list_t *procs,
53 opal_pmix_op_cbfunc_t cbfunc,
54 void *cbdata);
55 static int isolated_resolve_peers(const char *nodename,
56 opal_jobid_t jobid,
57 opal_list_t *procs);
58 static int isolated_resolve_nodes(opal_jobid_t jobid, char **nodelist);
59 static int isolated_put(opal_pmix_scope_t scope, opal_value_t *kv);
60 static int isolated_fence(opal_list_t *procs, int collect_data);
61 static int isolated_fence_nb(opal_list_t *procs, int collect_data,
62 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
63 static int isolated_commit(void);
64 static int isolated_get(const opal_process_name_t *id,
65 const char *key, opal_list_t *info,
66 opal_value_t **kv);
67 static int isolated_get_nb(const opal_process_name_t *id, const char *key,
68 opal_list_t *info,
69 opal_pmix_value_cbfunc_t cbfunc, void *cbdata);
70 static int isolated_publish(opal_list_t *info);
71 static int isolated_publish_nb(opal_list_t *info,
72 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
73 static int isolated_lookup(opal_list_t *data, opal_list_t *info);
74 static int isolated_lookup_nb(char **keys, opal_list_t *info,
75 opal_pmix_lookup_cbfunc_t cbfunc, void *cbdata);
76 static int isolated_unpublish(char **keys, opal_list_t *info);
77 static int isolated_unpublish_nb(char **keys, opal_list_t *info,
78 opal_pmix_op_cbfunc_t cbfunc, void *cbdata);
79 static const char *isolated_get_version(void);
80 static int isolated_store_local(const opal_process_name_t *proc,
81 opal_value_t *val);
82 static const char *isolated_get_nspace(opal_jobid_t jobid);
83 static void isolated_register_jobid(opal_jobid_t jobid, const char *nspace);
84
85 const opal_pmix_base_module_t opal_pmix_isolated_module = {
86 .init = isolated_init,
87 .finalize = isolated_fini,
88 .initialized = isolated_initialized,
89 .abort = isolated_abort,
90 .commit = isolated_commit,
91 .fence = isolated_fence,
92 .fence_nb = isolated_fence_nb,
93 .put = isolated_put,
94 .get = isolated_get,
95 .get_nb = isolated_get_nb,
96 .publish = isolated_publish,
97 .publish_nb = isolated_publish_nb,
98 .lookup = isolated_lookup,
99 .lookup_nb = isolated_lookup_nb,
100 .unpublish = isolated_unpublish,
101 .unpublish_nb = isolated_unpublish_nb,
102 .spawn = isolated_spawn,
103 .spawn_nb = isolated_spawn_nb,
104 .connect = isolated_job_connect,
105 .disconnect = isolated_job_disconnect,
106 .disconnect_nb = isolated_job_disconnect_nb,
107 .resolve_peers = isolated_resolve_peers,
108 .resolve_nodes = isolated_resolve_nodes,
109 .get_version = isolated_get_version,
110 .register_evhandler = opal_pmix_base_register_handler,
111 .deregister_evhandler = opal_pmix_base_deregister_handler,
112 .notify_event = opal_pmix_base_notify_event,
113 .store_local = isolated_store_local,
114 .get_nspace = isolated_get_nspace,
115 .register_jobid = isolated_register_jobid
116 };
117
118 static int isolated_init_count = 0;
119 static opal_process_name_t isolated_pname;
120
121 static int isolated_init(opal_list_t *ilist)
122 {
123 int rc;
124 opal_value_t kv;
125 opal_process_name_t wildcard;
126
127 OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock);
128 ++isolated_init_count;
129 if (1 < isolated_init_count) {
130 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
131 return OPAL_SUCCESS;
132 }
133
134
135 wildcard.jobid = 1;
136 wildcard.vpid = OPAL_VPID_WILDCARD;
137
138
139
140
141
142 isolated_pname.jobid = 1;
143 isolated_pname.vpid = 0;
144 opal_proc_set_name(&isolated_pname);
145 opal_output_verbose(10, opal_pmix_base_framework.framework_output,
146 "%s pmix:isolated: assigned tmp name %d %d",
147 OPAL_NAME_PRINT(isolated_pname),isolated_pname.jobid,isolated_pname.vpid);
148
149
150 opal_pmix_base_hash_init();
151
152
153 OBJ_CONSTRUCT(&kv, opal_value_t);
154 kv.key = strdup(OPAL_PMIX_JOB_SIZE);
155 kv.type = OPAL_UINT32;
156 kv.data.uint32 = 1;
157 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
158 OPAL_ERROR_LOG(rc);
159 OBJ_DESTRUCT(&kv);
160 goto err_exit;
161 }
162 OBJ_DESTRUCT(&kv);
163
164
165 OBJ_CONSTRUCT(&kv, opal_value_t);
166 kv.key = strdup(OPAL_PMIX_APPNUM);
167 kv.type = OPAL_UINT32;
168 kv.data.uint32 = 0;
169 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
170 OPAL_ERROR_LOG(rc);
171 OBJ_DESTRUCT(&kv);
172 goto err_exit;
173 }
174 OBJ_DESTRUCT(&kv);
175
176 OBJ_CONSTRUCT(&kv, opal_value_t);
177 kv.key = strdup(OPAL_PMIX_UNIV_SIZE);
178 kv.type = OPAL_UINT32;
179 kv.data.uint32 = 1;
180 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
181 OPAL_ERROR_LOG(rc);
182 OBJ_DESTRUCT(&kv);
183 goto err_exit;
184 }
185 OBJ_DESTRUCT(&kv);
186
187 OBJ_CONSTRUCT(&kv, opal_value_t);
188 kv.key = strdup(OPAL_PMIX_MAX_PROCS);
189 kv.type = OPAL_UINT32;
190 kv.data.uint32 = 1;
191 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&wildcard, &kv))) {
192 OPAL_ERROR_LOG(rc);
193 OBJ_DESTRUCT(&kv);
194 goto err_exit;
195 }
196 OBJ_DESTRUCT(&kv);
197
198 OBJ_CONSTRUCT(&kv, opal_value_t);
199 kv.key = strdup(OPAL_PMIX_JOBID);
200 kv.type = OPAL_UINT32;
201 kv.data.uint32 = 1;
202 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
203 OPAL_ERROR_LOG(rc);
204 OBJ_DESTRUCT(&kv);
205 goto err_exit;
206 }
207 OBJ_DESTRUCT(&kv);
208
209
210 OBJ_CONSTRUCT(&kv, opal_value_t);
211 kv.key = strdup(OPAL_PMIX_LOCAL_SIZE);
212 kv.type = OPAL_UINT32;
213 kv.data.uint32 = 1;
214 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
215 OPAL_ERROR_LOG(rc);
216 OBJ_DESTRUCT(&kv);
217 goto err_exit;
218 }
219 OBJ_DESTRUCT(&kv);
220
221 OBJ_CONSTRUCT(&kv, opal_value_t);
222 kv.key = strdup(OPAL_PMIX_LOCAL_PEERS);
223 kv.type = OPAL_STRING;
224 kv.data.string = strdup("0");
225 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
226 OPAL_ERROR_LOG(rc);
227 OBJ_DESTRUCT(&kv);
228 goto err_exit;
229 }
230 OBJ_DESTRUCT(&kv);
231
232
233 OBJ_CONSTRUCT(&kv, opal_value_t);
234 kv.key = strdup(OPAL_PMIX_LOCALLDR);
235 kv.type = OPAL_UINT64;
236 kv.data.uint64 = 0;
237 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
238 OPAL_ERROR_LOG(rc);
239 OBJ_DESTRUCT(&kv);
240 goto err_exit;
241 }
242
243
244 OBJ_CONSTRUCT(&kv, opal_value_t);
245 kv.key = strdup(OPAL_PMIX_LOCAL_RANK);
246 kv.type = OPAL_UINT16;
247 kv.data.uint16 = 0;
248 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
249 OPAL_ERROR_LOG(rc);
250 OBJ_DESTRUCT(&kv);
251 goto err_exit;
252 }
253
254
255 OBJ_CONSTRUCT(&kv, opal_value_t);
256 kv.key = strdup(OPAL_PMIX_NODE_RANK);
257 kv.type = OPAL_UINT16;
258 kv.data.uint16 = 0;
259 if (OPAL_SUCCESS != (rc = opal_pmix_base_store(&OPAL_PROC_MY_NAME, &kv))) {
260 OPAL_ERROR_LOG(rc);
261 OBJ_DESTRUCT(&kv);
262 goto err_exit;
263 }
264 OBJ_DESTRUCT(&kv);
265
266 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
267 return OPAL_SUCCESS;
268
269 err_exit:
270 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
271 return rc;
272 }
273
274 static int isolated_fini(void)
275 {
276 OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock);
277 --opal_pmix_base.initialized;
278
279 if (0 == isolated_init_count) {
280 opal_pmix_base_hash_finalize();
281 }
282
283 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
284 return OPAL_SUCCESS;
285 }
286
287 static int isolated_initialized(void)
288 {
289 OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock);
290 if (0 < isolated_init_count) {
291 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
292 return 1;
293 }
294 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
295 return 0;
296 }
297
298 static int isolated_abort(int flag, const char *msg,
299 opal_list_t *procs)
300 {
301 return OPAL_SUCCESS;
302 }
303
304 static int isolated_spawn(opal_list_t *jobinfo, opal_list_t *apps, opal_jobid_t *jobid)
305 {
306 return OPAL_ERR_NOT_SUPPORTED;
307 }
308
309 static int isolated_spawn_nb(opal_list_t *jobinfo, opal_list_t *apps,
310 opal_pmix_spawn_cbfunc_t cbfunc,
311 void *cbdata)
312 {
313 return OPAL_ERR_NOT_SUPPORTED;
314 }
315
316 static int isolated_job_connect(opal_list_t *procs)
317 {
318 return OPAL_ERR_NOT_SUPPORTED;
319 }
320
321 static int isolated_job_disconnect(opal_list_t *procs)
322 {
323 return OPAL_ERR_NOT_SUPPORTED;
324 }
325
326 static int isolated_job_disconnect_nb(opal_list_t *procs,
327 opal_pmix_op_cbfunc_t cbfunc,
328 void *cbdata)
329 {
330 return OPAL_ERR_NOT_SUPPORTED;
331 }
332
333 static int isolated_resolve_peers(const char *nodename,
334 opal_jobid_t jobid,
335 opal_list_t *procs)
336 {
337 return OPAL_ERR_NOT_IMPLEMENTED;
338 }
339
340 static int isolated_resolve_nodes(opal_jobid_t jobid, char **nodelist)
341 {
342 return OPAL_ERR_NOT_IMPLEMENTED;
343 }
344
345 static int isolated_put(opal_pmix_scope_t scope,
346 opal_value_t *kv)
347 {
348 int rc;
349
350 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
351 "%s pmix:isolated isolated_put key %s scope %d",
352 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), kv->key, scope);
353
354 OPAL_PMIX_ACQUIRE_THREAD(&opal_pmix_base.lock);
355 if (0 == isolated_init_count) {
356 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
357 return OPAL_ERROR;
358 }
359 OPAL_PMIX_RELEASE_THREAD(&opal_pmix_base.lock);
360
361 rc = opal_pmix_base_store(&isolated_pname, kv);
362
363 return rc;
364 }
365
366 static int isolated_commit(void)
367 {
368 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
369 "%s pmix:isolated isolated commit",
370 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
371
372 return OPAL_SUCCESS;
373 }
374
375 static int isolated_fence(opal_list_t *procs, int collect_data)
376 {
377 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
378 "%s pmix:isolated isolated fence",
379 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
380 return OPAL_SUCCESS;
381 }
382
383 static int isolated_fence_nb(opal_list_t *procs, int collect_data,
384 opal_pmix_op_cbfunc_t cbfunc, void *cbdata)
385 {
386 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
387 "%s pmix:isolated isolated fence_nb",
388 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
389 if (NULL != cbfunc) {
390 cbfunc(OPAL_SUCCESS, cbdata);
391 }
392 return OPAL_SUCCESS;
393 }
394
395 static int isolated_get(const opal_process_name_t *id,
396 const char *key, opal_list_t *info,
397 opal_value_t **kv)
398 {
399 int rc;
400 opal_list_t vals;
401
402 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
403 "%s pmix:isolated getting value for proc %s key %s",
404 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME),
405 OPAL_NAME_PRINT(*id), key);
406
407 OBJ_CONSTRUCT(&vals, opal_list_t);
408 rc = opal_pmix_base_fetch(id, key, &vals);
409 if (OPAL_SUCCESS == rc) {
410 *kv = (opal_value_t*)opal_list_remove_first(&vals);
411 return OPAL_SUCCESS;
412 } else {
413 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
414 "%s pmix:isolated fetch from dstore failed: %d",
415 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME), rc);
416 }
417 OPAL_LIST_DESTRUCT(&vals);
418
419 return rc;
420 }
421 static int isolated_get_nb(const opal_process_name_t *id, const char *key,
422 opal_list_t *info, opal_pmix_value_cbfunc_t cbfunc, void *cbdata)
423 {
424 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
425 "%s pmix:isolated isolated get_nb",
426 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
427 return OPAL_ERR_NOT_IMPLEMENTED;
428 }
429
430 static int isolated_publish(opal_list_t *info)
431 {
432 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
433 "%s pmix:isolated isolated publish",
434 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
435 return OPAL_ERR_NOT_SUPPORTED;
436 }
437
438 static int isolated_publish_nb(opal_list_t *info,
439 opal_pmix_op_cbfunc_t cbfunc, void *cbdata)
440 {
441 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
442 "%s pmix:isolated isolated publish_nb",
443 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
444 return OPAL_ERR_NOT_SUPPORTED;
445 }
446
447 static int isolated_lookup(opal_list_t *data, opal_list_t *info)
448 {
449 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
450 "%s pmix:isolated isolated lookup",
451 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
452 return OPAL_ERR_NOT_SUPPORTED;
453 }
454
455 static int isolated_lookup_nb(char **keys, opal_list_t *info,
456 opal_pmix_lookup_cbfunc_t cbfunc, void *cbdata)
457 {
458 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
459 "%s pmix:isolated isolated lookup_nb",
460 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
461 return OPAL_ERR_NOT_SUPPORTED;
462 }
463
464 static int isolated_unpublish(char **keys, opal_list_t *info)
465 {
466 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
467 "%s pmix:isolated isolated unpublish",
468 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
469 return OPAL_ERR_NOT_SUPPORTED;
470 }
471
472 static int isolated_unpublish_nb(char **keys, opal_list_t *info,
473 opal_pmix_op_cbfunc_t cbfunc, void *cbdata)
474 {
475 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
476 "%s pmix:isolated isolated unpublish_nb",
477 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
478 return OPAL_ERR_NOT_SUPPORTED;
479 }
480
481 static const char *isolated_get_version(void)
482 {
483 return "N/A";
484 }
485
486 static int isolated_store_local(const opal_process_name_t *proc,
487 opal_value_t *val)
488 {
489 opal_output_verbose(2, opal_pmix_base_framework.framework_output,
490 "%s pmix:isolated isolated store_local",
491 OPAL_NAME_PRINT(OPAL_PROC_MY_NAME));
492
493 opal_pmix_base_store(proc, val);
494
495 return OPAL_SUCCESS;
496 }
497
498 static const char *isolated_get_nspace(opal_jobid_t jobid)
499 {
500 return "N/A";
501 }
502
503 static void isolated_register_jobid(opal_jobid_t jobid, const char *nspace)
504 {
505 return;
506 }