root/opal/mca/pmix/isolated/pmix_isolated.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. isolated_init
  2. isolated_fini
  3. isolated_initialized
  4. isolated_abort
  5. isolated_spawn
  6. isolated_spawn_nb
  7. isolated_job_connect
  8. isolated_job_disconnect
  9. isolated_job_disconnect_nb
  10. isolated_resolve_peers
  11. isolated_resolve_nodes
  12. isolated_put
  13. isolated_commit
  14. isolated_fence
  15. isolated_fence_nb
  16. isolated_get
  17. isolated_get_nb
  18. isolated_publish
  19. isolated_publish_nb
  20. isolated_lookup
  21. isolated_lookup_nb
  22. isolated_unpublish
  23. isolated_unpublish_nb
  24. isolated_get_version
  25. isolated_store_local
  26. isolated_get_nspace
  27. isolated_register_jobid

   1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil -*- */
   2 /*
   3  * Copyright (c) 2016-2017 Intel, Inc. All rights reserved.
   4  * Copyright (c) 2011-2015 Los Alamos National Security, LLC. All
   5  *                         rights reserved.
   6  * Copyright (c) 2016 Cisco Systems, Inc.  All rights reserved.
   7  * $COPYRIGHT$
   8  *
   9  * Additional copyrights may follow
  10  *
  11  * $HEADER$
  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     /* store our name in the opal_proc_t so that
 139      * debug messages will make sense - an upper
 140      * layer will eventually overwrite it, but that
 141      * won't do any harm */
 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     // setup hash table
 150     opal_pmix_base_hash_init();
 151 
 152     /* save the job size */
 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     /* save the appnum */
 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     /* save the local size */
 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     /* save the local leader */
 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     /* save our local rank */
 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     /* and our node rank */
 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 }

/* [<][>][^][v][top][bottom][index][help] */