root/opal/mca/pmix/pmix4x/pmix/test/test_resolve_peers.c

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

DEFINITIONS

This source file includes following definitions.
  1. resolve_nspace
  2. test_resolve_peers

   1 /*
   2  * Copyright (c) 2015-2018 Intel, Inc. All rights reserved.
   3  * Copyright (c) 2015      Mellanox Technologies, Inc.
   4  *                         All rights reserved.
   5  * $COPYRIGHT$
   6  *
   7  * Additional copyrights may follow
   8  *
   9  * $HEADER$
  10  *
  11  */
  12 
  13 #include "test_resolve_peers.h"
  14 #include "test_cd.h"
  15 
  16 #include "src/util/output.h"
  17 
  18 static int resolve_nspace(char *nspace, test_params params, char *my_nspace, int my_rank)
  19 {
  20     int rc;
  21     pmix_proc_t *procs;
  22     size_t nprocs, nranks, i;
  23     pmix_proc_t *ranks;
  24     rc = PMIx_Resolve_peers(NODE_NAME, nspace, &procs, &nprocs);
  25     if (PMIX_SUCCESS != rc) {
  26         TEST_ERROR(("%s:%d: Resolve peers test failed: rc = %d", my_nspace, my_rank, rc));
  27         return rc;
  28     }
  29     if (NULL == procs || 0 == nprocs) {
  30         TEST_ERROR(("%s:%d: Resolve peers didn't find any process from ns %s at this node\n", my_nspace, my_rank,my_nspace));
  31         return PMIX_ERROR;
  32     }
  33     rc = get_all_ranks_from_namespace(params, nspace, &ranks, &nranks);
  34     if (PMIX_SUCCESS != rc) {
  35         TEST_ERROR(("%s:%d: get_all_ranks_from_namespace function failed", my_nspace, my_rank));
  36         PMIX_PROC_FREE(procs, nprocs);
  37         return rc;
  38     }
  39     if (nprocs != nranks) {
  40         TEST_ERROR(("%s:%d: Resolve peers returned incorect result: returned %lu processes, expected %lu", my_nspace, my_rank, nprocs, nranks));
  41         PMIX_PROC_FREE(procs, nprocs);
  42         PMIX_PROC_FREE(ranks, nranks);
  43         return PMIX_ERROR;
  44     }
  45     for (i = 0; i < nprocs; i++) {
  46         if (procs[i].rank != ranks[i].rank) {
  47             TEST_ERROR(("%s:%d: Resolve peers returned incorrect result: returned value %s:%d, expected rank %d",
  48                         my_nspace, my_rank, procs[i].nspace, procs[i].rank, ranks[i].rank));
  49             rc = PMIX_ERROR;
  50             break;
  51         }
  52     }
  53     PMIX_PROC_FREE(procs, nprocs);
  54     PMIX_PROC_FREE(ranks, nranks);
  55     return rc;
  56 }
  57 
  58 int test_resolve_peers(char *my_nspace, int my_rank, test_params params)
  59 {
  60     int rc, n;
  61     int ns_num;
  62     char nspace[PMIX_MAX_NSLEN+1];
  63     pmix_proc_t procs[2];
  64 
  65     /* first resolve peers from the own namespace. */
  66     rc = resolve_nspace(my_nspace, params, my_nspace, my_rank);
  67     if (PMIX_SUCCESS == rc) {
  68         TEST_VERBOSE(("%s:%d: Resolve peers succeeded for the own namespace\n", my_nspace, my_rank));
  69     } else {
  70         TEST_ERROR(("%s:%d: Resolve peers failed for the own namespace\n", my_nspace, my_rank));
  71         return PMIX_ERROR;
  72     }
  73 
  74     /* then get number of namespaces and try to resolve peers from them. */
  75     ns_num = get_total_ns_number(params);
  76     if (0 >= ns_num) {
  77         TEST_ERROR(("%s:%d: get_total_ns_number function failed", my_nspace, my_rank));
  78         return PMIX_ERROR;
  79     }
  80     for (n = 0; n < ns_num; n++) {
  81         memset(nspace, 0, PMIX_MAX_NSLEN+1);
  82         /* then connect to processes from different namespaces and resolve peers. */
  83         (void)snprintf(nspace, PMIX_MAX_NSLEN, "%s-%d", TEST_NAMESPACE, n);
  84         if (0 == strncmp(my_nspace, nspace, strlen(nspace)+1)) {
  85             continue;
  86         }
  87 
  88         /* add to procs array all processes from own namespace and all processes from this namespace.
  89          * Make sure that processes are placed in the same order. */
  90         if (0 < strncmp(nspace, my_nspace, PMIX_MAX_NSLEN)) {
  91             (void)strncpy(procs[0].nspace, nspace, PMIX_MAX_NSLEN);
  92             (void)strncpy(procs[1].nspace, my_nspace, PMIX_MAX_NSLEN);
  93         } else {
  94             (void)strncpy(procs[1].nspace, nspace, PMIX_MAX_NSLEN);
  95             (void)strncpy(procs[0].nspace, my_nspace, PMIX_MAX_NSLEN);
  96         }
  97         procs[0].rank = PMIX_RANK_WILDCARD;
  98         procs[1].rank = PMIX_RANK_WILDCARD;
  99 
 100         /* make a connection between processes from own namespace and processes from this namespace. */
 101         rc = PMIx_Connect(procs, 2, NULL, 0);
 102         if (PMIX_SUCCESS == rc) {
 103             TEST_VERBOSE(("%s:%d: Connect to %s succeeded.", my_nspace, my_rank, nspace));
 104         } else {
 105             TEST_ERROR(("%s:%d: Connect to %s failed.", my_nspace, my_rank, nspace));
 106             return PMIX_ERROR;
 107         }
 108 
 109         /* then resolve peers from this namespace. */
 110         rc = resolve_nspace(nspace, params, my_nspace, my_rank);
 111         if (PMIX_SUCCESS == rc) {
 112             TEST_VERBOSE(("%s:%d: Resolve peers succeeded for ns %s\n", my_nspace, my_rank, nspace));
 113         } else {
 114             PMIx_Disconnect(procs, 2, NULL, 0);
 115             break;
 116         }
 117 
 118         /* disconnect from the processes of this namespace. */
 119         rc = PMIx_Disconnect(procs, 2, NULL, 0);
 120         if (PMIX_SUCCESS == rc) {
 121             TEST_VERBOSE(("%s:%d: Disconnect from %s succeeded %s.", my_nspace, my_rank, nspace));
 122         } else {
 123             TEST_ERROR(("%s:%d: Disconnect from %s failed %s.", my_nspace, my_rank, nspace));
 124             return PMIX_ERROR;
 125         }
 126     }
 127     if (PMIX_SUCCESS == rc) {
 128         TEST_VERBOSE(("%s:%d: Resolve peers test succeeded.", my_nspace, my_rank));
 129     }
 130     return rc;
 131 }

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