static int _handle_ring(int fd, int lrank, client_req_t *req) { int rc = SLURM_SUCCESS; int count = 0; char *left = NULL; char *right = NULL; debug3("mpi/pmi2: in _handle_ring"); /* extract left, right, and count values from ring payload */ client_req_parse_body(req); client_req_get_int(req, RING_COUNT_KEY, &count); client_req_get_str(req, RING_LEFT_KEY, &left); client_req_get_str(req, RING_RIGHT_KEY, &right); /* compute ring_id, we list all application tasks first, * followed by stepds, so here we just use the application * process rank */ int ring_id = lrank; rc = pmix_ring_in(ring_id, count, left, right); xfree(left); xfree(right); /* the repsonse is sent back to client from the pmix_ring_out call */ debug3("mpi/pmi2: out _handle_ring"); return rc; }
static int _handle_kvs_put(int fd, int lrank, client_req_t *req) { int rc = SLURM_SUCCESS; client_resp_t *resp; char *key = NULL, *val = NULL; debug3("mpi/pmi2: in _handle_kvs_put"); client_req_parse_body(req); client_req_get_str(req, KEY_KEY, &key); client_req_get_str(req, VALUE_KEY, &val); /* no need to add k-v to hash. just get it ready to be up-forward */ rc = temp_kvs_add(key, val); xfree(key); xfree(val); resp = client_resp_new(); client_resp_append(resp, CMD_KEY"="KVSPUTRESP_CMD";" RC_KEY"=%d;", rc); rc = client_resp_send(resp, fd); client_resp_free(resp); debug3("mpi/pmi2: out _handle_kvs_put"); return rc; }
static int _handle_get(int fd, int lrank, client_req_t *req) { int rc; client_resp_t *resp; char *kvsname = NULL, *key = NULL, *val = NULL; debug3("mpi/pmi2: in _handle_get"); client_req_parse_body(req); client_req_get_str(req, KVSNAME_KEY, &kvsname); /* not used */ client_req_get_str(req, KEY_KEY, &key); val = kvs_get(key); resp = client_resp_new(); if (val != NULL) { client_resp_append(resp, CMD_KEY"="GETRESULT_CMD" " RC_KEY"=0 " VALUE_KEY"=%s\n", val); } else { client_resp_append(resp, CMD_KEY"="GETRESULT_CMD" " RC_KEY"=1\n"); } rc = client_resp_send(resp, fd); client_resp_free(resp); debug3("mpi/pmi2: out _handle_get"); return rc; }
static int _handle_put(int fd, int lrank, client_req_t *req) { int rc = SLURM_SUCCESS; client_resp_t *resp; char *kvsname = NULL, *key = NULL, *val = NULL; debug3("mpi/pmi2: in _handle_put"); client_req_parse_body(req); client_req_get_str(req, KVSNAME_KEY, &kvsname); /* not used */ client_req_get_str(req, KEY_KEY, &key); client_req_get_str(req, VALUE_KEY, &val); /* no need to add k-v to hash. just get it ready to be up-forward */ rc = temp_kvs_add(key, val); if (rc == SLURM_SUCCESS) rc = 0; else rc = 1; resp = client_resp_new(); client_resp_append(resp, CMD_KEY"="PUTRESULT_CMD" " RC_KEY"=%d\n", rc); rc = client_resp_send(resp, fd); client_resp_free(resp); debug3("mpi/pmi2: out _handle_put"); return rc; }
static int _handle_fullinit(int fd, int lrank, client_req_t *req) { int pmi_jobid, pmi_rank; bool threaded; int found, rc = PMI2_SUCCESS; client_resp_t *resp; debug3("mpi/pmi2: _handle_fullinit"); client_req_parse_body(req); found = client_req_get_int(req, PMIJOBID_KEY, &pmi_jobid); if (! found) { error(PMIJOBID_KEY" missing in fullinit command"); rc = PMI2_ERR_INVALID_ARG; goto response; } found = client_req_get_int(req, PMIRANK_KEY, &pmi_rank); if (! found) { error(PMIRANK_KEY" missing in fullinit command"); rc = PMI2_ERR_INVALID_ARG; goto response; } found = client_req_get_bool(req, THREADED_KEY, &threaded); if (! found) { error(THREADED_KEY" missing in fullinit command"); rc = PMI2_ERR_INVALID_ARG; goto response; } /* TODO: use threaded */ response: resp = client_resp_new(); /* what's the difference between DEBUGGED and VERBOSE? */ /* TODO: APPNUM */ client_resp_append(resp, CMD_KEY"="FULLINITRESP_CMD";" RC_KEY"=%d;" PMIVERSION_KEY"=%d;" PMISUBVER_KEY"=%d;" RANK_KEY"=%d;" SIZE_KEY"=%d;" APPNUM_KEY"=-1;" DEBUGGED_KEY"="FALSE_VAL";" PMIVERBOSE_KEY"=%s;", rc, PMI20_VERSION, PMI20_SUBVERSION, job_info.gtids[lrank], job_info.ntasks, (job_info.pmi_debugged ? TRUE_VAL : FALSE_VAL)); if (job_info.spawner_jobid) { client_resp_append(resp, SPAWNERJOBID_KEY"=%s;", job_info.spawner_jobid); } rc = client_resp_send(resp, fd); client_resp_free(resp); debug3("mpi/pmi2: fullinit done"); return rc; }
static int _handle_abort(int fd, int lrank, client_req_t *req) { int rc = SLURM_SUCCESS; bool is_world = false; debug3("mpi/pmi2: in _handle_abort"); client_req_parse_body(req); client_req_get_bool(req, ISWORLD_KEY, &is_world); /* no response needed. just cancel the job step if required */ if (is_world) { slurm_kill_job_step(job_info.jobid, job_info.stepid, SIGKILL); } return rc; }
static int _handle_mcmd(int fd, int lrank, client_req_t *req) { spawn_subcmd_t *subcmd = NULL; spawn_resp_t *spawn_resp = NULL; client_resp_t *task_resp = NULL; int spawnssofar = 0, rc = SLURM_SUCCESS, i; char buf[64]; debug3("mpi/pmi2: in _handle_mcmd"); client_req_parse_body(req); subcmd = client_req_parse_spawn_subcmd(req); debug3("mpi/pmi2: got subcmd"); client_req_get_int(req, SPAWNSSOFAR_KEY, &spawnssofar); if (spawnssofar == 1) { pmi1_spawn = spawn_req_new(); client_req_get_int(req, TOTSPAWNS_KEY, (int *)&pmi1_spawn->subcmd_cnt); pmi1_spawn->subcmds = xmalloc(pmi1_spawn->subcmd_cnt * sizeof(spawn_subcmd_t *)); client_req_get_int(req, PREPUTNUM_KEY, (int *)&pmi1_spawn->preput_cnt); pmi1_spawn->pp_keys = xmalloc(pmi1_spawn->preput_cnt * sizeof(char *)); pmi1_spawn->pp_vals = xmalloc(pmi1_spawn->preput_cnt * sizeof(char *)); for (i = 0; i < pmi1_spawn->preput_cnt; i ++) { snprintf(buf, 64, PREPUTKEY_KEY"%d", i); client_req_get_str(req, buf, &pmi1_spawn->pp_keys[i]); snprintf(buf, 64, PREPUTVAL_KEY"%d", i); client_req_get_str(req, buf, &pmi1_spawn->pp_vals[i]); } } pmi1_spawn->subcmds[spawnssofar - 1] = subcmd; if (spawnssofar == pmi1_spawn->subcmd_cnt) { debug3("mpi/pmi2: got whole spawn req"); /* a resp will be send back from srun. this will not be forwarded to the tasks */ rc = spawn_req_send_to_srun(pmi1_spawn, &spawn_resp); if (spawn_resp->rc != SLURM_SUCCESS) { task_resp = client_resp_new(); client_resp_append(task_resp, CMD_KEY"="SPAWNRESP_CMD";" RC_KEY"=%d;" ERRMSG_KEY"=spawn failed;", spawn_resp->rc); client_resp_send(task_resp, fd); client_resp_free(task_resp); spawn_resp_free(spawn_resp); spawn_req_free(pmi1_spawn); pmi1_spawn = NULL; error("mpi/pmi2: spawn failed"); rc = SLURM_ERROR; goto out; } debug("mpi/pmi2: spawn request sent to srun"); spawn_psr_enqueue(spawn_resp->seq, fd, lrank, NULL); spawn_resp_free(spawn_resp); spawn_req_free(pmi1_spawn); pmi1_spawn = NULL; } out: debug3("mpi/pmi2: out _handle_mcmd"); return rc; }