From 14a57d9b5f2c99f11b36c8b0bc2271f1259e5fef Mon Sep 17 00:00:00 2001 From: Ganlin Zhao Date: Fri, 11 Nov 2022 15:30:34 +0800 Subject: [PATCH] fix: set connect socket to unblocking call with timeout TS-2020 --- deps/jemalloc | 2 +- src/connector/go | 2 +- src/connector/hivemq-tdengine-extension | 2 +- src/kit/taos-tools | 2 +- src/plugins/taosadapter | 2 +- src/util/src/tsocket.c | 37 +++++++++++++++++++++++++ 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/deps/jemalloc b/deps/jemalloc index ea6b3e973b..54eaed1d8b 160000 --- a/deps/jemalloc +++ b/deps/jemalloc @@ -1 +1 @@ -Subproject commit ea6b3e973b477b8061e0076bb257dbd7f3faa756 +Subproject commit 54eaed1d8b56b1aa528be3bdd1877e59c56fa90c diff --git a/src/connector/go b/src/connector/go index 7da3cc9e4a..5afdb16902 160000 --- a/src/connector/go +++ b/src/connector/go @@ -1 +1 @@ -Subproject commit 7da3cc9e4ad1030c2eec250b869a8fa215b4a4b4 +Subproject commit 5afdb16902d507064deb79a5c0b87d7c9ef6ff3d diff --git a/src/connector/hivemq-tdengine-extension b/src/connector/hivemq-tdengine-extension index 82fae157e2..af97c27502 160000 --- a/src/connector/hivemq-tdengine-extension +++ b/src/connector/hivemq-tdengine-extension @@ -1 +1 @@ -Subproject commit 82fae157e23f0fb1b05d9e4664c842bc5c8211b8 +Subproject commit af97c27502269351dc9b5119c882720788f69687 diff --git a/src/kit/taos-tools b/src/kit/taos-tools index 23e2b73fb2..a80b1a7c6a 160000 --- a/src/kit/taos-tools +++ b/src/kit/taos-tools @@ -1 +1 @@ -Subproject commit 23e2b73fb2fba1a718f31c95513dbabeed21220a +Subproject commit a80b1a7c6a741502988a0930d40fa82bddd39346 diff --git a/src/plugins/taosadapter b/src/plugins/taosadapter index 1794a8019c..ac79ade213 160000 --- a/src/plugins/taosadapter +++ b/src/plugins/taosadapter @@ -1 +1 @@ -Subproject commit 1794a8019c1fa3e601e2c89b64582c8fdc59a27f +Subproject commit ac79ade213e8efd2c699560625ca0eaee116cef1 diff --git a/src/util/src/tsocket.c b/src/util/src/tsocket.c index 19c72d2e0b..0fbd68d4aa 100644 --- a/src/util/src/tsocket.c +++ b/src/util/src/tsocket.c @@ -386,7 +386,44 @@ SOCKET taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t clie } } taosSetNonblocking(sockFd, 0); +#elif _TD_WINDOWS + taosSetNonblocking(sockFd, 1); + ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); + if (ret == -1) { + if (errno == EHOSTUNREACH) { + uError("failed to connect socket, ip:0x%x, port:%hu(%s)", destIp, destPort, strerror(errno)); + taosCloseSocket(sockFd); + return -1; + } else if (errno == EINPROGRESS || errno == EAGAIN || errno == EWOULDBLOCK) { + timeval timeout; + fd_set set; + + timeout.tv_sec = 0; + timeout.tv_usec = tsTcpConnTimeout * 1000; + FD_ZERO(&set); + FD_SET(sockFd, &set); + + if (select(sockFd + 1, NULL, &set, NULL, &timeout) <= 0) { + uError("failed to connect socket, ip:0x%x, port:%hu(poll error/conn timeout)", destIp, destPort); + taosCloseSocket(sockFd); // + return -1; + } + + int optVal = -1, optLen = sizeof(int); + if ((0 != taosGetSockOpt(sockFd, SOL_SOCKET, SO_ERROR, &optVal, &optLen)) || (optVal != 0)) { + uError("failed to connect socket, ip:0x%x, port:%hu(connect host error)", destIp, destPort); + taosCloseSocket(sockFd); // + return -1; + } + ret = 0; + } else { + uError("failed to connect socket, ip:0x%x, port:%hu(target host cannot be reached)", destIp, destPort); + taosCloseSocket(sockFd); // + return -1; + } + } + taosSetNonblocking(sockFd, 0); #else ret = connect(sockFd, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); #endif -- GitLab