Ejemplo n.º 1
0
/***   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;
}
Ejemplo n.º 2
0
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;
}