Skip to content

Commit b7be644

Browse files
committed
Revert "Revert "Handle error cases in TCP BTL""
This reverts commit 5162011. Signed-off-by: Aurelien Bouteiller <[email protected]>
1 parent 69bd54c commit b7be644

File tree

3 files changed

+42
-12
lines changed

3 files changed

+42
-12
lines changed

opal/mca/btl/tcp/btl_tcp.c

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* Copyright (c) 2004-2007 The Trustees of Indiana University and Indiana
44
* University Research and Technology
55
* Corporation. All rights reserved.
6-
* Copyright (c) 2004-2014 The University of Tennessee and The University
6+
* Copyright (c) 2004-2017 The University of Tennessee and The University
77
* of Tennessee Research Foundation. All rights
88
* reserved.
99
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -38,6 +38,8 @@
3838
#include "btl_tcp_proc.h"
3939
#include "btl_tcp_endpoint.h"
4040

41+
static int mca_btl_tcp_register_error_cb(struct mca_btl_base_module_t* btl,
42+
mca_btl_base_module_error_cb_fn_t cbfunc);
4143

4244
mca_btl_tcp_module_t mca_btl_tcp_module = {
4345
.super = {
@@ -51,11 +53,20 @@ mca_btl_tcp_module_t mca_btl_tcp_module = {
5153
.btl_send = mca_btl_tcp_send,
5254
.btl_put = mca_btl_tcp_put,
5355
.btl_dump = mca_btl_base_dump,
56+
.btl_register_error = mca_btl_tcp_register_error_cb, /* register error */
5457
.btl_ft_event = mca_btl_tcp_ft_event
5558
},
5659
.tcp_endpoints_mutex = OPAL_MUTEX_STATIC_INIT
5760
};
5861

62+
static int mca_btl_tcp_register_error_cb(struct mca_btl_base_module_t* btl,
63+
mca_btl_base_module_error_cb_fn_t cbfunc)
64+
{
65+
mca_btl_tcp_module_t* tcp_btl = (mca_btl_tcp_module_t*)btl;
66+
tcp_btl->tcp_error_cb = cbfunc;
67+
return OPAL_SUCCESS;
68+
}
69+
5970
/**
6071
*
6172
*/

opal/mca/btl/tcp/btl_tcp_endpoint.c

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
33
* University Research and Technology
44
* Corporation. All rights reserved.
5-
* Copyright (c) 2004-2016 The University of Tennessee and The University
5+
* Copyright (c) 2004-2017 The University of Tennessee and The University
66
* of Tennessee Research Foundation. All rights
77
* reserved.
88
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
@@ -388,6 +388,7 @@ mca_btl_tcp_endpoint_send_blocking(mca_btl_base_endpoint_t* btl_endpoint,
388388
{
389389
int ret = mca_btl_tcp_send_blocking(btl_endpoint->endpoint_sd, data, size);
390390
if (ret < 0) {
391+
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
391392
mca_btl_tcp_endpoint_close(btl_endpoint);
392393
}
393394
return ret;
@@ -538,20 +539,30 @@ void mca_btl_tcp_endpoint_close(mca_btl_base_endpoint_t* btl_endpoint)
538539
btl_endpoint->endpoint_sd = -1;
539540
/**
540541
* If we keep failing to connect to the peer let the caller know about
541-
* this situation by triggering all the pending fragments callback and
542-
* reporting the error.
542+
* this situation by triggering the callback on all pending fragments and
543+
* reporting the error. The upper layer has then the opportunity to
544+
* re-route or re-schedule the fragments.
543545
*/
544546
if( MCA_BTL_TCP_FAILED == btl_endpoint->endpoint_state ) {
545547
mca_btl_tcp_frag_t* frag = btl_endpoint->endpoint_send_frag;
546548
if( NULL == frag )
547549
frag = (mca_btl_tcp_frag_t*)opal_list_remove_first(&btl_endpoint->endpoint_frags);
548550
while(NULL != frag) {
549551
frag->base.des_cbfunc(&frag->btl->super, frag->endpoint, &frag->base, OPAL_ERR_UNREACH);
550-
552+
if( frag->base.des_flags & MCA_BTL_DES_FLAGS_BTL_OWNERSHIP ) {
553+
MCA_BTL_TCP_FRAG_RETURN(frag);
554+
}
551555
frag = (mca_btl_tcp_frag_t*)opal_list_remove_first(&btl_endpoint->endpoint_frags);
552556
}
557+
btl_endpoint->endpoint_send_frag = NULL;
558+
/* Let's report the error upstream */
559+
if(NULL != btl_endpoint->endpoint_btl->tcp_error_cb) {
560+
btl_endpoint->endpoint_btl->tcp_error_cb((mca_btl_base_module_t*)btl_endpoint->endpoint_btl, 0,
561+
btl_endpoint->endpoint_proc->proc_opal, "Socket closed");
562+
}
563+
} else {
564+
btl_endpoint->endpoint_state = MCA_BTL_TCP_CLOSED;
553565
}
554-
btl_endpoint->endpoint_state = MCA_BTL_TCP_CLOSED;
555566
}
556567

557568
/*
@@ -608,7 +619,6 @@ static int mca_btl_tcp_endpoint_recv_connect_ack(mca_btl_base_endpoint_t* btl_en
608619
opal_show_help("help-mpi-btl-tcp.txt", "client handshake fail",
609620
true, opal_process_info.nodename,
610621
getpid(), "did not receive entire connect ACK from peer");
611-
612622
return OPAL_ERR_BAD_PARAM;
613623
}
614624
if (0 != strncmp(hs_msg.magic_id, mca_btl_tcp_magic_id_string, len)) {
@@ -628,6 +638,7 @@ static int mca_btl_tcp_endpoint_recv_connect_ack(mca_btl_base_endpoint_t* btl_en
628638
if (0 != opal_compare_proc(btl_proc->proc_opal->proc_name, guid)) {
629639
BTL_ERROR(("received unexpected process identifier %s",
630640
OPAL_NAME_PRINT(guid)));
641+
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
631642
mca_btl_tcp_endpoint_close(btl_endpoint);
632643
return OPAL_ERR_UNREACH;
633644
}
@@ -834,6 +845,7 @@ static int mca_btl_tcp_endpoint_complete_connect(mca_btl_base_endpoint_t* btl_en
834845
opal_net_get_hostname((struct sockaddr*) &endpoint_addr),
835846
((struct sockaddr_in*) &endpoint_addr)->sin_port,
836847
strerror(opal_socket_errno), opal_socket_errno));
848+
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
837849
mca_btl_tcp_endpoint_close(btl_endpoint);
838850
return OPAL_ERROR;
839851
}
@@ -850,6 +862,7 @@ static int mca_btl_tcp_endpoint_complete_connect(mca_btl_base_endpoint_t* btl_en
850862
getpid(), msg,
851863
strerror(so_error), so_error);
852864
free(msg);
865+
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
853866
mca_btl_tcp_endpoint_close(btl_endpoint);
854867
return OPAL_ERROR;
855868
}
@@ -921,12 +934,15 @@ static void mca_btl_tcp_endpoint_recv_handler(int sd, short flags, void* user)
921934
OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock);
922935
MCA_BTL_TCP_ENDPOINT_DUMP(10, btl_endpoint, true, "connected");
923936
}
924-
else if (OPAL_ERR_BAD_PARAM == rc) {
937+
else if (OPAL_ERR_BAD_PARAM == rc
938+
|| OPAL_ERROR == rc) {
925939
/* If we get a BAD_PARAM, it means that it probably wasn't
926940
an OMPI process on the other end of the socket (e.g.,
927-
the magic string ID failed). So we can probably just
928-
close the socket and ignore this connection. */
929-
CLOSE_THE_SOCKET(sd);
941+
the magic string ID failed). recv_connect_ack already cleaned
942+
up the socket. */
943+
/* If we get OPAL_ERROR, the other end closed the connection
944+
* because it has initiated a symetrical connexion on its end.
945+
* recv_connect_ack already cleaned up the socket. */
930946
}
931947
else {
932948
/* Otherwise, it probably *was* an OMPI peer process on
@@ -1065,6 +1081,8 @@ static void mca_btl_tcp_endpoint_send_handler(int sd, short flags, void* user)
10651081
opal_event_del(&btl_endpoint->endpoint_send_event);
10661082
}
10671083
break;
1084+
case MCA_BTL_TCP_FAILED:
1085+
break;
10681086
default:
10691087
BTL_ERROR(("invalid connection state (%d)", btl_endpoint->endpoint_state));
10701088
MCA_BTL_TCP_ENDPOINT_DUMP(1, btl_endpoint, true, "event_del(send) [endpoint_send_handler:error]");

opal/mca/btl/tcp/btl_tcp_frag.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,8 @@ bool mca_btl_tcp_frag_recv(mca_btl_tcp_frag_t* frag, int sd)
212212
cnt = readv(sd, frag->iov_ptr, num_vecs);
213213
if( 0 < cnt ) goto advance_iov_position;
214214
if( cnt == 0 ) {
215-
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
215+
if(MCA_BTL_TCP_CONNECTED == btl_endpoint->endpoint_state)
216+
btl_endpoint->endpoint_state = MCA_BTL_TCP_FAILED;
216217
mca_btl_tcp_endpoint_close(btl_endpoint);
217218
return false;
218219
}

0 commit comments

Comments
 (0)