2006-08-23 03:32:36 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
|
|
|
|
* University Research and Technology
|
|
|
|
* Corporation. All rights reserved.
|
|
|
|
* Copyright (c) 2004-2006 The University of Tennessee and The University
|
|
|
|
* of Tennessee Research Foundation. All rights
|
|
|
|
* reserved.
|
|
|
|
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
|
|
|
|
* University of Stuttgart. All rights reserved.
|
|
|
|
* Copyright (c) 2004-2005 The Regents of the University of California.
|
|
|
|
* All rights reserved.
|
2007-06-08 22:59:31 +00:00
|
|
|
* Copyright (c) 2007 Cisco, Inc. All rights reserved.
|
2006-08-23 03:32:36 +00:00
|
|
|
* $COPYRIGHT$
|
|
|
|
*
|
|
|
|
* Additional copyrights may follow
|
|
|
|
*
|
|
|
|
* $HEADER$
|
|
|
|
*/
|
|
|
|
|
2006-02-12 01:33:29 +00:00
|
|
|
#include "orte_config.h"
|
2008-02-28 01:57:57 +00:00
|
|
|
|
2008-06-09 14:53:58 +00:00
|
|
|
#include "orte/util/show_help.h"
|
2008-02-28 01:57:57 +00:00
|
|
|
|
2006-02-12 01:33:29 +00:00
|
|
|
#include "orte/mca/rml/rml.h"
|
2008-02-28 01:57:57 +00:00
|
|
|
#include "orte/runtime/orte_globals.h"
|
|
|
|
|
2006-02-12 01:33:29 +00:00
|
|
|
#include "orte/mca/iof/base/base.h"
|
|
|
|
#include "orte/mca/iof/base/iof_base_header.h"
|
|
|
|
#include "orte/mca/iof/base/iof_base_endpoint.h"
|
|
|
|
#include "orte/mca/errmgr/errmgr.h"
|
2005-01-12 20:51:34 +00:00
|
|
|
#include "iof_proxy.h"
|
|
|
|
#include "iof_proxy_svc.h"
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
|
|
|
* Local function prototypes.
|
2005-01-12 20:51:34 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
static void orte_iof_proxy_svc_msg(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin,
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_msg_header_t* msg,
|
2005-01-12 20:51:34 +00:00
|
|
|
unsigned char* data);
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
static void orte_iof_proxy_svc_ack(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin,
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_msg_header_t* msg);
|
2005-01-12 20:51:34 +00:00
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* Send a "publish" request to the svc component
|
2005-01-12 20:51:34 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
int orte_iof_proxy_svc_publish(
|
|
|
|
const orte_process_name_t* name,
|
2005-01-12 20:51:34 +00:00
|
|
|
int tag)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_header_t hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
struct iovec iov;
|
|
|
|
int rc;
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
hdr.hdr_common.hdr_type = ORTE_IOF_BASE_HDR_PUB;
|
2005-01-12 20:51:34 +00:00
|
|
|
hdr.hdr_common.hdr_status = 0;
|
|
|
|
hdr.hdr_pub.pub_name = *name;
|
Bring over the update to terminate orteds that are generated by a dynamic spawn such as comm_spawn. This introduces the concept of a job "family" - i.e., jobs that have a parent/child relationship. Comm_spawn'ed jobs have a parent (the one that spawned them). We track that relationship throughout the lineage - i.e., if a comm_spawned job in turn calls comm_spawn, then it has a parent (the one that spawned it) and a "root" job (the original job that started things).
Accordingly, there are new APIs to the name service to support the ability to get a job's parent, root, immediate children, and all its descendants. In addition, the terminate_job, terminate_orted, and signal_job APIs for the PLS have been modified to accept attributes that define the extent of their actions. For example, doing a "terminate_job" with an attribute of ORTE_NS_INCLUDE_DESCENDANTS will terminate the given jobid AND all jobs that descended from it.
I have tested this capability on a MacBook under rsh, Odin under SLURM, and LANL's Flash (bproc). It worked successfully on non-MPI jobs (both simple and including a spawn), and MPI jobs (again, both simple and with a spawn).
This commit was SVN r12597.
2006-11-14 19:34:59 +00:00
|
|
|
hdr.hdr_pub.pub_proxy = *ORTE_PROC_MY_NAME;
|
2005-03-14 20:57:21 +00:00
|
|
|
hdr.hdr_pub.pub_mask = ORTE_NS_CMP_ALL;
|
2005-01-12 20:51:34 +00:00
|
|
|
hdr.hdr_pub.pub_tag = tag;
|
2007-06-08 22:59:31 +00:00
|
|
|
ORTE_IOF_BASE_HDR_PUB_HTON(hdr.hdr_pub);
|
2005-01-12 20:51:34 +00:00
|
|
|
|
2006-08-23 03:32:36 +00:00
|
|
|
iov.iov_base = (IOVBASE_TYPE*)&hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
iov.iov_len = sizeof(hdr);
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
rc = orte_rml.send(
|
2008-02-28 01:57:57 +00:00
|
|
|
&orte_iof_base.iof_service,
|
2005-01-12 20:51:34 +00:00
|
|
|
&iov,
|
|
|
|
1,
|
2005-03-14 20:57:21 +00:00
|
|
|
ORTE_RML_TAG_IOF_SVC,
|
2005-01-12 20:51:34 +00:00
|
|
|
0);
|
|
|
|
if(rc < 0) {
|
2005-03-29 19:40:38 +00:00
|
|
|
ORTE_ERROR_LOG(rc);
|
2005-01-12 20:51:34 +00:00
|
|
|
return rc;
|
|
|
|
}
|
2006-02-12 01:33:29 +00:00
|
|
|
return ORTE_SUCCESS;
|
2005-01-12 20:51:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* Send an "unpublish" request to the svc component
|
2005-01-12 20:51:34 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
int orte_iof_proxy_svc_unpublish(
|
|
|
|
const orte_process_name_t* name,
|
|
|
|
orte_ns_cmp_bitmask_t mask,
|
2005-01-12 20:51:34 +00:00
|
|
|
int tag)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_header_t hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
struct iovec iov;
|
|
|
|
int rc;
|
|
|
|
|
2007-06-08 22:59:31 +00:00
|
|
|
hdr.hdr_common.hdr_type = ORTE_IOF_BASE_HDR_UNPUB;
|
2005-01-12 20:51:34 +00:00
|
|
|
hdr.hdr_common.hdr_status = 0;
|
|
|
|
hdr.hdr_pub.pub_name = *name;
|
Bring over the update to terminate orteds that are generated by a dynamic spawn such as comm_spawn. This introduces the concept of a job "family" - i.e., jobs that have a parent/child relationship. Comm_spawn'ed jobs have a parent (the one that spawned them). We track that relationship throughout the lineage - i.e., if a comm_spawned job in turn calls comm_spawn, then it has a parent (the one that spawned it) and a "root" job (the original job that started things).
Accordingly, there are new APIs to the name service to support the ability to get a job's parent, root, immediate children, and all its descendants. In addition, the terminate_job, terminate_orted, and signal_job APIs for the PLS have been modified to accept attributes that define the extent of their actions. For example, doing a "terminate_job" with an attribute of ORTE_NS_INCLUDE_DESCENDANTS will terminate the given jobid AND all jobs that descended from it.
I have tested this capability on a MacBook under rsh, Odin under SLURM, and LANL's Flash (bproc). It worked successfully on non-MPI jobs (both simple and including a spawn), and MPI jobs (again, both simple and with a spawn).
This commit was SVN r12597.
2006-11-14 19:34:59 +00:00
|
|
|
hdr.hdr_pub.pub_proxy = *ORTE_PROC_MY_NAME;
|
2005-01-12 20:51:34 +00:00
|
|
|
hdr.hdr_pub.pub_mask = mask;
|
|
|
|
hdr.hdr_pub.pub_tag = tag;
|
2007-06-08 22:59:31 +00:00
|
|
|
ORTE_IOF_BASE_HDR_PUB_HTON(hdr.hdr_pub);
|
2005-01-12 20:51:34 +00:00
|
|
|
|
2006-08-23 03:32:36 +00:00
|
|
|
iov.iov_base = (IOVBASE_TYPE*)&hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
iov.iov_len = sizeof(hdr);
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
rc = orte_rml.send(
|
2008-02-28 01:57:57 +00:00
|
|
|
&orte_iof_base.iof_service,
|
2005-01-12 20:51:34 +00:00
|
|
|
&iov,
|
|
|
|
1,
|
2005-03-14 20:57:21 +00:00
|
|
|
ORTE_RML_TAG_IOF_SVC,
|
2005-01-12 20:51:34 +00:00
|
|
|
0);
|
|
|
|
if(rc < 0) {
|
2005-03-29 19:40:38 +00:00
|
|
|
ORTE_ERROR_LOG(rc);
|
2005-01-12 20:51:34 +00:00
|
|
|
return rc;
|
|
|
|
}
|
2006-02-12 01:33:29 +00:00
|
|
|
return ORTE_SUCCESS;
|
2005-01-12 20:51:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* Send a "subscribe" request to the svc component
|
2005-01-12 20:51:34 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
int orte_iof_proxy_svc_subscribe(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin_name,
|
|
|
|
orte_ns_cmp_bitmask_t origin_mask,
|
|
|
|
int origin_tag,
|
|
|
|
const orte_process_name_t* target_name,
|
|
|
|
orte_ns_cmp_bitmask_t target_mask,
|
|
|
|
int target_tag
|
2005-01-12 20:51:34 +00:00
|
|
|
)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_header_t hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
struct iovec iov;
|
|
|
|
int rc;
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
hdr.hdr_common.hdr_type = ORTE_IOF_BASE_HDR_SUB;
|
2005-01-12 20:51:34 +00:00
|
|
|
hdr.hdr_common.hdr_status = 0;
|
2007-06-08 22:59:31 +00:00
|
|
|
hdr.hdr_sub.origin_name = *origin_name;
|
|
|
|
hdr.hdr_sub.origin_mask = origin_mask;
|
|
|
|
hdr.hdr_sub.origin_tag = origin_tag;
|
|
|
|
hdr.hdr_sub.target_name = *target_name;
|
|
|
|
hdr.hdr_sub.target_mask = target_mask;
|
|
|
|
hdr.hdr_sub.target_tag = target_tag;
|
|
|
|
ORTE_IOF_BASE_HDR_SUB_HTON(hdr.hdr_sub);
|
2005-01-12 20:51:34 +00:00
|
|
|
|
2006-08-23 03:32:36 +00:00
|
|
|
iov.iov_base = (IOVBASE_TYPE*)&hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
iov.iov_len = sizeof(hdr);
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
rc = orte_rml.send(
|
2008-02-28 01:57:57 +00:00
|
|
|
&orte_iof_base.iof_service,
|
2005-01-12 20:51:34 +00:00
|
|
|
&iov,
|
|
|
|
1,
|
2005-03-14 20:57:21 +00:00
|
|
|
ORTE_RML_TAG_IOF_SVC,
|
2005-01-12 20:51:34 +00:00
|
|
|
0);
|
|
|
|
if(rc < 0) {
|
2005-03-29 19:40:38 +00:00
|
|
|
ORTE_ERROR_LOG(rc);
|
2005-01-12 20:51:34 +00:00
|
|
|
return rc;
|
|
|
|
}
|
2006-02-12 01:33:29 +00:00
|
|
|
return ORTE_SUCCESS;
|
2005-01-12 20:51:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* Send an "unsubscribe" request to the svc component
|
2005-01-13 15:27:28 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
int orte_iof_proxy_svc_unsubscribe(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin_name,
|
|
|
|
orte_ns_cmp_bitmask_t origin_mask,
|
|
|
|
int origin_tag,
|
|
|
|
const orte_process_name_t* target_name,
|
|
|
|
orte_ns_cmp_bitmask_t target_mask,
|
|
|
|
int target_tag
|
2005-01-12 20:51:34 +00:00
|
|
|
)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_header_t hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
struct iovec iov;
|
|
|
|
int rc;
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
hdr.hdr_common.hdr_type = ORTE_IOF_BASE_HDR_UNSUB;
|
2006-08-23 03:32:36 +00:00
|
|
|
hdr.hdr_common.hdr_reserve = (uint8_t)0;
|
|
|
|
hdr.hdr_common.hdr_status = (int16_t)0;
|
2007-06-08 22:59:31 +00:00
|
|
|
hdr.hdr_sub.origin_name = *origin_name;
|
|
|
|
hdr.hdr_sub.origin_mask = origin_mask;
|
|
|
|
hdr.hdr_sub.origin_tag = origin_tag;
|
|
|
|
hdr.hdr_sub.target_name = *target_name;
|
|
|
|
hdr.hdr_sub.target_mask = target_mask;
|
|
|
|
hdr.hdr_sub.target_tag = target_tag;
|
|
|
|
ORTE_IOF_BASE_HDR_SUB_HTON(hdr.hdr_sub);
|
2005-01-12 20:51:34 +00:00
|
|
|
|
2006-08-23 03:32:36 +00:00
|
|
|
iov.iov_base = (IOVBASE_TYPE*)&hdr;
|
2005-01-12 20:51:34 +00:00
|
|
|
iov.iov_len = sizeof(hdr);
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
rc = orte_rml.send(
|
2008-02-28 01:57:57 +00:00
|
|
|
&orte_iof_base.iof_service,
|
2005-01-12 20:51:34 +00:00
|
|
|
&iov,
|
|
|
|
1,
|
2005-03-14 20:57:21 +00:00
|
|
|
ORTE_RML_TAG_IOF_SVC,
|
2005-01-12 20:51:34 +00:00
|
|
|
0);
|
|
|
|
if(rc < 0) {
|
2005-03-29 19:40:38 +00:00
|
|
|
ORTE_ERROR_LOG(rc);
|
2005-01-12 20:51:34 +00:00
|
|
|
return rc;
|
|
|
|
}
|
2006-02-12 01:33:29 +00:00
|
|
|
return ORTE_SUCCESS;
|
2005-01-12 20:51:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* Receive messages via the RML from the svc component.
|
2005-01-13 15:27:28 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
void orte_iof_proxy_svc_recv(
|
2005-01-12 20:51:34 +00:00
|
|
|
int status,
|
2007-06-08 22:59:31 +00:00
|
|
|
orte_process_name_t* origin,
|
2005-01-12 20:51:34 +00:00
|
|
|
struct iovec* msg,
|
|
|
|
int count,
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_rml_tag_t tag,
|
2005-01-12 20:51:34 +00:00
|
|
|
void* cbdata)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_header_t* hdr = (orte_iof_base_header_t*)msg->iov_base;
|
2005-03-29 19:40:38 +00:00
|
|
|
if(NULL == msg->iov_base) {
|
2008-06-09 14:53:58 +00:00
|
|
|
opal_output(orte_iof_base.iof_output,
|
2007-06-08 22:59:31 +00:00
|
|
|
"orte_iof_proxy_svc_recv: invalid message\n");
|
2005-03-29 19:40:38 +00:00
|
|
|
return;
|
|
|
|
}
|
2005-01-12 20:51:34 +00:00
|
|
|
|
2007-06-08 22:59:31 +00:00
|
|
|
/* We only receive 2 types of messages from the svc component:
|
|
|
|
|
|
|
|
- Messages: containing forwarded data intended to be consumed
|
|
|
|
by endpoints in this process either representing local fd's
|
|
|
|
or pipes to proxied processes (e.g., orted's fronting ORTE
|
|
|
|
processes)
|
|
|
|
|
|
|
|
- ACKs: acknowledging data sent from this process to the svc
|
|
|
|
component (which may have been forwarded on to other
|
|
|
|
processes).
|
|
|
|
*/
|
|
|
|
|
2005-01-12 20:51:34 +00:00
|
|
|
switch(hdr->hdr_common.hdr_type) {
|
2005-03-14 20:57:21 +00:00
|
|
|
case ORTE_IOF_BASE_HDR_MSG:
|
|
|
|
ORTE_IOF_BASE_HDR_MSG_NTOH(hdr->hdr_msg);
|
2007-06-08 22:59:31 +00:00
|
|
|
orte_iof_proxy_svc_msg(origin,&hdr->hdr_msg,(unsigned char*)(hdr+1));
|
2005-01-12 20:51:34 +00:00
|
|
|
break;
|
2005-03-14 20:57:21 +00:00
|
|
|
case ORTE_IOF_BASE_HDR_ACK:
|
|
|
|
ORTE_IOF_BASE_HDR_MSG_NTOH(hdr->hdr_msg);
|
2007-06-08 22:59:31 +00:00
|
|
|
orte_iof_proxy_svc_ack(origin,&hdr->hdr_msg);
|
2005-01-12 20:51:34 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
free(hdr);
|
2007-06-08 22:59:31 +00:00
|
|
|
|
|
|
|
/* reset the data in the RML receive */
|
2005-01-12 20:51:34 +00:00
|
|
|
mca_iof_proxy_component.proxy_iov[0].iov_base = NULL;
|
|
|
|
mca_iof_proxy_component.proxy_iov[0].iov_len = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2005-01-13 15:27:28 +00:00
|
|
|
/*
|
2007-06-08 22:59:31 +00:00
|
|
|
* The svc component has sent data to us that matches a tag that we
|
|
|
|
* must have previously published. Forward the data to the
|
|
|
|
* corresponding endpoint.
|
2005-01-13 15:27:28 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
static void orte_iof_proxy_svc_msg(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin,
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_msg_header_t* msg,
|
2005-01-12 20:51:34 +00:00
|
|
|
unsigned char* data)
|
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_endpoint_t* endpoint;
|
2007-06-08 22:59:31 +00:00
|
|
|
|
|
|
|
/* Look for the endpoint corresponding to the tag in the message.
|
|
|
|
If we don't find the endpoint, this means that we have already
|
|
|
|
unpublished the endpoint and this message must have already
|
|
|
|
been enroute to us when we unpublished. So just discard it. */
|
Bring over the update to terminate orteds that are generated by a dynamic spawn such as comm_spawn. This introduces the concept of a job "family" - i.e., jobs that have a parent/child relationship. Comm_spawn'ed jobs have a parent (the one that spawned them). We track that relationship throughout the lineage - i.e., if a comm_spawned job in turn calls comm_spawn, then it has a parent (the one that spawned it) and a "root" job (the original job that started things).
Accordingly, there are new APIs to the name service to support the ability to get a job's parent, root, immediate children, and all its descendants. In addition, the terminate_job, terminate_orted, and signal_job APIs for the PLS have been modified to accept attributes that define the extent of their actions. For example, doing a "terminate_job" with an attribute of ORTE_NS_INCLUDE_DESCENDANTS will terminate the given jobid AND all jobs that descended from it.
I have tested this capability on a MacBook under rsh, Odin under SLURM, and LANL's Flash (bproc). It worked successfully on non-MPI jobs (both simple and including a spawn), and MPI jobs (again, both simple and with a spawn).
This commit was SVN r12597.
2006-11-14 19:34:59 +00:00
|
|
|
endpoint = orte_iof_base_endpoint_match(ORTE_NAME_WILDCARD, ORTE_NS_CMP_NONE, msg->msg_tag);
|
2007-06-08 22:59:31 +00:00
|
|
|
if (NULL != endpoint) {
|
|
|
|
orte_iof_base_endpoint_forward(endpoint,origin,msg,data);
|
|
|
|
/* RELEASE the endpoint because endpoint_match() RETAINed it */
|
2005-01-12 20:51:34 +00:00
|
|
|
OBJ_RELEASE(endpoint);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-06-08 22:59:31 +00:00
|
|
|
/*
|
|
|
|
* The svc component has sent an ACK to us that matches a tag that we
|
|
|
|
* must have previously published. Forward the ACK to the
|
|
|
|
* corresponding endpoint.
|
2005-01-12 20:51:34 +00:00
|
|
|
*/
|
|
|
|
|
2005-03-14 20:57:21 +00:00
|
|
|
static void orte_iof_proxy_svc_ack(
|
2007-06-08 22:59:31 +00:00
|
|
|
const orte_process_name_t* origin,
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_msg_header_t* msg)
|
2005-01-12 20:51:34 +00:00
|
|
|
{
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_endpoint_t* endpoint;
|
2007-06-08 22:59:31 +00:00
|
|
|
/* Look for the endpoint corresponding to the tag in the ACK. If
|
|
|
|
we don't find the endpoint, this means that we have already
|
|
|
|
unpublished the endpoint and this ACK must have already been
|
|
|
|
enroute to us when we unpublished. So just discard it. */
|
|
|
|
endpoint = orte_iof_base_endpoint_match(&msg->msg_origin, ORTE_NS_CMP_ALL, msg->msg_tag);
|
2005-01-12 20:51:34 +00:00
|
|
|
if(endpoint != NULL) {
|
2005-03-14 20:57:21 +00:00
|
|
|
orte_iof_base_endpoint_ack(endpoint,msg->msg_seq + msg->msg_len);
|
2007-06-08 22:59:31 +00:00
|
|
|
/* RELEASE the endpoint because endpoint_match() RETAINed it */
|
2005-01-12 20:51:34 +00:00
|
|
|
OBJ_RELEASE(endpoint);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|