From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng2.m.smailru.net (smtpng2.m.smailru.net [94.100.179.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 28A8D46971A for ; Tue, 10 Dec 2019 19:25:12 +0300 (MSK) Content-Type: text/plain; charset=utf-8 Mime-Version: 1.0 (Mac OS X Mail 13.0 \(3594.4.19\)) From: Roman Khabibov In-Reply-To: <20191208194800.b6oiyzy3zx23mv4h@tkn_work_nb> Date: Tue, 10 Dec 2019 19:25:11 +0300 Content-Transfer-Encoding: quoted-printable Message-Id: <35E941DB-8252-478B-80C2-592FFAA6011E@tarantool.org> References: <20190709080407.sv5quzrxpbnijwp4@tkn_work_nb> <20190723123954.dgtfsetqlmjhued3@tkn_work_nb> <704142F3-802F-4C1C-8FA2-6155BFF9A951@tarantool.org> <20190829004547.k24fktai33tlbl73@tkn_work_nb> <868EAF2C-A491-46C9-AD37-7512D6CAB213@tarantool.org> <20190906134509.egjpa2vxfdolkeme@tkn_work_nb> <20191101143929.7gv53nqgscwpbayv@tkn_work_nb> <0D96FEEE-3814-4C90-980F-723A837F8157@tarantool.org> <20191208194800.b6oiyzy3zx23mv4h@tkn_work_nb> Subject: Re: [Tarantool-patches] [tarantool-patches] [server-dev] Re: Re: [PATCH v2 1/2] lua: return getaddrinfo() errors List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Alexander Turenko Cc: tarantool-patches@dev.tarantool.org > On Dec 8, 2019, at 22:48, Alexander Turenko = wrote: >=20 > I didn't find where to comment args validation patch, so I'll comment = it > here: >=20 > It changes socket.connect() (part of Lua Socket API), but does not > change luasocket_master:connect() (part of Lua Socket API too) and > does not change socket.tcp_connect() (our native function). >=20 > The same: socket.bind() (Lua Socket API) was changed, but > luasocket_master:bind() (Lua Socket API) was not. Our native > socket.tcp_server() was not changed too. >=20 > That's all looks strange. Let's extract this patch and either drop it = or > bring it to an acceptable state and send separately from this = patchset. Dropped. > ---- >=20 >>> `socket_object:connect` is not valid Lua syntax. It is better to = write >>> it as socket_object:connect() or socket_object.connect. >>>=20 >>> net.box API also was changed. >>=20 >> net.box=E2=80=99s .connect() returns error as second return value. = Now, it can return >> tcp_connect()=E2=80=99s errors (getaddrinfo). Don=E2=80=99t think, we = should note this in the >> net.box doc. >=20 > I see now, the API is not changed, only connection.error message. >=20 >>>> Connect to a remote host using tcp_connect() within. If it is no >>>> error, return a socket object. >>>=20 >>> It is hard to understood w/o a context. Please, either describe API >>> changes formally or give an example that will show the API change. >> In the commit message. >=20 > See the comment below. >=20 >>>> diff --git a/src/lua/socket.lua b/src/lua/socket.lua >>>> index a334ad45b..e4815adbb 100644 >>>> --- a/src/lua/socket.lua >>>> +++ b/src/lua/socket.lua >>>> @@ -1041,9 +1041,12 @@ local function tcp_connect(host, port, = timeout) >>>> end >>>> local timeout =3D timeout or TIMEOUT_INFINITY >>>> local stop =3D fiber.clock() + timeout >>>> - local dns =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', >>>> + local dns, err =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', >>>> protocol =3D 'tcp' }) >>>> - if dns =3D=3D nil or #dns =3D=3D 0 then >>>> + if dns =3D=3D nil then >>>> + return nil, err >>>> + end >>>> + if #dns =3D=3D 0 then >>>> boxerrno(boxerrno.EINVAL) >>>> return nil >>>> end >>>=20 >>> Cited to link from below. >>>=20 >>>> @@ -1360,9 +1363,16 @@ local function lsocket_tcp_connect(self, = host, port) >>>> -- This function is broken by design >>>> local ga_opts =3D { family =3D 'AF_INET', type =3D 'SOCK_STREAM' = } >>>> local timeout =3D deadline - fiber.clock() >>>> - local dns =3D getaddrinfo(host, port, timeout, ga_opts) >>>> + local dns, err =3D getaddrinfo(host, port, timeout, ga_opts) >>>> if dns =3D=3D nil or #dns =3D=3D 0 then >>>> - self._errno =3D boxerrno.EINVAL >>>> + return nil, err >>>> + end >>>> + if dns =3D=3D nil then >>>> + boxerrno(self._errno) >>>> + return nil, err >>>> + end >>>> + if #dns =3D=3D 0 then >>>> + boxerrno(self._errno) >>>> return nil, socket_error(self) >>>> end >>>=20 >>> We'll never reach the last two if's bodies. However the similar = fragment >>> above in tcp_connect() was changed in the right way. >>=20 >> @@ -1360,9 +1363,12 @@ local function lsocket_tcp_connect(self, host, = port) >> -- This function is broken by design >> local ga_opts =3D { family =3D 'AF_INET', type =3D 'SOCK_STREAM' = } >> local timeout =3D deadline - fiber.clock() >> - local dns =3D getaddrinfo(host, port, timeout, ga_opts) >> - if dns =3D=3D nil or #dns =3D=3D 0 then >> - self._errno =3D boxerrno.EINVAL >> + local dns, err =3D getaddrinfo(host, port, timeout, ga_opts) >> + if dns =3D=3D nil then >> + return nil, err >> + end >> + if #dns =3D=3D 0 then >> + boxerrno(self._errno) >> return nil, socket_error(self) >> end >> for _, remote in ipairs(dns) do >=20 > EINVAL here is changed to self._errno, which is always `nil` at least > for typical usage of lua socket: `s =3D socket.tcp()`, then = `s:connect()`. >=20 > Let's keep the old behaviour (EINVAL) when getaddrinfo() returns zero > amount of addresses. >=20 > RFC 2553 ('Basic Socket Interface Extensions for IPv6') states: >=20 > | Upon successful return a pointer to a linked list of one or more > | addrinfo structures is returned through the final argument. >=20 > RFC 3493 ('Basic Socket Interface Extensions for IPv6') states the = same, > but more explicitly: >=20 > | Upon successful return of getaddrinfo(), the location to which res > | points shall refer to a linked list of addrinfo structures, each of > | which shall specify a socket address and information for use in > | creating a socket with which to use that socket address. The list > | shall include at least one addrinfo structure. >=20 > So this situation should not occur. But anyway we should not miss to = set > a certain errno in the case at least for consistency with = tcp_connect(). >=20 > Also I think that we should set errno to EINVAL when getaddrinfo() = fails > to keep the code backward compatible: say, a user lean on this value > when tcp_connect() / :connect() returns `nil`. I understand so: diff --git a/src/lua/socket.lua b/src/lua/socket.lua index a334ad45b..6c829a11c 100644 --- a/src/lua/socket.lua +++ b/src/lua/socket.lua @@ -995,7 +995,13 @@ local function getaddrinfo(host, port, timeout, = opts) end =20 end - return internal.getaddrinfo(host, port, timeout, ga_opts) + + local ret, err =3D internal.getaddrinfo(host, port, timeout, = ga_opts) + if ret =3D=3D nil then + boxerrno(boxerrno.EINVAL) + return nil, err + end + return ret end =20 -- tcp connector @@ -1041,9 +1047,12 @@ local function tcp_connect(host, port, timeout) end local timeout =3D timeout or TIMEOUT_INFINITY local stop =3D fiber.clock() + timeout - local dns =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', + local dns, err =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', protocol =3D 'tcp' }) - if dns =3D=3D nil or #dns =3D=3D 0 then + if dns =3D=3D nil then + return nil, err + end + if #dns =3D=3D 0 then boxerrno(boxerrno.EINVAL) return nil end @@ -1360,8 +1369,12 @@ local function lsocket_tcp_connect(self, host, = port) -- This function is broken by design local ga_opts =3D { family =3D 'AF_INET', type =3D 'SOCK_STREAM' } local timeout =3D deadline - fiber.clock() - local dns =3D getaddrinfo(host, port, timeout, ga_opts) - if dns =3D=3D nil or #dns =3D=3D 0 then + local dns, err =3D getaddrinfo(host, port, timeout, ga_opts) + if dns =3D=3D nil then + self._errno =3D boxerrno() + return nil, err + end + if #dns =3D=3D 0 then self._errno =3D boxerrno.EINVAL return nil, socket_error(self) end @@ -1547,9 +1560,12 @@ local function lsocket_connect(host, port) if host =3D=3D nil or port =3D=3D nil then error("Usage: luasocket.connect(host, port)") end - local s =3D tcp_connect(host, port) + local s, err =3D tcp_connect(host, port) if not s then - return nil, boxerrno.strerror() + if not err then + return nil, boxerrno.strerror() + end + return nil, err end setmetatable(s, lsocket_tcp_client_mt) return s >> commit b3a8af5c605db811deb40946cfbcf9dcd45ad75c >> Author: Roman Khabibov >> Date: Thu Nov 21 14:37:54 2019 +0300 >>=20 >> lua: return getaddrinfo() errors >>=20 >> Add getaddrinfo() errors into the several fuctions of socket. Now >> getaddrinfo() can return a pair of values (nil and error message) >> in case of error. >>=20 >> Closes #4138 >>=20 >> @TarantoolBot document >> Title: socket API changes >>=20 >> * socket.getaddrinfo() >>=20 >> Can return error message as second return value in case of >> internal getaddrinfo() error. >>=20 >> Example: >> tarantool> socket.getaddrinfo('non_exists_hostname', 3301) >> --- >> - null >> - 'getaddrinfo: nodename nor servname provided, or not known' >> ... >>=20 >> * socket.tcp_connect() >>=20 >> Can return socket.getaddrinfo() error message as second return >> value. >>=20 >> Example: >> tarantool> socket.tcp_connect('non_exists_hostname', 3301) >> --- >> - null >> - 'getaddrinfo: nodename nor servname provided, or not known' >> ... >>=20 >> * socket_object:connect() >>=20 >> Wrapper for the socket.tcp_connect() with arguments format >> checking. If it is no error, return a socket object. If it is not, >> return nil and error message (socket.tcp_connect() just returns >> nil in case of error except when it is an internal getaddrinfo() >> error). >=20 > socket_object:connect() is part of Lua Socket API, so I would name the > instance 'luasocket_master': this would follow Lua Socket terminology: > http://w3.impa.br/~diego/software/luasocket/tcp.html >=20 > We end with the situation that Lua Socket function checks its args, > but our one does not. This looks strange. >=20 > Describing this function whose primary reason is to verify arguments = is > not correct too. This function exists for compatibility with Lua = Socket > API. >=20 > The behaviour change here is that luasocket_master:connect() returns = an > error from getaddrinfo() in the case rather than 'Invalid argument' as > it was before the commit. So the API is not changed and we can remove > this function from the docbot request (the same situation as in > net.box). lua: return getaddrinfo() errors =20 Add getaddrinfo() errors into the several fuctions of socket. Now getaddrinfo() can return a pair of values (nil and error message) in case of error. =20 Closes #4138 =20 @TarantoolBot document Title: socket API changes =20 * socket.getaddrinfo() =20 Can return error message as second return value in case of internal getaddrinfo() error. =20 Example: tarantool> socket.getaddrinfo('non_exists_hostname', 3301) --- - null - 'getaddrinfo: nodename nor servname provided, or not known' ... =20 * socket.tcp_connect() =20 Can return socket.getaddrinfo() error message as second return value. =20 Example: tarantool> socket.tcp_connect('non_exists_hostname', 3301) --- - null - 'getaddrinfo: nodename nor servname provided, or not known' =E2=80=A6 > Also I see that we don't document Lua Socket part of the API: > https://www.tarantool.io/en/doc/1.10/reference/reference_lua/socket/ Is this the part of this patchset? Maybe, it would be better to do doc request separately. >> diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua >> index 022cd4f40..9e66d6a8b 100644 >> --- a/test/app/socket.test.lua >> +++ b/test/app/socket.test.lua >> <...> >> @@ -968,6 +976,26 @@ socket.bind('127.0.0.1', 3301, '1') >>=20 >> test_run:cmd("clear filter") >>=20 >> +-- gh-4138 Check getaddrinfo() error from socket:connect() only. >> +-- Error code and error message returned by getaddrinfo() depends >> +-- on system's gai_strerror(). >> +test_run:cmd("setopt delimiter ';'") >> +function check_err(err) >> + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or = not known' or >> + err =3D=3D 'getaddrinfo: Servname not supported for = ai_socktype' or >> + err =3D=3D 'getaddrinfo: Name or service not known' then >> + return true >> + end >> + return false >> +end; >> +test_run:cmd("setopt delimiter ''"); >> + >> +s, err =3D socket.getaddrinfo('non_exists_hostname', 3301) >> +check_err(err) >> +s, err =3D socket.connect('non_exists_hostname', 3301) >> +check_err(err) >=20 > Okay, we have the test case for Lua Socket API's socket.connect(). = Let's > add a case for our native socket.tcp_connect(). +-- gh-4138 Check getaddrinfo() error from socket:connect() only. +-- Error code and error message returned by getaddrinfo() depends +-- on system's gai_strerror(). +test_run:cmd("setopt delimiter ';'") +function check_err(err) + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or not = known' or + err =3D=3D 'getaddrinfo: Servname not supported for ai_socktype' = or + err =3D=3D 'getaddrinfo: Name or service not known' then + return true + end + return false +end; +test_run:cmd("setopt delimiter ''"); + +s, err =3D socket.getaddrinfo('non_exists_hostname', 3301) +check_err(err) +s, err =3D socket.connect('non_exists_hostname', 3301) +check_err(err) +s, err =3D socket.tcp_connect('non_exists_hostname', 3301) +check_err(err) + commit d328fbf453248193d1a7c1406a3155f6b86b22c5 Author: Roman Khabibov Date: Thu Nov 21 14:37:54 2019 +0300 lua: return getaddrinfo() errors =20 Add getaddrinfo() errors into the several fuctions of socket. Now getaddrinfo() can return a pair of values (nil and error message) in case of error. =20 Closes #4138 =20 @TarantoolBot document Title: socket API changes =20 * socket.getaddrinfo() =20 Can return error message as second return value in case of internal getaddrinfo() error. =20 Example: tarantool> socket.getaddrinfo('non_exists_hostname', 3301) --- - null - 'getaddrinfo: nodename nor servname provided, or not known' ... =20 * socket.tcp_connect() =20 Can return socket.getaddrinfo() error message as second return value. =20 Example: tarantool> socket.tcp_connect('non_exists_hostname', 3301) --- - null - 'getaddrinfo: nodename nor servname provided, or not known' ... diff --git a/src/box/lua/net_box.lua b/src/box/lua/net_box.lua index c2e1bb9c4..2fb3e6df6 100644 --- a/src/box/lua/net_box.lua +++ b/src/box/lua/net_box.lua @@ -150,9 +150,12 @@ local function next_id(id) return band(id + 1, = 0x7FFFFFFF) end local function establish_connection(host, port, timeout) local timeout =3D timeout or DEFAULT_CONNECT_TIMEOUT local begin =3D fiber.clock() - local s =3D socket.tcp_connect(host, port, timeout) + local s, err =3D socket.tcp_connect(host, port, timeout) if not s then - return nil, errno.strerror(errno()) + if not err then + return nil, errno.strerror(errno()) + end + return nil, err end local msg =3D s:read({chunk =3D IPROTO_GREETING_SIZE}, timeout - (fiber.clock() - begin)) diff --git a/src/lua/socket.c b/src/lua/socket.c index 130378caf..dbade2d27 100644 --- a/src/lua/socket.c +++ b/src/lua/socket.c @@ -774,6 +774,18 @@ lbox_getaddrinfo_result_wrapper(struct lua_State = *L) return 1; } =20 +/** + * Wrap coio_getaddrinfo() and call it. Push returned values onto + * @a L Lua stack. + * + * @param L Lua stack. + * + * @retval 1 Number of returned values by Lua function if + * coio_getaddrinfo() success. + * @retval 2 Number of returned values by Lua function if + * coio_getaddrinfo() is failed (first is nil, second is error + * message). + */ static int lbox_socket_getaddrinfo(struct lua_State *L) { @@ -816,7 +828,9 @@ lbox_socket_getaddrinfo(struct lua_State *L) =20 if (dns_res !=3D 0) { lua_pushnil(L); - return 1; + struct error *err =3D diag_get()->last; + lua_pushstring(L, err->errmsg); + return 2; } =20 /* no results */ diff --git a/src/lua/socket.lua b/src/lua/socket.lua index a334ad45b..6c829a11c 100644 --- a/src/lua/socket.lua +++ b/src/lua/socket.lua @@ -995,7 +995,13 @@ local function getaddrinfo(host, port, timeout, = opts) end =20 end - return internal.getaddrinfo(host, port, timeout, ga_opts) + + local ret, err =3D internal.getaddrinfo(host, port, timeout, = ga_opts) + if ret =3D=3D nil then + boxerrno(boxerrno.EINVAL) + return nil, err + end + return ret end =20 -- tcp connector @@ -1041,9 +1047,12 @@ local function tcp_connect(host, port, timeout) end local timeout =3D timeout or TIMEOUT_INFINITY local stop =3D fiber.clock() + timeout - local dns =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', + local dns, err =3D getaddrinfo(host, port, timeout, { type =3D = 'SOCK_STREAM', protocol =3D 'tcp' }) - if dns =3D=3D nil or #dns =3D=3D 0 then + if dns =3D=3D nil then + return nil, err + end + if #dns =3D=3D 0 then boxerrno(boxerrno.EINVAL) return nil end @@ -1360,8 +1369,12 @@ local function lsocket_tcp_connect(self, host, = port) -- This function is broken by design local ga_opts =3D { family =3D 'AF_INET', type =3D 'SOCK_STREAM' } local timeout =3D deadline - fiber.clock() - local dns =3D getaddrinfo(host, port, timeout, ga_opts) - if dns =3D=3D nil or #dns =3D=3D 0 then + local dns, err =3D getaddrinfo(host, port, timeout, ga_opts) + if dns =3D=3D nil then + self._errno =3D boxerrno() + return nil, err + end + if #dns =3D=3D 0 then self._errno =3D boxerrno.EINVAL return nil, socket_error(self) end @@ -1547,9 +1560,12 @@ local function lsocket_connect(host, port) if host =3D=3D nil or port =3D=3D nil then error("Usage: luasocket.connect(host, port)") end - local s =3D tcp_connect(host, port) + local s, err =3D tcp_connect(host, port) if not s then - return nil, boxerrno.strerror() + if not err then + return nil, boxerrno.strerror() + end + return nil, err end setmetatable(s, lsocket_tcp_client_mt) return s diff --git a/test/app/socket.result b/test/app/socket.result index fd299424c..a9fe840be 100644 --- a/test/app/socket.result +++ b/test/app/socket.result @@ -941,10 +941,20 @@ sc:close() - true ... -- tcp_connect --- test timeout -socket.tcp_connect('127.0.0.1', 80, 0.00000000001) +-- Test timeout. In this test, tcp_connect can return the second +-- output value from internal.getaddrinfo (usually on Mac OS, but +-- theoretically it can happen on Linux too). Sometimes +-- getaddrinfo() is timed out, sometimes connect. On Linux however +-- getaddrinfo is fast enough to never give timeout error in +-- the case. So, there are two sources of timeout errors that are +-- reported differently. This difference has appeared after +-- gh-4138 patch. +s, err =3D socket.tcp_connect('127.0.0.1', 80, 0.00000000001) --- -- null +... +s =3D=3D nil +--- +- true ... -- AF_INET s =3D socket('AF_INET', 'SOCK_STREAM', 'tcp') @@ -2816,6 +2826,48 @@ test_run:cmd("clear filter") --- - true ... +-- gh-4138 Check getaddrinfo() error from socket:connect() only. +-- Error code and error message returned by getaddrinfo() depends +-- on system's gai_strerror(). +test_run:cmd("setopt delimiter ';'") +--- +- true +... +function check_err(err) + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or not = known' or + err =3D=3D 'getaddrinfo: Servname not supported for ai_socktype' = or + err =3D=3D 'getaddrinfo: Name or service not known' then + return true + end + return false +end; +--- +... +test_run:cmd("setopt delimiter ''"); +--- +- true +... +s, err =3D socket.getaddrinfo('non_exists_hostname', 3301) +--- +... +check_err(err) +--- +- true +... +s, err =3D socket.connect('non_exists_hostname', 3301) +--- +... +check_err(err) +--- +- true +... +s, err =3D socket.tcp_connect('non_exists_hostname', 3301) +--- +... +check_err(err) +--- +- true +... -- case: sicket receive inconsistent behavior chan =3D fiber.channel() --- diff --git a/test/app/socket.test.lua b/test/app/socket.test.lua index c72d41763..7086e496b 100644 --- a/test/app/socket.test.lua +++ b/test/app/socket.test.lua @@ -300,8 +300,16 @@ sc:close() =20 -- tcp_connect =20 --- test timeout -socket.tcp_connect('127.0.0.1', 80, 0.00000000001) +-- Test timeout. In this test, tcp_connect can return the second +-- output value from internal.getaddrinfo (usually on Mac OS, but +-- theoretically it can happen on Linux too). Sometimes +-- getaddrinfo() is timed out, sometimes connect. On Linux however +-- getaddrinfo is fast enough to never give timeout error in +-- the case. So, there are two sources of timeout errors that are +-- reported differently. This difference has appeared after +-- gh-4138 patch. +s, err =3D socket.tcp_connect('127.0.0.1', 80, 0.00000000001) +s =3D=3D nil =20 -- AF_INET s =3D socket('AF_INET', 'SOCK_STREAM', 'tcp') @@ -960,6 +968,27 @@ server:close() =20 test_run:cmd("clear filter") =20 +-- gh-4138 Check getaddrinfo() error from socket:connect() only. +-- Error code and error message returned by getaddrinfo() depends +-- on system's gai_strerror(). +test_run:cmd("setopt delimiter ';'") +function check_err(err) + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or not = known' or + err =3D=3D 'getaddrinfo: Servname not supported for ai_socktype' = or + err =3D=3D 'getaddrinfo: Name or service not known' then + return true + end + return false +end; +test_run:cmd("setopt delimiter ''"); + +s, err =3D socket.getaddrinfo('non_exists_hostname', 3301) +check_err(err) +s, err =3D socket.connect('non_exists_hostname', 3301) +check_err(err) +s, err =3D socket.tcp_connect('non_exists_hostname', 3301) +check_err(err) + -- case: sicket receive inconsistent behavior chan =3D fiber.channel() counter =3D 0 diff --git a/test/box/net.box.result b/test/box/net.box.result index e3dabf7d9..0635ca9e7 100644 --- a/test/box/net.box.result +++ b/test/box/net.box.result @@ -3927,6 +3927,34 @@ test_run:grep_log('default', '00000040:.*') --- - null ... +-- gh-4138 Check getaddrinfo() error from connect() only. Error +-- code and error message returned by getaddrinfo() depends on +-- system's gai_strerror(). +test_run:cmd("setopt delimiter ';'") +--- +- true +... +function check_err(err) + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or not = known' or + err =3D=3D 'getaddrinfo: Servname not supported for ai_socktype' = or + err =3D=3D 'getaddrinfo: Name or service not known' then + return true + end + return false +end; +--- +... +test_run:cmd("setopt delimiter ''"); +--- +- true +... +s =3D remote.connect('non_exists_hostname:3301') +--- +... +check_err(s['error']) +--- +- true +... box.cfg{log_level=3Dlog_level} --- ... diff --git a/test/box/net.box.test.lua b/test/box/net.box.test.lua index 8e65ff470..9c9aee1ad 100644 --- a/test/box/net.box.test.lua +++ b/test/box/net.box.test.lua @@ -1582,4 +1582,21 @@ test_run:wait_log('default', '00000030:.*', nil, = 10) -- we expect nothing below, so don't wait test_run:grep_log('default', '00000040:.*') =20 +-- gh-4138 Check getaddrinfo() error from connect() only. Error +-- code and error message returned by getaddrinfo() depends on +-- system's gai_strerror(). +test_run:cmd("setopt delimiter ';'") +function check_err(err) + if err =3D=3D 'getaddrinfo: nodename nor servname provided, or not = known' or + err =3D=3D 'getaddrinfo: Servname not supported for ai_socktype' = or + err =3D=3D 'getaddrinfo: Name or service not known' then + return true + end + return false +end; +test_run:cmd("setopt delimiter ''"); + +s =3D remote.connect('non_exists_hostname:3301') +check_err(s['error']) + box.cfg{log_level=3Dlog_level}