static HYD_status fn_kvs_get(int fd, int pid, int pgid, char *args[]) { int i, idx, found; struct HYD_pmcd_pmi_pg_scratch *pg_scratch; struct HYD_pg *pg; struct HYD_proxy *proxy; struct HYD_pmcd_pmi_kvs_pair *run; char *key, *thrid, *cmd; struct HYD_string_stash stash; struct HYD_pmcd_token *tokens; int token_count; HYD_status status = HYD_SUCCESS; HYDU_FUNC_ENTER(); status = HYD_pmcd_pmi_args_to_tokens(args, &tokens, &token_count); HYDU_ERR_POP(status, "unable to convert args to tokens\n"); key = HYD_pmcd_pmi_find_token_keyval(tokens, token_count, "key"); HYDU_ERR_CHKANDJUMP(status, key == NULL, HYD_INTERNAL_ERROR, "unable to find key token\n"); thrid = HYD_pmcd_pmi_find_token_keyval(tokens, token_count, "thrid"); proxy = HYD_pmcd_pmi_find_proxy(fd); HYDU_ASSERT(proxy, status); pg_scratch = (struct HYD_pmcd_pmi_pg_scratch *) proxy->pg->pg_scratch; found = 0; for (run = pg_scratch->kvs->key_pair; run; run = run->next) { if (!strcmp(run->key, key)) { found = 1; break; } } if (!found) { pg = proxy->pg; pg_scratch = (struct HYD_pmcd_pmi_pg_scratch *) pg->pg_scratch; idx = -1; for (i = 0; i < pg->pg_process_count; i++) if (pg_scratch->ecount[i].fd == fd && pg_scratch->ecount[i].pid == pid) { idx = i; break; } HYDU_ASSERT(idx != -1, status); for (i = 0; i < pg->pg_process_count; i++) { if (pg_scratch->ecount[i].epoch < pg_scratch->ecount[idx].epoch) { /* We haven't reached a barrier yet; queue up request */ status = HYD_pmcd_pmi_v2_queue_req(fd, pid, pgid, args, key, &pending_reqs); HYDU_ERR_POP(status, "unable to queue request\n"); /* We are done */ goto fn_exit; } } } HYD_STRING_STASH_INIT(stash); HYD_STRING_STASH(stash, HYDU_strdup("cmd=kvs-get-response;"), status); if (thrid) { HYD_STRING_STASH(stash, HYDU_strdup("thrid="), status); HYD_STRING_STASH(stash, HYDU_strdup(thrid), status); HYD_STRING_STASH(stash, HYDU_strdup(";"), status); } if (found) { HYD_STRING_STASH(stash, HYDU_strdup("found=TRUE;value="), status); HYD_STRING_STASH(stash, HYDU_strdup(run->val), status); HYD_STRING_STASH(stash, HYDU_strdup(";"), status); } else { HYD_STRING_STASH(stash, HYDU_strdup("found=FALSE;"), status); } HYD_STRING_STASH(stash, HYDU_strdup("rc=0;"), status); HYD_STRING_SPIT(stash, cmd, status); status = cmd_response(fd, pid, cmd); HYDU_ERR_POP(status, "send command failed\n"); HYDU_FREE(cmd); fn_exit: HYD_pmcd_pmi_free_tokens(tokens, token_count); HYDU_FUNC_EXIT(); return status; fn_fail: goto fn_exit; }
static HYD_status fn_info_getnodeattr(int fd, char *args[]) { int found; struct HYD_pmcd_pmi_kvs_pair *run; char *key, *waitval, *thrid; struct HYD_string_stash stash; char *cmd; struct HYD_pmcd_token *tokens = NULL; int token_count; HYD_status status = HYD_SUCCESS; HYDU_FUNC_ENTER(); status = HYD_pmcd_pmi_args_to_tokens(args, &tokens, &token_count); HYDU_ERR_POP(status, "unable to convert args to tokens\n"); key = HYD_pmcd_pmi_find_token_keyval(tokens, token_count, "key"); HYDU_ERR_CHKANDJUMP(status, key == NULL, HYD_INTERNAL_ERROR, "unable to find key token\n"); waitval = HYD_pmcd_pmi_find_token_keyval(tokens, token_count, "wait"); thrid = HYD_pmcd_pmi_find_token_keyval(tokens, token_count, "thrid"); /* if a predefined value is not found, we let the code fall back * to regular search and return an error to the client */ found = 0; for (run = HYD_pmcd_pmip.local.kvs->key_pair; run; run = run->next) { if (!strcmp(run->key, key)) { found = 1; break; } } if (found) { /* We found the attribute */ HYD_STRING_STASH_INIT(stash); HYD_STRING_STASH(stash, MPL_strdup("cmd=info-getnodeattr-response;"), status); if (thrid) { HYD_STRING_STASH(stash, MPL_strdup("thrid="), status); HYD_STRING_STASH(stash, MPL_strdup(thrid), status); HYD_STRING_STASH(stash, MPL_strdup(";"), status); } HYD_STRING_STASH(stash, MPL_strdup("found=TRUE;value="), status); HYD_STRING_STASH(stash, MPL_strdup(run->val), status); HYD_STRING_STASH(stash, MPL_strdup(";rc=0;"), status); HYD_STRING_SPIT(stash, cmd, status); send_cmd_downstream(fd, cmd); MPL_free(cmd); } else if (waitval && !strcmp(waitval, "TRUE")) { /* The client wants to wait for a response; queue up the request */ status = HYD_pmcd_pmi_v2_queue_req(fd, -1, -1, args, key, &pending_reqs); HYDU_ERR_POP(status, "unable to queue request\n"); goto fn_exit; } else { /* Tell the client that we can't find the attribute */ HYD_STRING_STASH_INIT(stash); HYD_STRING_STASH(stash, MPL_strdup("cmd=info-getnodeattr-response;"), status); if (thrid) { HYD_STRING_STASH(stash, MPL_strdup("thrid="), status); HYD_STRING_STASH(stash, MPL_strdup(thrid), status); HYD_STRING_STASH(stash, MPL_strdup(";"), status); } HYD_STRING_STASH(stash, MPL_strdup("found=FALSE;rc=0;"), status); HYD_STRING_SPIT(stash, cmd, status); send_cmd_downstream(fd, cmd); MPL_free(cmd); } fn_exit: if (tokens) HYD_pmcd_pmi_free_tokens(tokens, token_count); HYDU_FUNC_EXIT(); return status; fn_fail: goto fn_exit; }