From bdb0a3e2930854b00da7e50bf8fb8690580231ad Mon Sep 17 00:00:00 2001 From: mquinson Date: Wed, 23 Dec 2009 15:17:19 +0000 Subject: [PATCH] Change the protocol of pm_join: cannot force the rank anymore, the master gives one to you. Seem to help pmm working git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@6961 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- examples/amok/bandwidth/bandwidth.c | 2 +- examples/amok/saturate/saturate.c | 2 +- examples/gras/pmm/pmm.c | 10 ++-- include/amok/peermanagement.h | 4 +- src/amok/PeerManagement/peermanagement.c | 71 +++++++----------------- 5 files changed, 30 insertions(+), 59 deletions(-) diff --git a/examples/amok/bandwidth/bandwidth.c b/examples/amok/bandwidth/bandwidth.c index 65538fe66f..c703fee2f3 100644 --- a/examples/amok/bandwidth/bandwidth.c +++ b/examples/amok/bandwidth/bandwidth.c @@ -48,7 +48,7 @@ int sensor(int argc, char *argv[]) } } - amok_pm_group_join(master, "bandwidth", -1); + amok_pm_group_join(master, "bandwidth"); amok_pm_mainloop(60); gras_socket_close(mysock); diff --git a/examples/amok/saturate/saturate.c b/examples/amok/saturate/saturate.c index 70d6cad4ba..7fdbec3efd 100644 --- a/examples/amok/saturate/saturate.c +++ b/examples/amok/saturate/saturate.c @@ -40,7 +40,7 @@ int sensor(int argc, char *argv[]) gras_os_sleep(2); /* let the master get ready */ master = gras_socket_client_from_string(argv[1]); - amok_pm_group_join(master, "saturate", -1); + amok_pm_group_join(master, "saturate"); amok_pm_mainloop(600); gras_socket_close(mysock); diff --git a/examples/gras/pmm/pmm.c b/examples/gras/pmm/pmm.c index ecfb020b0f..54fcae4475 100755 --- a/examples/gras/pmm/pmm.c +++ b/examples/gras/pmm/pmm.c @@ -78,7 +78,6 @@ typedef struct { int remaining_ack; } master_data_t; - int master(int argc, char *argv[]) { @@ -111,10 +110,13 @@ int master(int argc, char *argv[]) /* friends, we're ready. Come and play */ INFO0("Wait for peers for 5 sec"); gras_msg_handleall(5); - INFO1("Got %ld pals", xbt_dynar_length(peers)); + while (xbt_dynar_length(peers)<9) { + INFO1("Got only %ld pals. Wait 5 more seconds", xbt_dynar_length(peers)); + gras_msg_handleall(5); + } + INFO1("Good. Got %ld pals", xbt_dynar_length(peers)); for (i = 0; i < xbt_dynar_length(peers) && i < SLAVE_COUNT; i++) { - xbt_dynar_get_cpy(peers, i, &grid[i]); socket[i] = gras_socket_client(grid[i]->name, grid[i]->port); } @@ -389,7 +391,7 @@ int slave(int argc, char *argv[]) } /* Join and run the group */ - amok_pm_group_join(master, "pmm", rank); + rank = amok_pm_group_join(master, "pmm"); amok_pm_mainloop(600); /* housekeeping */ diff --git a/include/amok/peermanagement.h b/include/amok/peermanagement.h index b96b0e175c..f92957df64 100644 --- a/include/amok/peermanagement.h +++ b/include/amok/peermanagement.h @@ -69,8 +69,8 @@ XBT_PUBLIC(xbt_dynar_t) amok_pm_group_new(const char *group_name); XBT_PUBLIC(xbt_dynar_t) amok_pm_group_get(gras_socket_t master, const char *group_name); -XBT_PUBLIC(void) amok_pm_group_join(gras_socket_t master, - const char *group_name, int rank); +XBT_PUBLIC(int) amok_pm_group_join(gras_socket_t master, + const char *group_name); XBT_PUBLIC(void) amok_pm_group_leave(gras_socket_t master, const char *group_name); diff --git a/src/amok/PeerManagement/peermanagement.c b/src/amok/PeerManagement/peermanagement.c index 022344c65c..b353af808e 100644 --- a/src/amok/PeerManagement/peermanagement.c +++ b/src/amok/PeerManagement/peermanagement.c @@ -24,12 +24,6 @@ typedef struct { xbt_dict_t groups; } s_amok_pm_moddata_t, *amok_pm_moddata_t; -/* Payload of join message */ -typedef struct { - char *group; - int rank; -} s_amok_pm_msg_join_t, *amok_pm_msg_join_t; - /* Message callbacks */ static int amok_pm_cb_kill(gras_msg_cb_ctx_t ctx, void *payload_data) { @@ -61,31 +55,20 @@ static int amok_pm_cb_get(gras_msg_cb_ctx_t ctx, void *payload) static int amok_pm_cb_join(gras_msg_cb_ctx_t ctx, void *payload) { amok_pm_moddata_t g = gras_moddata_by_id(amok_pm_moddata_id); - amok_pm_msg_join_t msg = *(amok_pm_msg_join_t *) payload; - xbt_dynar_t group = xbt_dict_get(g->groups, msg->group); + char* group_name = *(char* *) payload; + xbt_dynar_t group = xbt_dict_get(g->groups, group_name); + int rank; gras_socket_t exp = gras_msg_cb_ctx_from(ctx); xbt_peer_t dude = xbt_peer_new(gras_socket_peer_name(exp), gras_socket_peer_port(exp)); - xbt_peer_t previous = NULL; - - if (msg->rank >= 0 && xbt_dynar_length(group) >= msg->rank + 1) - xbt_dynar_get_cpy(group, msg->rank, &previous); - - VERB3("Contacted by %s:%d for rank %d", dude->name, dude->port, msg->rank); - if (msg->rank < 0) { - xbt_dynar_push(group, &dude); - } else { - if (previous) - THROW4(arg_error, 0, - "You wanted to get rank %d of group %s, but %s:%d is already there", - msg->rank, msg->group, previous->name, previous->port); - xbt_dynar_set(group, msg->rank, &dude); - } - gras_msg_rpcreturn(10, ctx, NULL); - free(msg->group); - free(msg); + rank = xbt_dynar_length(group); + xbt_dynar_push(group, &dude); + VERB3("Contacted by %s:%d. Give it rank #%d", dude->name, dude->port,rank); + + gras_msg_rpcreturn(10, ctx, &rank); + free(group_name); return 0; } @@ -188,23 +171,20 @@ xbt_dynar_t amok_pm_group_get(gras_socket_t master, const char *group_name) /** \brief add current peer to the given remote group * - * You should provide rank only when you want to force the order of members - * (for example in strict test cases). Give -1 to leave the system choose it for you. + * Returns the rank of the process in the group. */ -void amok_pm_group_join(gras_socket_t master, const char *group_name, - int rank) +int amok_pm_group_join(gras_socket_t master, const char *group_name) { - amok_pm_msg_join_t msg = xbt_new(s_amok_pm_msg_join_t, 1); - msg->group = (char *) group_name; - msg->rank = rank; - VERB4("Join group '%s' on %s:%d (at rank %d)", - group_name, gras_socket_peer_name(master), - gras_socket_peer_port(master), rank); - gras_msg_rpccall(master, 30, "amok_pm_join", &msg, NULL); - free(msg); - VERB3("Joined group '%s' on %s:%d", + int rank; + VERB3("Join group '%s' on %s:%d", group_name, gras_socket_peer_name(master), gras_socket_peer_port(master)); + gras_msg_rpccall(master, 30, "amok_pm_join", &group_name, &rank); + VERB4("Joined group '%s' on %s:%d. Got rank %d", + group_name, gras_socket_peer_name(master), + gras_socket_peer_port(master), + rank); + return rank; } /** \brief remove current peer from the given remote group if found @@ -260,23 +240,12 @@ static void _amok_pm_init(void) gras_datadesc_dynar(gras_datadesc_by_name("xbt_peer_t"), xbt_peer_free_voidp); - gras_datadesc_type_t msg_join_t = - gras_datadesc_struct("s_amok_pm_moddata_t"); - gras_datadesc_struct_append(msg_join_t, "group", - gras_datadesc_by_name("string")); - gras_datadesc_struct_append(msg_join_t, "rank", - gras_datadesc_by_name("int")); - gras_datadesc_struct_close(msg_join_t); - msg_join_t = - gras_datadesc_ref("amok_pm_moddata_t", - gras_datadesc_by_name("s_amok_pm_moddata_t")); - gras_msgtype_declare("amok_pm_kill", NULL); gras_msgtype_declare_rpc("amok_pm_killrpc", NULL, NULL); gras_msgtype_declare_rpc("amok_pm_get", gras_datadesc_by_name("string"), pm_group_type); - gras_msgtype_declare_rpc("amok_pm_join", msg_join_t, NULL); + gras_msgtype_declare_rpc("amok_pm_join", gras_datadesc_by_name("string"), gras_datadesc_by_name("int")); gras_msgtype_declare_rpc("amok_pm_leave", gras_datadesc_by_name("string"), NULL); -- 2.20.1