static int _parse_cmd(client_req_t *req) { int i = 0, len = 0; len = strlen (MCMD_KEY"="); if (! xstrncmp(req->buf, MCMD_KEY"=", len)) { req->cmd = MCMD_KEY; /* XXX: mcmd=spawn */ req->sep = '\n'; req->term = '\n'; return SLURM_SUCCESS; } len = strlen (CMD_KEY"="); if (xstrncmp(req->buf, CMD_KEY"=", len)) { error("mpi/pmi2: request not begin with '" CMD_KEY "='"); error("mpi/pmi2: full request is: %s", req->buf); return SLURM_ERROR; } req->cmd = &req->buf[len]; i = len; if (is_pmi11()) { req->sep = ' '; req->term = '\n'; while (req->buf[i] != req->sep && req->buf[i] != req->term && i < req->buf_len) { i ++; } } else if (is_pmi20()) { req->sep = ';'; req->term = ';'; while (req->buf[i] != req->sep && req->buf[i] != req->term && i < req->buf_len) { i ++; } } if (i >= req->buf_len) { error ("mpi/pmi2: cmd not properly terminated in client request"); return SLURM_ERROR; } req->buf[i] = '\0'; /* make it nul terminated */ req->parse_idx = i + 1; /* TODO: concat processing */ return SLURM_SUCCESS; }
static int _handle_task_request(int fd, int lrank) { int rc = SLURM_SUCCESS; debug3("mpi/pmi2: in _handle_task_request, lrank=%d", lrank); if (initialized[lrank] == 0) { rc = _handle_pmi1_init(fd, lrank); initialized[lrank] = 1; } else if (is_pmi11()) { rc = handle_pmi1_cmd(fd, lrank); } else if (is_pmi20()) { rc = handle_pmi2_cmd(fd, lrank); } else { fatal("this is impossible"); } return rc; }
/* send fence_resp/barrier_out to tasks */ extern int send_kvs_fence_resp_to_clients(int rc, char *errmsg) { int i = 0; client_resp_t *resp; char *msg; resp = client_resp_new(); if ( is_pmi11() ) { if (rc != 0 && errmsg != NULL) { // XXX: pmi1.1 does not check the rc msg = _str_replace(errmsg, ' ', '_'); client_resp_append(resp, CMD_KEY"="BARRIEROUT_CMD" " RC_KEY"=%d "MSG_KEY"=%s\n", rc, msg); xfree(msg); } else { client_resp_append(resp, CMD_KEY"="BARRIEROUT_CMD" " RC_KEY"=%d\n", rc); } } else if (is_pmi20()) { if (rc != 0 && errmsg != NULL) { // TODO: pmi2.0 accept escaped ';' (";;") msg = _str_replace(errmsg, ';', '_'); client_resp_append(resp, CMD_KEY"="KVSFENCERESP_CMD";" RC_KEY"=%d;"ERRMSG_KEY"=%s;", rc, msg); xfree(msg); } else { client_resp_append(resp, CMD_KEY"="KVSFENCERESP_CMD";" RC_KEY"=%d;", rc); } } for (i = 0; i < job_info.ltasks; i ++) { rc = client_resp_send(resp, STEPD_PMI_SOCK(i)); } client_resp_free(resp); return rc; }
extern int client_resp_send(client_resp_t *resp, int fd) { char len_buf[7]; int len; len = strlen(resp->buf); if ( is_pmi20() ) { snprintf(len_buf, 7, "%-6d", len); debug2("mpi/pmi2: client_resp_send: %s%s", len_buf, resp->buf); safe_write(fd, len_buf, 6); } else if ( is_pmi11() ) { debug2("mpi/pmi2: client_resp_send: %s", resp->buf); } safe_write(fd, resp->buf, len); return SLURM_SUCCESS; rwfail: return SLURM_ERROR; }