From 5a2c6a0b8787d81ad5a817aa93e579fe492f4b8d Mon Sep 17 00:00:00 2001 From: Ralph Castain Date: Fri, 10 Jun 2005 03:35:36 +0000 Subject: [PATCH] Fix the trunk so it runs again: 1. Tell the oob subscription not to report on changes until AFTER the trigger fires (signifying that all procs have started) 2. Make sure tokens returned to the subscriber are from the container that housed the data being returned (previous mistake - tokens were from subscription, not from container) Tested on the Mac running up to 10 processes This commit was SVN r6025. --- .../gpr_replica_trig_ops_fn.c | 30 +++++++++---------- src/mca/oob/tcp/oob_tcp.c | 3 +- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/mca/gpr/replica/functional_layer/gpr_replica_trig_ops_fn.c b/src/mca/gpr/replica/functional_layer/gpr_replica_trig_ops_fn.c index 154ea94228..774bda4747 100644 --- a/src/mca/gpr/replica/functional_layer/gpr_replica_trig_ops_fn.c +++ b/src/mca/gpr/replica/functional_layer/gpr_replica_trig_ops_fn.c @@ -348,7 +348,7 @@ int orte_gpr_replica_check_notify(orte_gpr_replica_triggers_t *trig, orte_gpr_replica_subscribed_data_t *sub) { orte_gpr_replica_action_taken_t **ptr; - size_t i, cntr; + size_t i, j, cntr; orte_gpr_value_t value; orte_gpr_replica_itag_t *itaglist; int rc=ORTE_SUCCESS; @@ -356,20 +356,6 @@ int orte_gpr_replica_check_notify(orte_gpr_replica_triggers_t *trig, OBJ_CONSTRUCT(&value, orte_gpr_value_t); value.segment = strdup(sub->seg->name); value.addr_mode = sub->addr_mode; - value.num_tokens = orte_value_array_get_size(&(sub->tokentags)); - value.tokens = (char **)malloc(value.num_tokens * sizeof(char*)); - if (NULL == value.tokens) { - rc = ORTE_ERR_OUT_OF_RESOURCE; - goto CLEANUP; - } - itaglist = ORTE_VALUE_ARRAY_GET_BASE(&(sub->tokentags), orte_gpr_replica_itag_t); - for (i=0; i < value.num_tokens; i++) { - if (ORTE_SUCCESS != (rc = orte_gpr_replica_dict_reverse_lookup( - &(value.tokens[i]), sub->seg, itaglist[i]))) { - ORTE_ERROR_LOG(rc); - goto CLEANUP; - } - } value.cnt = 1; value.keyvals = (orte_gpr_keyval_t**)malloc(sizeof(orte_gpr_keyval_t*)); if (NULL == value.keyvals) { @@ -393,6 +379,20 @@ int orte_gpr_replica_check_notify(orte_gpr_replica_triggers_t *trig, if ((trig->action & ORTE_GPR_NOTIFY_ADD_ENTRY) && (ptr[i]->action & ORTE_GPR_REPLICA_ENTRY_ADDED) && orte_gpr_replica_check_notify_matches(sub, ptr[i])) { + /* need to send back the tokens from the container that is being addressed! */ + value.num_tokens = ptr[i]->cptr->num_itags; + value.tokens = (char **)malloc(value.num_tokens * sizeof(char*)); + if (NULL == value.tokens) { + rc = ORTE_ERR_OUT_OF_RESOURCE; + goto CLEANUP; + } + for (j=0; j < value.num_tokens; j++) { + if (ORTE_SUCCESS != (rc = orte_gpr_replica_dict_reverse_lookup( + &(value.tokens[j]), sub->seg, ptr[i]->cptr->itags[j]))) { + ORTE_ERROR_LOG(rc); + goto CLEANUP; + } + } /* send back the added entry */ if (ORTE_SUCCESS != (rc = orte_gpr_replica_dict_reverse_lookup( &((value.keyvals[0])->key), sub->seg, diff --git a/src/mca/oob/tcp/oob_tcp.c b/src/mca/oob/tcp/oob_tcp.c index 7879a61edf..d74a06ebc1 100644 --- a/src/mca/oob/tcp/oob_tcp.c +++ b/src/mca/oob/tcp/oob_tcp.c @@ -706,7 +706,8 @@ int mca_oob_tcp_resolve(mca_oob_tcp_peer_t* peer) subscription->jobid = peer->peer_name.jobid; rc = orte_gpr.subscribe( ORTE_GPR_NOTIFY_ADD_ENTRY | ORTE_GPR_NOTIFY_VALUE_CHG | - ORTE_GPR_TRIG_CMP_LEVELS | ORTE_GPR_TRIG_ONE_SHOT, + ORTE_GPR_TRIG_CMP_LEVELS | ORTE_GPR_TRIG_ONE_SHOT | + ORTE_GPR_TRIG_NOTIFY_START, /* DON'T START NOTIFYING ME ON CHANGES UNTIL AFTER TRIG FIRES */ 1, &subs, 1, &trigs, &subscription->subid);