/*** MODEX SECTION ***/ static int modex(opal_list_t *procs) { int rc; char *rml_uri, *attr; orte_vpid_t v; orte_process_name_t name; OPAL_OUTPUT_VERBOSE((1, orte_grpcomm_base.output, "%s grpcomm:pmi: modex entered", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME))); /* add our oob endpoint info so that oob communications * can be supported */ rml_uri = orte_rml.get_contact_info(); if (strlen(rml_uri) > (size_t)pmi_vallen_max) { opal_output(0, "grpcomm:pmi: RML uri length is too long\n"); return ORTE_ERROR; } if (0 > asprintf(&attr, "%s-RMLURI", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME))) { free(rml_uri); return ORTE_ERR_OUT_OF_RESOURCE; } rc = PMI_KVS_Put(pmi_kvs_name, attr, rml_uri); if (PMI_SUCCESS != rc) { ORTE_PMI_ERROR(rc, "PMI_KVS_Put"); free(rml_uri); free(attr); return ORTE_ERROR; } free(rml_uri); free(attr); /* commit our modex info */ if (PMI_SUCCESS != (rc = PMI_KVS_Commit(pmi_kvs_name))) { ORTE_PMI_ERROR(rc, "PMI_KVS_Commit failed"); return ORTE_ERROR; } /* Barrier here to ensure all other procs have committed */ if (ORTE_SUCCESS != (rc = pmi_barrier())) { return rc; } /* harvest the oob endpoint info for all other procs * in our job so oob wireup can be completed */ rml_uri = malloc(pmi_vallen_max); if (NULL == rml_uri) { return ORTE_ERR_OUT_OF_RESOURCE; } name.jobid = ORTE_PROC_MY_NAME->jobid; for (v=0; v < orte_process_info.num_procs; v++) { if (v == ORTE_PROC_MY_NAME->vpid) { continue; } name.vpid = v; if (0 > asprintf(&attr, "%s-RMLURI", ORTE_NAME_PRINT(&name))) { free(rml_uri); return ORTE_ERR_OUT_OF_RESOURCE; } rc = PMI_KVS_Get(pmi_kvs_name, attr, rml_uri, pmi_vallen_max); if (PMI_SUCCESS != rc) { ORTE_PMI_ERROR(rc, "PMI_KVS_Get"); free(rml_uri); free(attr); return ORTE_ERROR; } free(attr); OPAL_OUTPUT_VERBOSE((5, orte_grpcomm_base.output, "%s grpcomm:pmi: proc %s oob endpoint %s", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME), ORTE_NAME_PRINT(&name), rml_uri)); /* set the contact info into the hash table */ if (ORTE_SUCCESS != (rc = orte_rml.set_contact_info(rml_uri))) { free(rml_uri); return rc; } } free(rml_uri); OPAL_OUTPUT_VERBOSE((1, orte_grpcomm_base.output, "%s grpcomm:pmi: modex completed", ORTE_NAME_PRINT(ORTE_PROC_MY_NAME))); return rc; }
int main (int argc, char *argv[]) { struct context ctx; struct pmi_simple_ops ops = { .kvs_put = s_kvs_put, .kvs_get = s_kvs_get, .barrier = s_barrier, }; pmi_t *cli; int spawned = -1, initialized = -1; int rank = -1, size = -1; int universe_size = -1; int name_len = -1, key_len = -1, val_len = -1; char *name = NULL, *val = NULL, *val2 = NULL; plan (NO_PLAN); if (!(ctx.kvs = zhash_new ())) oom (); ctx.size = 1; ctx.barrier = 0; ok (socketpair (PF_LOCAL, SOCK_STREAM | SOCK_CLOEXEC, 0, ctx.fds) == 0, "socketpair returned client,server file descriptors"); ctx.pmi = pmi_simple_server_create (&ops, 42, ctx.size, "bleepgorp", &ctx); ok (ctx.pmi != NULL, "created simple pmi server context"); ctx.buflen = pmi_simple_server_get_maxrequest (ctx.pmi); ctx.buf = xzmalloc (ctx.buflen); ok (pthread_create (&ctx.t, NULL, server_thread, &ctx) == 0, "pthread_create successfully started server"); ok ((cli = pmi_create_simple (ctx.fds[0], 0, ctx.size)) != NULL, "pmi_create_simple OK"); ok (pmi_initialized (cli, &initialized) == PMI_SUCCESS && initialized == 0, "pmi_initialized OK, initialized=0"); ok (pmi_init (cli, &spawned) == PMI_SUCCESS && spawned == 0, "pmi_init OK, spawned=0"); ok (pmi_initialized (cli, &initialized) == PMI_SUCCESS && initialized == 1, "pmi_initialized OK, initialized=1"); /* retrieve basic params */ ok (pmi_get_size (cli, &size) == PMI_SUCCESS && size == 1, "pmi_get_size OK, size=%d", size); ok (pmi_get_rank (cli, &rank) == PMI_SUCCESS && rank == 0, "pmi_get_rank OK, rank=%d", rank); ok (pmi_get_universe_size (cli, &universe_size) == PMI_SUCCESS && universe_size == size, "pmi_get_universe_size OK, universe_size=%d", universe_size); ok (pmi_kvs_get_name_length_max (cli, &name_len) == PMI_SUCCESS && name_len > 0, "pmi_kvs_get_name_length_max OK, name_len=%d", name_len); ok (pmi_kvs_get_key_length_max (cli, &key_len) == PMI_SUCCESS && key_len > 0, "pmi_kvs_get_key_length_max OK, key_len=%d", key_len); ok (pmi_kvs_get_value_length_max (cli, &val_len) == PMI_SUCCESS && val_len > 0, "pmi_kvs_get_value_length_max OK, val_len=%d", val_len); name = xzmalloc (name_len); ok (pmi_kvs_get_my_name (cli, name, name_len) == PMI_SUCCESS && strlen (name) > 0, "pmi_kvs_get_my_name OK, name=%s", name); /* put foo=bar / commit / barier / get foo */ ok (pmi_kvs_put (cli, name, "foo", "bar") == PMI_SUCCESS, "pmi_kvs_put foo=bar OK"); ok (pmi_kvs_commit (cli, name) == PMI_SUCCESS, "pmi_kvs_commit OK"); ok (pmi_barrier (cli) == PMI_SUCCESS, "pmi_barrier OK"); val = xzmalloc (val_len); ok (pmi_kvs_get (cli, name, "foo", val, val_len) == PMI_SUCCESS && !strcmp (val, "bar"), "pmi_kvs_get foo OK, val=%s", val); /* put long=... / get long */ val2 = xzmalloc (val_len); memset (val2, 'x', val_len - 1); ok (pmi_kvs_put (cli, name, "long", val2) == PMI_SUCCESS, "pmi_kvs_put long=xxx... OK"); memset (val, 'y', val_len); /* not null terminated */ ok (pmi_kvs_get (cli, name, "long", val, val_len) == PMI_SUCCESS && strnlen (val2, val_len) < val_len && strcmp (val, val2) == 0, "pmi_kvs_get long OK, val=xxx..."); ok (pmi_finalize (cli) == PMI_SUCCESS, "pmi_finalize OK"); ok (pthread_join (ctx.t, NULL) == 0, "pthread join successfully reaped server"); free (name); free (val); free (val2); pmi_destroy (cli); if (ctx.pmi) pmi_simple_server_destroy (ctx.pmi); close (ctx.fds[0]); close (ctx.fds[1]); zhash_destroy (&ctx.kvs); done_testing (); return 0; }