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.
Этот коммит содержится в:
родитель
ec1c1bae13
Коммит
5a2c6a0b87
@ -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,
|
||||
|
@ -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);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user