root/mpich2/trunk/src/pm/hydra/pm/pmiserv/pmi_handle_v1.c @ 4887

Revision 4887, 12.3 KB (checked in by balaji, 5 months ago)

Warning stomp.

Line 
1/* -*- Mode: C; c-basic-offset:4 ; -*- */
2/*
3 *  (C) 2008 by Argonne National Laboratory.
4 *      See COPYRIGHT in top-level directory.
5 */
6
7#include "hydra.h"
8#include "hydra_utils.h"
9#include "bsci.h"
10#include "demux.h"
11#include "pmi_handle.h"
12#include "pmi_handle_v1.h"
13
14/* TODO: abort, create_kvs, destroy_kvs, getbyidx, spawn */
15static struct HYD_PMCD_pmi_handle_fns pmi_v1_handle_fns_foo[] = {
16    {"initack", HYD_PMCD_pmi_handle_v1_initack},
17    {"get_maxes", HYD_PMCD_pmi_handle_v1_get_maxes},
18    {"get_appnum", HYD_PMCD_pmi_handle_v1_get_appnum},
19    {"get_my_kvsname", HYD_PMCD_pmi_handle_v1_get_my_kvsname},
20    {"barrier_in", HYD_PMCD_pmi_handle_v1_barrier_in},
21    {"put", HYD_PMCD_pmi_handle_v1_put},
22    {"get", HYD_PMCD_pmi_handle_v1_get},
23    {"get_universe_size", HYD_PMCD_pmi_handle_v1_get_usize},
24    {"finalize", HYD_PMCD_pmi_handle_v1_finalize},
25    {"\0", NULL}
26};
27
28static struct HYD_PMCD_pmi_handle pmi_v1_foo = { PMI_V1_DELIM, pmi_v1_handle_fns_foo };
29
30struct HYD_PMCD_pmi_handle *HYD_PMCD_pmi_v1 = &pmi_v1_foo;
31
32HYD_Status HYD_PMCD_pmi_handle_v1_initack(int fd, char *args[])
33{
34    int id, rank, i;
35    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
36    HYD_PMCD_pmi_pg_t *run;
37    HYD_Status status = HYD_SUCCESS;
38
39    HYDU_FUNC_ENTER();
40
41    strtok(args[0], "=");
42    id = atoi(strtok(NULL, "="));
43
44    i = 0;
45    tmp[i++] = HYDU_strdup("cmd=initack\ncmd=set size=");
46    tmp[i++] = HYDU_int_to_str(HYD_pg_list->num_procs);
47    tmp[i++] = HYDU_strdup("\ncmd=set rank=");
48
49    status = HYD_PMCD_pmi_id_to_rank(id, &rank);
50    HYDU_ERR_POP(status, "unable to convert ID to rank\n");
51    tmp[i++] = HYDU_int_to_str(rank);
52
53    tmp[i++] = HYDU_strdup("\ncmd=set debug=");
54    tmp[i++] = HYDU_int_to_str(HYD_handle.debug);
55    tmp[i++] = HYDU_strdup("\n");
56    tmp[i++] = NULL;
57
58    status = HYDU_str_alloc_and_join(tmp, &cmd);
59    HYDU_ERR_POP(status, "error while joining strings\n");
60    HYDU_free_strlist(tmp);
61
62    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
63    HYDU_ERR_POP(status, "error writing PMI line\n");
64
65    HYDU_FREE(cmd);
66
67    run = HYD_pg_list;
68    while (run->next)
69        run = run->next;
70
71    /* Add the process to the last PG */
72    status = HYD_PMCD_pmi_add_process_to_pg(run, fd, id);
73    HYDU_ERR_POP(status, "unable to add process to pg\n");
74
75  fn_exit:
76    HYDU_FUNC_EXIT();
77    return status;
78
79  fn_fail:
80    goto fn_exit;
81}
82
83
84HYD_Status HYD_PMCD_pmi_handle_v1_get_maxes(int fd, char *args[])
85{
86    int i;
87    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
88    HYD_Status status = HYD_SUCCESS;
89
90    HYDU_FUNC_ENTER();
91
92    i = 0;
93    tmp[i++] = HYDU_strdup("cmd=maxes kvsname_max=");
94    tmp[i++] = HYDU_int_to_str(MAXKVSNAME);
95    tmp[i++] = HYDU_strdup(" keylen_max=");
96    tmp[i++] = HYDU_int_to_str(MAXKEYLEN);
97    tmp[i++] = HYDU_strdup(" vallen_max=");
98    tmp[i++] = HYDU_int_to_str(MAXVALLEN);
99    tmp[i++] = HYDU_strdup("\n");
100    tmp[i++] = NULL;
101
102    status = HYDU_str_alloc_and_join(tmp, &cmd);
103    HYDU_ERR_POP(status, "unable to join strings\n");
104    HYDU_free_strlist(tmp);
105
106    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
107    HYDU_ERR_POP(status, "error writing PMI line\n");
108    HYDU_FREE(cmd);
109
110  fn_exit:
111    HYDU_FUNC_EXIT();
112    return status;
113
114  fn_fail:
115    goto fn_exit;
116}
117
118
119HYD_Status HYD_PMCD_pmi_handle_v1_get_appnum(int fd, char *args[])
120{
121    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
122    int i;
123    HYD_PMCD_pmi_process_t *process;
124    HYD_Status status = HYD_SUCCESS;
125
126    HYDU_FUNC_ENTER();
127
128    /* Find the group id corresponding to this fd */
129    process = HYD_PMCD_pmi_find_process(fd);
130    if (process == NULL)        /* We didn't find the process */
131        HYDU_ERR_SETANDJUMP(status, HYD_INTERNAL_ERROR, "unable to find process structure\n");
132
133    i = 0;
134    tmp[i++] = HYDU_strdup("cmd=appnum appnum=");
135    tmp[i++] = HYDU_int_to_str(process->node->pg->id);
136    tmp[i++] = HYDU_strdup("\n");
137    tmp[i++] = NULL;
138
139    status = HYDU_str_alloc_and_join(tmp, &cmd);
140    HYDU_ERR_POP(status, "unable to join strings\n");
141    HYDU_free_strlist(tmp);
142
143    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
144    HYDU_ERR_POP(status, "error writing PMI line\n");
145    HYDU_FREE(cmd);
146
147  fn_exit:
148    HYDU_FUNC_EXIT();
149    return status;
150
151  fn_fail:
152    goto fn_exit;
153}
154
155
156HYD_Status HYD_PMCD_pmi_handle_v1_get_my_kvsname(int fd, char *args[])
157{
158    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
159    int i;
160    HYD_PMCD_pmi_process_t *process;
161    HYD_Status status = HYD_SUCCESS;
162
163    HYDU_FUNC_ENTER();
164
165    /* Find the group id corresponding to this fd */
166    process = HYD_PMCD_pmi_find_process(fd);
167    if (process == NULL)        /* We didn't find the process */
168        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
169                             "unable to find process structure for fd %d\n", fd);
170
171    i = 0;
172    tmp[i++] = HYDU_strdup("cmd=my_kvsname kvsname=");
173    tmp[i++] = HYDU_strdup(process->node->pg->kvs->kvs_name);
174    tmp[i++] = HYDU_strdup("\n");
175    tmp[i++] = NULL;
176
177    status = HYDU_str_alloc_and_join(tmp, &cmd);
178    HYDU_ERR_POP(status, "unable to join strings\n");
179    HYDU_free_strlist(tmp);
180
181    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
182    HYDU_ERR_POP(status, "error writing PMI line\n");
183    HYDU_FREE(cmd);
184
185  fn_exit:
186    HYDU_FUNC_EXIT();
187    return status;
188
189  fn_fail:
190    goto fn_exit;
191}
192
193
194HYD_Status HYD_PMCD_pmi_handle_v1_barrier_in(int fd, char *args[])
195{
196    HYD_PMCD_pmi_process_t *process, *prun;
197    HYD_PMCD_pmi_node_t *node;
198    const char *cmd;
199    HYD_Status status = HYD_SUCCESS;
200
201    HYDU_FUNC_ENTER();
202
203    /* Find the group id corresponding to this fd */
204    process = HYD_PMCD_pmi_find_process(fd);
205    if (process == NULL)        /* We didn't find the process */
206        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
207                             "unable to find process structure for fd %d\n", fd);
208
209    process->node->pg->barrier_count++;
210
211    /* All the processes have arrived at the barrier; send a
212     * barrier_out message to everyone. */
213    if (process->node->pg->barrier_count == process->node->pg->num_procs) {
214        cmd = "cmd=barrier_out\n";
215        for (node = process->node->pg->node_list; node; node = node->next) {
216            for (prun = node->process_list; prun; prun = prun->next) {
217                status = HYDU_sock_writeline(prun->fd, cmd, strlen(cmd));
218                HYDU_ERR_POP(status, "error writing PMI line\n");
219            }
220        }
221
222        process->node->pg->barrier_count = 0;
223    }
224
225  fn_exit:
226    HYDU_FUNC_EXIT();
227    return status;
228
229  fn_fail:
230    goto fn_exit;
231}
232
233
234HYD_Status HYD_PMCD_pmi_handle_v1_put(int fd, char *args[])
235{
236    int i;
237    HYD_PMCD_pmi_process_t *process;
238    HYD_PMCD_pmi_kvs_pair_t *key_pair, *run;
239    char *kvsname, *key, *val, *key_pair_str = NULL;
240    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
241    HYD_Status status = HYD_SUCCESS;
242
243    HYDU_FUNC_ENTER();
244
245    strtok(args[0], "=");
246    kvsname = strtok(NULL, "=");
247    strtok(args[1], "=");
248    key = strtok(NULL, "=");
249    strtok(args[2], "=");
250    val = strtok(NULL, "=");
251
252    /* Find the group id corresponding to this fd */
253    process = HYD_PMCD_pmi_find_process(fd);
254    if (process == NULL)        /* We didn't find the process */
255        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
256                             "unable to find process structure for fd %d\n", fd);
257
258    if (strcmp(process->node->pg->kvs->kvs_name, kvsname))
259        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
260                             "kvsname (%s) does not match this process' kvs space (%s)\n",
261                             kvsname, process->node->pg->kvs->kvs_name);
262
263    HYDU_MALLOC(key_pair, HYD_PMCD_pmi_kvs_pair_t *, sizeof(HYD_PMCD_pmi_kvs_pair_t), status);
264    HYDU_snprintf(key_pair->key, MAXKEYLEN, "%s", key);
265    HYDU_snprintf(key_pair->val, MAXVALLEN, "%s", val);
266    key_pair->next = NULL;
267
268    i = 0;
269    tmp[i++] = HYDU_strdup("cmd=put_result rc=");
270    if (process->node->pg->kvs->key_pair == NULL) {
271        process->node->pg->kvs->key_pair = key_pair;
272        tmp[i++] = HYDU_strdup("0 msg=success");
273    }
274    else {
275        run = process->node->pg->kvs->key_pair;
276        while (run->next) {
277            if (!strcmp(run->key, key_pair->key)) {
278                tmp[i++] = HYDU_strdup("-1 msg=duplicate_key");
279                key_pair_str = HYDU_strdup(key_pair->key);
280                tmp[i++] = HYDU_strdup(key_pair_str);
281                break;
282            }
283            run = run->next;
284        }
285        run->next = key_pair;
286        tmp[i++] = HYDU_strdup("0 msg=success");
287    }
288    tmp[i++] = HYDU_strdup("\n");
289    tmp[i++] = NULL;
290
291    status = HYDU_str_alloc_and_join(tmp, &cmd);
292    HYDU_ERR_POP(status, "unable to join strings\n");
293    HYDU_free_strlist(tmp);
294
295    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
296    HYDU_ERR_POP(status, "error writing PMI line\n");
297    HYDU_FREE(cmd);
298    HYDU_FREE(key_pair_str);
299
300  fn_exit:
301    HYDU_FUNC_EXIT();
302    return status;
303
304  fn_fail:
305    goto fn_exit;
306}
307
308
309HYD_Status HYD_PMCD_pmi_handle_v1_get(int fd, char *args[])
310{
311    int i;
312    HYD_PMCD_pmi_process_t *process;
313    HYD_PMCD_pmi_kvs_pair_t *run;
314    char *kvsname, *key;
315    char *tmp[HYD_NUM_TMP_STRINGS], *cmd, *key_val_str = NULL;
316    HYD_Status status = HYD_SUCCESS;
317
318    HYDU_FUNC_ENTER();
319
320    strtok(args[0], "=");
321    kvsname = strtok(NULL, "=");
322    strtok(args[1], "=");
323    key = strtok(NULL, "=");
324
325    /* Find the group id corresponding to this fd */
326    process = HYD_PMCD_pmi_find_process(fd);
327    if (process == NULL)        /* We didn't find the process */
328        HYDU_ERR_SETANDJUMP1(status, HYD_INTERNAL_ERROR,
329                             "unable to find process structure for fd %d\n", fd);
330
331    if (strcmp(process->node->pg->kvs->kvs_name, kvsname))
332        HYDU_ERR_SETANDJUMP2(status, HYD_INTERNAL_ERROR,
333                             "kvsname (%s) does not match this process' kvs space (%s)\n",
334                             kvsname, process->node->pg->kvs->kvs_name);
335
336    i = 0;
337    tmp[i++] = HYDU_strdup("cmd=get_result rc=");
338    if (process->node->pg->kvs->key_pair == NULL) {
339        tmp[i++] = HYDU_strdup("-1 msg=key_");
340        tmp[i++] = HYDU_strdup(key);
341        tmp[i++] = HYDU_strdup("_not_found value=unknown");
342    }
343    else {
344        run = process->node->pg->kvs->key_pair;
345        while (run) {
346            if (!strcmp(run->key, key)) {
347                tmp[i++] = HYDU_strdup("0 msg=success value=");
348                key_val_str = HYDU_strdup(run->val);
349                tmp[i++] = key_val_str;
350                break;
351            }
352            run = run->next;
353        }
354        if (run == NULL) {
355            tmp[i++] = HYDU_strdup("-1 msg=key_");
356            tmp[i++] = HYDU_strdup(key);
357            tmp[i++] = HYDU_strdup("_not_found value=unknown");
358        }
359    }
360    tmp[i++] = HYDU_strdup("\n");
361    tmp[i++] = NULL;
362
363    status = HYDU_str_alloc_and_join(tmp, &cmd);
364    HYDU_ERR_POP(status, "unable to join strings\n");
365    HYDU_free_strlist(tmp);
366
367    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
368    HYDU_ERR_POP(status, "error writing PMI line\n");
369    HYDU_FREE(cmd);
370
371  fn_exit:
372    HYDU_FUNC_EXIT();
373    return status;
374
375  fn_fail:
376    goto fn_exit;
377}
378
379
380HYD_Status HYD_PMCD_pmi_handle_v1_finalize(int fd, char *args[])
381{
382    const char *cmd;
383    HYD_Status status = HYD_SUCCESS;
384
385    HYDU_FUNC_ENTER();
386
387    cmd = "cmd=finalize_ack\n";
388    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
389    HYDU_ERR_POP(status, "error writing PMI line\n");
390
391    if (status == HYD_SUCCESS) {
392        status = HYD_DMX_deregister_fd(fd);
393        HYDU_ERR_POP(status, "unable to register fd\n");
394        close(fd);
395    }
396
397  fn_exit:
398    HYDU_FUNC_EXIT();
399    return status;
400
401  fn_fail:
402    goto fn_exit;
403}
404
405
406HYD_Status HYD_PMCD_pmi_handle_v1_get_usize(int fd, char *args[])
407{
408    int usize, i;
409    char *tmp[HYD_NUM_TMP_STRINGS], *cmd;
410    HYD_Status status = HYD_SUCCESS;
411
412    HYDU_FUNC_ENTER();
413
414    status = HYD_BSCI_query_usize(&usize);
415    HYDU_ERR_POP(status, "unable to get bootstrap universe size\n");
416
417    i = 0;
418    tmp[i++] = HYDU_strdup("cmd=universe_size size=");
419    tmp[i++] = HYDU_int_to_str(usize);
420    tmp[i++] = HYDU_strdup("\n");
421    tmp[i++] = NULL;
422
423    status = HYDU_str_alloc_and_join(tmp, &cmd);
424    HYDU_ERR_POP(status, "unable to join strings\n");
425    HYDU_free_strlist(tmp);
426
427    status = HYDU_sock_writeline(fd, cmd, strlen(cmd));
428    HYDU_ERR_POP(status, "error writing PMI line\n");
429    HYDU_FREE(cmd);
430
431  fn_exit:
432    HYDU_FUNC_EXIT();
433    return status;
434
435  fn_fail:
436    goto fn_exit;
437}
Note: See TracBrowser for help on using the browser.