emrekultursay created this revision. Herald added subscribers: lldb-commits, mgrang. Herald added a project: LLDB.
When connecting to Android, LLDB calls adb#Shell 5 times. At each call, a TCP connection to "localhost:port" needs to be established. On hosts that support IPv4 and IPv6, the "localhost" host can map to two addresses. It seems like IPv6 typically becomes the addresses[0], and then trying to connect to it gets rejected (WSAECONNREFUSED), and then the IPv4 one at addresses[1] succeeds. Trying to connect to IPv6 first wastes up to 2 seconds per call on Windows. The adb CLI client also uses an IPv4-first approach. On Windows, this CL brings total of ~10 second improvement in LLDB attach latency to Android devices. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D79757 Files: lldb/source/Host/common/TCPSocket.cpp Index: lldb/source/Host/common/TCPSocket.cpp =================================================================== --- lldb/source/Host/common/TCPSocket.cpp +++ lldb/source/Host/common/TCPSocket.cpp @@ -162,6 +162,12 @@ std::vector<SocketAddress> addresses = SocketAddress::GetAddressInfo( host_str.c_str(), nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); + // IPv4 is more likely to succeed than IPv6. To avoid costly retries, + // we sort based on family to prioritize IPv4 over IPv6. + std::sort(addresses.begin(), addresses.end(), + [](SocketAddress a, SocketAddress b) { + return a.GetFamily() < b.GetFamily(); + }); for (SocketAddress &address : addresses) { error = CreateSocket(address.GetFamily()); if (error.Fail())
Index: lldb/source/Host/common/TCPSocket.cpp =================================================================== --- lldb/source/Host/common/TCPSocket.cpp +++ lldb/source/Host/common/TCPSocket.cpp @@ -162,6 +162,12 @@ std::vector<SocketAddress> addresses = SocketAddress::GetAddressInfo( host_str.c_str(), nullptr, AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP); + // IPv4 is more likely to succeed than IPv6. To avoid costly retries, + // we sort based on family to prioritize IPv4 over IPv6. + std::sort(addresses.begin(), addresses.end(), + [](SocketAddress a, SocketAddress b) { + return a.GetFamily() < b.GetFamily(); + }); for (SocketAddress &address : addresses) { error = CreateSocket(address.GetFamily()); if (error.Fail())
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits