Tarantool development patches archive
 help / color / mirror / Atom feed
From: Roman Khabibov <roman.habibov@tarantool.org>
To: tarantool-patches@freelists.org
Cc: Alexander Turenko <alexander.turenko@tarantool.org>
Subject: [tarantool-patches] Re: [PATCH v2 1/2] lua: return getaddrinfo() errors
Date: Wed, 10 Jul 2019 05:16:55 +0300	[thread overview]
Message-ID: <A50BFCC5-B450-4A3C-AEF4-583189C70ED3@tarantool.org> (raw)
In-Reply-To: <20190709080407.sv5quzrxpbnijwp4@tkn_work_nb>


> On Jul 9, 2019, at 11:04, Alexander Turenko <alexander.turenko@tarantool.org> wrote:
> 
>>> The commit message should mention Roman's commit and cleanly state that
>>> (rc < 0) assumption does not work on Mac OS.
> 
> This is not done.
    lua: return getaddrinfo() errors
    
    Before this patch, branch when getaddrinfo() returns error codes
    couldn't be reached on Mac OS, because they are greater than 0 on
    Mac OS (assumption "rc < 0" in commit ea1da04d5 is incorret for
    Mac OS). Add this errors into the socket and the net.box modules.
    Now getaddrinfo() can return a pair of values (nil and error
    message) in case of error.
    
    Closes #4138

>> +	/* gh-4138: Check getaddrinfo() error. */
>> +	isnt(coio_getaddrinfo("hostname", port, NULL, &i, 1), 0, "getaddrinfo error");
> 
> The line is longer then 80 symbols
>> +	isnt(strstr(diag_get()->last->errmsg, "getaddrinfo"), NULL,
>> +	     "getaddrinfo error");
> 
> It would be good to have different case names.
+	/* gh-4138: Check getaddrinfo() error. */
+	isnt(coio_getaddrinfo("non_exists_hostname", port, NULL, &i, 1), 0,
+	     "getaddrinfo error");
+	isnt(strstr(diag_get()->last->errmsg, "getaddrinfo"), NULL,
+	     "getaddrinfo error message");
+

> The problem that stated in the issue is about improper error message. I don't
> understand the test in this context: it does not check whether it is so. It is
> applicable to lua tests too.
>I would add relevant test case for coio_getaddrinfo() into
>test/unit/coio.cc.
I added this for this reason.
Why? Now, error message is proper, and I check it by grep:
+-- gh-4138 Check getaddrinfo() error. Error code and error message
+-- returned by getaddrinfo() depends on system's gai_strerror()
+-- and compiler. So that there is no checking for certain error
+-- message.
+
+s, err = socket:connect('non_exists_hostname:3301')
+string.find(err, 'getaddrinfo') ~= nil
+s, err = socket:bind('non_exists_hostname:3301')
+string.find(err, 'getaddrinfo') ~= nil
+
Same about net.box test.
>> + * 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 (fist is nil, second is error
> 
> Typo: fist -> first.
> 
>> + * message).
>> + * @retval One of luaT_error() codes.
> 
> 'luaT_error() code' is the strange phrase. I guess you want to say that
> the function can raise a lua error. It is not a return value, because a
> function does not return at all in the case (it is longjmp to be
> precise).
+/**
+ * Wrap coio_getaddrinfo() and call it. Push returned values onto
+ * @a L Lua stack. In case of error raise a Lua error.
+ *
+ * @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).
+ */

>>>> +s, err = socket:connect('hostname:3301');
>>> 
>>> I would use less generic hostname like 'non_exists_hostname’.
> 
> The comment is still actual for test/unit/coio.cc.
Done.

> (I have copied parts of your patch below to comment them.)
> 
>> @@ -1347,10 +1350,10 @@ local function lsocket_tcp_connect(self, host, port)
>>     -- This function is broken by design
>>     local ga_opts = { family = 'AF_INET', type = 'SOCK_STREAM' }
>>     local timeout = deadline - fiber.clock()
>> -    local dns = getaddrinfo(host, port, timeout, ga_opts)
>> +    local dns, err = getaddrinfo(host, port, timeout, ga_opts)
>>     if dns == nil or #dns == 0 then
>> -        self._errno = boxerrno.EINVAL
>> -        return nil, socket_error(self)
>> +         self._errno = boxerrno.EINVAL
> 
> Broken indent.
@@ -1347,10 +1356,10 @@ local function lsocket_tcp_connect(self, host, port)
     -- This function is broken by design
     local ga_opts = { family = 'AF_INET', type = 'SOCK_STREAM' }
     local timeout = deadline - fiber.clock()
-    local dns = getaddrinfo(host, port, timeout, ga_opts)
+    local dns, err = getaddrinfo(host, port, timeout, ga_opts)
     if dns == nil or #dns == 0 then
         self._errno = boxerrno.EINVAL
-        return nil, socket_error(self)
+        return nil, err
     end
     for _, remote in ipairs(dns) do
         timeout = deadline - fiber.clock()

>> @@ -1534,9 +1537,12 @@ local function lsocket_connect(host, port)
>>     if host == nil or port == nil then
>>         error("Usage: luasocket.connect(host, port)")
>>     end
>> -    local s = tcp_connect(host, port)
>> +    local s, err = tcp_connect(host, port)
>>     if not s then
>> -        return nil, boxerrno.strerror()
>> +        if not err then
> 
>> +            return nil, boxerrno.strerror()
>> +        end
>> +        return nil, err
> 
> Why not always set errno to EINVAL and return err, nil in case on an error? It
> seems the 'if' here is redundant.
I think that if we remove this ‘if', the behaviour of these methods
(lsocket_connect(), lsocket_bind()) will be strange. In some cases error
message is present, in some cases it is not, because tcp_connect() can return
just nil without err.

> Also applicable to similar changes in other lua functions.
> 
>>     for i, remote in pairs(dns) do
>>         timeout = stop - fiber.clock()
>>         if timeout <= 0 then
>>             boxerrno(boxerrno.ETIMEDOUT)
>> -            return nil
>> +            return nil, 'timed out'
>>         end
>>         local s = socket_new(remote.family, remote.type, remote.protocol)
>>         if s then
> 
> Do you really think this change is self-explanatory and it is obvious
> why this is needed (and why this was not needed before)?
> 
> Yep, we discussed it voicely, but I'm not a last reader of your code.
-            return nil
+            -- Second arg added to do the behaviour of this
+            -- function symmetrical in case of timeout on both
+            -- Linux and Mac OS. On Mac OS error message 'timed
+            -- out' is thrown by getaddrinfo(). On Linux the
+            -- behaviour of getaddrinfo() in this case isn't same
+            -- and timeout is checked here.
+            return nil, 'timed out'

  reply	other threads:[~2019-07-10  2:17 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-06-15 16:58 [tarantool-patches] [PATCH] " Roman Khabibov
2019-06-23 20:31 ` [tarantool-patches] " Alexander Turenko
2019-06-25 13:38   ` [tarantool-patches] Re: [PATCH v2 1/2] " Roman Khabibov
2019-07-09  8:04     ` Alexander Turenko
2019-07-10  2:16       ` Roman Khabibov [this message]
2019-07-23 12:39         ` Alexander Turenko
2019-07-26 13:48           ` Alexander Turenko
2019-08-05 13:36           ` Roman Khabibov
2019-08-29  0:45             ` Alexander Turenko
     [not found]               ` <868EAF2C-A491-46C9-AD37-7512D6CAB213@tarantool.org>
2019-09-06 13:45                 ` [tarantool-patches] Re: [server-dev] " Alexander Turenko
2019-09-10 12:54                   ` Roman Khabibov
2019-11-01 14:39                     ` [Tarantool-patches] [server-dev] Re: [tarantool-patches] " Alexander Turenko
2019-11-21 17:27                       ` [Tarantool-patches] [tarantool-patches] [server-dev] " Roman Khabibov
2019-12-08 19:48                         ` Alexander Turenko
2019-12-10 16:25                           ` Roman Khabibov
2019-12-18 14:58                             ` Alexander Turenko
2019-12-21 17:50                               ` Roman Khabibov
2019-12-23 13:36                                 ` Alexander Turenko
2019-12-26 17:29                                   ` Roman Khabibov
2020-02-18 13:55                                     ` [Tarantool-patches] Fwd: " Roman Khabibov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=A50BFCC5-B450-4A3C-AEF4-583189C70ED3@tarantool.org \
    --to=roman.habibov@tarantool.org \
    --cc=alexander.turenko@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='[tarantool-patches] Re: [PATCH v2 1/2] lua: return getaddrinfo() errors' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox