Skip to content

Commit e3dfe11

Browse files
committed
Btl tcp: Improving verbose around tcp
As part of improvement towards tcp btl we are improving verbose in general Signed-off-by: Mohan Gandhi <[email protected]>
1 parent 4bc7b21 commit e3dfe11

File tree

3 files changed

+116
-15
lines changed

3 files changed

+116
-15
lines changed

opal/mca/btl/tcp/btl_tcp_component.c

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -964,8 +964,13 @@ static int mca_btl_tcp_component_create_listen(uint16_t af_family)
964964
} else
965965
#endif
966966
{
967+
char str[16];
967968
mca_btl_tcp_component.tcp_listen_port = ((struct sockaddr_in*) &inaddr)->sin_port;
968969
mca_btl_tcp_component.tcp_listen_sd = sd;
970+
inet_ntop(AF_INET, &(((struct sockaddr_in*)&inaddr)->sin_addr), str, sizeof(str));
971+
opal_output_verbose(30, opal_btl_base_framework.framework_output,
972+
"btl:tcp: my listening v4 socket is %s:%u",
973+
str, ntohs(mca_btl_tcp_component.tcp_listen_port));
969974
}
970975

971976
/* setup listen backlog to maximum allowed by kernel */
@@ -1104,6 +1109,7 @@ static int mca_btl_tcp_component_exchange(void)
11041109
size_t current_addr = 0;
11051110

11061111
if(mca_btl_tcp_component.tcp_num_btls != 0) {
1112+
char ifn[32];
11071113
mca_btl_tcp_addr_t *addrs = (mca_btl_tcp_addr_t *)malloc(size);
11081114
memset(addrs, 0, size);
11091115

@@ -1121,6 +1127,9 @@ static int mca_btl_tcp_component_exchange(void)
11211127
continue;
11221128
}
11231129

1130+
opal_ifindextoname(index, ifn, sizeof(ifn));
1131+
opal_output_verbose(30, opal_btl_base_framework.framework_output,
1132+
"btl:tcp: examining interface %s", ifn);
11241133
if (OPAL_SUCCESS !=
11251134
opal_ifindextoaddr(index, (struct sockaddr*) &my_ss,
11261135
sizeof (my_ss))) {
@@ -1144,6 +1153,8 @@ static int mca_btl_tcp_component_exchange(void)
11441153
addrs[current_addr].addr_ifkindex =
11451154
opal_ifindextokindex (index);
11461155
current_addr++;
1156+
opal_output_verbose(30, opal_btl_base_framework.framework_output,
1157+
"btl:tcp: using ipv4 interface %s", ifn);
11471158
} else
11481159
#endif
11491160
if ((AF_INET == my_ss.ss_family) &&
@@ -1382,38 +1393,76 @@ static void mca_btl_tcp_component_recv_handler(int sd, short flags, void* user)
13821393
/* recv the process identifier */
13831394
retval = mca_btl_tcp_recv_blocking(sd, (char *)&guid, sizeof(guid));
13841395
if(retval != sizeof(guid)) {
1396+
opal_show_help("help-mpi-btl-tcp.txt", "server did not get guid",
1397+
true, opal_process_info.nodename,
1398+
getpid());
13851399
CLOSE_THE_SOCKET(sd);
13861400
return;
13871401
}
13881402
OPAL_PROCESS_NAME_NTOH(guid);
13891403

13901404
/* now set socket up to be non-blocking */
13911405
if((flags = fcntl(sd, F_GETFL, 0)) < 0) {
1392-
BTL_ERROR(("fcntl(F_GETFL) failed: %s (%d)",
1393-
strerror(opal_socket_errno), opal_socket_errno));
1406+
opal_show_help("help-mpi-btl-tcp.txt", "socket flag fail",
1407+
true, opal_process_info.nodename,
1408+
getpid(), "fcntl(sd, F_GETFL, 0)",
1409+
strerror(opal_socket_errno), opal_socket_errno);
1410+
CLOSE_THE_SOCKET(sd);
13941411
} else {
13951412
flags |= O_NONBLOCK;
13961413
if(fcntl(sd, F_SETFL, flags) < 0) {
1397-
BTL_ERROR(("fcntl(F_SETFL) failed: %s (%d)",
1398-
strerror(opal_socket_errno), opal_socket_errno));
1414+
opal_show_help("help-mpi-btl-tcp.txt", "socket flag fail",
1415+
true, opal_process_info.nodename,
1416+
getpid(),
1417+
"fcntl(sd, F_SETFL, flags & O_NONBLOCK)",
1418+
strerror(opal_socket_errno), opal_socket_errno);
1419+
CLOSE_THE_SOCKET(sd);
13991420
}
14001421
}
14011422

14021423
/* lookup the corresponding process */
14031424
btl_proc = mca_btl_tcp_proc_lookup(&guid);
14041425
if(NULL == btl_proc) {
1426+
opal_show_help("help-mpi-btl-tcp.txt",
1427+
"server accept cannot find guid",
1428+
true, opal_process_info.nodename,
1429+
getpid());
14051430
CLOSE_THE_SOCKET(sd);
14061431
return;
14071432
}
14081433

14091434
/* lookup peer address */
14101435
if(getpeername(sd, (struct sockaddr*)&addr, &addr_len) != 0) {
1411-
BTL_ERROR(("getpeername() failed: %s (%d)",
1412-
strerror(opal_socket_errno), opal_socket_errno));
1436+
opal_show_help("help-mpi-btl-tcp.txt",
1437+
"server getpeername failed",
1438+
true, opal_process_info.nodename,
1439+
getpid(),
1440+
strerror(opal_socket_errno), opal_socket_errno);
14131441
CLOSE_THE_SOCKET(sd);
14141442
return;
14151443
}
14161444

14171445
/* are there any existing peer instances willing to accept this connection */
14181446
(void)mca_btl_tcp_proc_accept(btl_proc, (struct sockaddr*)&addr, sd);
1447+
1448+
switch (addr.ss_family) {
1449+
case AF_INET:
1450+
inet_ntop(AF_INET, &(((struct sockaddr_in*) &addr)->sin_addr), str, sizeof(str));
1451+
break;
1452+
1453+
#if OPAL_ENABLE_IPV6
1454+
case AF_INET6:
1455+
inet_ntop(AF_INET6, &(((struct sockaddr_in6*) &addr)->sin6_addr), str, sizeof(str));
1456+
break;
1457+
#endif
1458+
1459+
default:
1460+
BTL_ERROR(("Got an accept() from an unknown address family -- this shouldn't happen"));
1461+
CLOSE_THE_SOCKET(sd);
1462+
return;
1463+
1464+
}
1465+
opal_output_verbose(10, opal_btl_base_framework.framework_output,
1466+
"btl:tcp: now connected to %s, process %s", str,
1467+
OPAL_NAME_PRINT(btl_proc->proc_opal->proc_name));
14191468
}

opal/mca/btl/tcp/btl_tcp_endpoint.c

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,11 @@ static int mca_btl_tcp_endpoint_send_connect_ack(mca_btl_base_endpoint_t* btl_en
416416

417417
/* send process identifier to remote endpoint */
418418
OPAL_PROCESS_NAME_HTON(guid);
419-
if(mca_btl_tcp_endpoint_send_blocking(btl_endpoint, &guid, sizeof(guid)) !=
420-
sizeof(guid)) {
419+
if(mca_btl_tcp_endpoint_send_blocking(btl_endpoint, &guid, sizeof(guid)) != sizeof(guid)) {
420+
opal_show_help("help-mpi-btl-tcp.txt", "client handshake fail",
421+
true, opal_process_info.nodename,
422+
getpid(),
423+
"sending connect ACK failed");
421424
return OPAL_ERR_UNREACH;
422425
}
423426
return OPAL_SUCCESS;
@@ -743,13 +746,18 @@ static int mca_btl_tcp_endpoint_start_connect(mca_btl_base_endpoint_t* btl_endpo
743746
/* start the connect - will likely fail with EINPROGRESS */
744747
mca_btl_tcp_proc_tosocks(btl_endpoint->endpoint_addr, &endpoint_addr);
745748

746-
opal_output_verbose(20, opal_btl_base_framework.framework_output,
749+
opal_output_verbose(10, opal_btl_base_framework.framework_output,
747750
"btl: tcp: attempting to connect() to %s address %s on port %d",
748751
OPAL_NAME_PRINT(btl_endpoint->endpoint_proc->proc_opal->proc_name),
749752
opal_net_get_hostname((struct sockaddr*) &endpoint_addr),
750753
ntohs(btl_endpoint->endpoint_addr->addr_port));
751754

752755
if(0 == connect(btl_endpoint->endpoint_sd, (struct sockaddr*)&endpoint_addr, addrlen)) {
756+
opal_output_verbose(10, opal_btl_base_framework.framework_output,
757+
"btl:tcp: connect() to %s:%d completed",
758+
opal_net_get_hostname((struct sockaddr*) &endpoint_addr),
759+
ntohs(((struct sockaddr_in*) &endpoint_addr)->sin_port));
760+
753761
/* send our globally unique process identifier to the endpoint */
754762
if((rc = mca_btl_tcp_endpoint_send_connect_ack(btl_endpoint)) == OPAL_SUCCESS) {
755763
btl_endpoint->endpoint_state = MCA_BTL_TCP_CONNECT_ACK;
@@ -765,6 +773,8 @@ static int mca_btl_tcp_endpoint_start_connect(mca_btl_base_endpoint_t* btl_endpo
765773
btl_endpoint->endpoint_state = MCA_BTL_TCP_CONNECTING;
766774
MCA_BTL_TCP_ENDPOINT_DUMP(10, btl_endpoint, true, "event_add(send) [start_connect]");
767775
MCA_BTL_TCP_ACTIVATE_EVENT(&btl_endpoint->endpoint_send_event, 0);
776+
opal_output_verbose(30, opal_btl_base_framework.framework_output,
777+
"btl:tcp: would block, so allowing background progress");
768778
return OPAL_SUCCESS;
769779
}
770780
}
@@ -895,6 +905,25 @@ static void mca_btl_tcp_endpoint_recv_handler(int sd, short flags, void* user)
895905
OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_send_lock);
896906
MCA_BTL_TCP_ENDPOINT_DUMP(10, btl_endpoint, true, "connected");
897907
}
908+
else if (OPAL_ERR_BAD_PARAM == rc) {
909+
/* If we get a BAD_PARAM, it means that it probably wasn't
910+
an OMPI process on the other end of the socket (e.g.,
911+
the magic string ID failed). So we can probably just
912+
close the socket and ignore this connection. */
913+
CLOSE_THE_SOCKET(sd);
914+
}
915+
else {
916+
/* Otherwise, it probably *was* an OMPI peer process on
917+
the other end, and something bad has probably
918+
happened. */
919+
mca_btl_tcp_module_t *m = btl_endpoint->endpoint_btl;
920+
/* Fail up to the PML */
921+
if (NULL != m->tcp_error_cb) {
922+
m->tcp_error_cb((mca_btl_base_module_t*) m, MCA_BTL_ERROR_FLAGS_FATAL,
923+
btl_endpoint->endpoint_proc->proc_opal,
924+
"TCP ACK is neither SUCCESS nor ERR (something bad has probably happened)");
925+
}
926+
}
898927
OPAL_THREAD_UNLOCK(&btl_endpoint->endpoint_recv_lock);
899928
return;
900929
}
@@ -983,7 +1012,9 @@ static void mca_btl_tcp_endpoint_send_handler(int sd, short flags, void* user)
9831012

9841013
switch(btl_endpoint->endpoint_state) {
9851014
case MCA_BTL_TCP_CONNECTING:
986-
mca_btl_tcp_endpoint_complete_connect(btl_endpoint);
1015+
if (OPAL_SUCCESS != mca_btl_tcp_endpoint_complete_connect(btl_endpoint)) {
1016+
mca_btl_tcp_module_t *m = btl_endpoint->endpoint_btl;
1017+
}
9871018
break;
9881019
case MCA_BTL_TCP_CONNECTED:
9891020
/* complete the current send */

opal/mca/btl/tcp/btl_tcp_proc.c

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -509,10 +509,7 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
509509
default:
510510
opal_output(0, "unknown address family for tcp: %d\n",
511511
endpoint_addr_ss.ss_family);
512-
/*
513-
* return OPAL_UNREACH or some error, as this is not
514-
* good
515-
*/
512+
return OPAL_ERR_UNREACH;
516513
}
517514
}
518515

@@ -554,14 +551,26 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
554551
if(NULL != proc_data->local_interfaces[i]->ipv4_address &&
555552
NULL != peer_interfaces[j]->ipv4_address) {
556553

554+
/* Convert the IPv4 addresses into nicely-printable strings for verbose debugging output */
555+
inet_ntop(AF_INET, &(((struct sockaddr_in*) proc_data->local_interfaces[i]->ipv4_address))->sin_addr,
556+
str_local, sizeof(str_local));
557+
inet_ntop(AF_INET, &(((struct sockaddr_in*) peer_interfaces[j]->ipv4_address))->sin_addr,
558+
str_remote, sizeof(str_remote));
559+
557560
if(opal_net_addr_isipv4public((struct sockaddr*) local_interface->ipv4_address) &&
558561
opal_net_addr_isipv4public((struct sockaddr*) peer_interfaces[j]->ipv4_address)) {
559562
if(opal_net_samenetwork((struct sockaddr*) local_interface->ipv4_address,
560563
(struct sockaddr*) peer_interfaces[j]->ipv4_address,
561564
local_interface->ipv4_netmask)) {
562565
proc_data->weights[i][j] = CQ_PUBLIC_SAME_NETWORK;
566+
opal_output_verbose(20, opal_btl_base_framework.framework_output,
567+
"btl:tcp: path from %s to %s: IPV4 PUBLIC SAME NETWORK",
568+
str_local, str_remote);
563569
} else {
564570
proc_data->weights[i][j] = CQ_PUBLIC_DIFFERENT_NETWORK;
571+
opal_output_verbose(20, opal_btl_base_framework.framework_output,
572+
"btl:tcp: path from %s to %s: IPV4 PUBLIC DIFFERENT NETWORK",
573+
str_local, str_remote);
565574
}
566575
proc_data->best_addr[i][j] = peer_interfaces[j]->ipv4_endpoint_addr;
567576
continue;
@@ -570,8 +579,14 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
570579
(struct sockaddr*) peer_interfaces[j]->ipv4_address,
571580
local_interface->ipv4_netmask)) {
572581
proc_data->weights[i][j] = CQ_PRIVATE_SAME_NETWORK;
582+
opal_output_verbose(20, opal_btl_base_framework.framework_output,
583+
"btl:tcp: path from %s to %s: IPV4 PRIVATE SAME NETWORK",
584+
str_local, str_remote);
573585
} else {
574586
proc_data->weights[i][j] = CQ_PRIVATE_DIFFERENT_NETWORK;
587+
opal_output_verbose(20, opal_btl_base_framework.framework_output,
588+
"btl:tcp: path from %s to %s: IPV4 PRIVATE DIFFERENT NETWORK",
589+
str_local, str_remote);
575590
}
576591
proc_data->best_addr[i][j] = peer_interfaces[j]->ipv4_endpoint_addr;
577592
continue;
@@ -673,6 +688,12 @@ int mca_btl_tcp_proc_insert( mca_btl_tcp_proc_t* btl_proc,
673688
rc = OPAL_SUCCESS;
674689
}
675690
}
691+
if (OPAL_ERR_UNREACH == rc) {
692+
opal_output_verbose(10, opal_btl_base_framework.framework_output,
693+
"btl:tcp: host %s, process %s UNREACHABLE",
694+
proc_hostname,
695+
OPAL_NAME_PRINT(btl_proc->proc_opal->proc_name));
696+
}
676697

677698
for(i = 0; i < perm_size; ++i) {
678699
free(proc_data->weights[i]);
@@ -729,7 +750,7 @@ int mca_btl_tcp_proc_remove(mca_btl_tcp_proc_t* btl_proc, mca_btl_base_endpoint_
729750
OBJ_RELEASE(btl_proc);
730751
return OPAL_SUCCESS;
731752
}
732-
/* The endpoint_addr may still be NULL if this enpoint is
753+
/* The endpoint_addr may still be NULL if this endpoint is
733754
being removed early in the wireup sequence (e.g., if it
734755
is unreachable by all other procs) */
735756
if (NULL != btl_endpoint->endpoint_addr) {

0 commit comments

Comments
 (0)