From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org>
To: tarantool-patches@freelists.org
Cc: kostja@tarantool.org
Subject: [tarantool-patches] [PATCH 3/7] swim: do not rebind when new 'port' is 0
Date: Wed, 15 May 2019 02:06:21 +0300 [thread overview]
Message-ID: <22d5641734c11687a5adf489d7e49dc1de544239.1557875116.git.v.shpilevoy@tarantool.org> (raw)
In-Reply-To: <cover.1557875116.git.v.shpilevoy@tarantool.org>
SWIM internally tries to avoid unnecessary close+socket+bind
calls on reconfiguration if a new URI is the same as an old one.
SWIM transport compares <IP, port> couples and if they are
equal, does nothing.
But if a port is 0, it is not a real port, but a sign to the
kernel to find any free port on the IP address. In such a case
SWIM transport after bind() retrieves and saves a real port.
When the same URI is specified again, the transport compares two
addresses: old <IP, auto found port>, new <IP, 0>, sees they are
'different', and rebinds. It is not necessary, obviously, because
the new URI covers the old one.
This commit avoids rebind, when new IP == old IP, and new port is
0.
Part of #3234
---
src/lib/swim/swim_transport_udp.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)
diff --git a/src/lib/swim/swim_transport_udp.c b/src/lib/swim/swim_transport_udp.c
index f017eeaf0..c0317a20b 100644
--- a/src/lib/swim/swim_transport_udp.c
+++ b/src/lib/swim/swim_transport_udp.c
@@ -64,11 +64,21 @@ swim_transport_bind(struct swim_transport *transport,
const struct sockaddr_in *new_addr = (const struct sockaddr_in *) addr;
const struct sockaddr_in *old_addr = &transport->addr;
assert(addr_len == sizeof(*new_addr));
+ bool is_new_port_any = new_addr->sin_port == 0;
if (transport->fd != -1 &&
new_addr->sin_addr.s_addr == old_addr->sin_addr.s_addr &&
- new_addr->sin_port == old_addr->sin_port)
+ (new_addr->sin_port == old_addr->sin_port || is_new_port_any)) {
+ /*
+ * Note, that new port == 0 means that any port is
+ * ok. If at the same time old and new IP
+ * addresses are the same and the socket is
+ * already bound (fd != -1), then the existing
+ * socket 'matches' the new URI and rebind is not
+ * needed.
+ */
return 0;
+ }
int fd = sio_socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0)
@@ -81,7 +91,7 @@ swim_transport_bind(struct swim_transport *transport,
return -1;
}
int real_port = new_addr->sin_port;
- if (new_addr->sin_port == 0) {
+ if (is_new_port_any) {
struct sockaddr_in real_addr;
addr_len = sizeof(real_addr);
if (sio_getsockname(fd, (struct sockaddr *) &real_addr,
--
2.20.1 (Apple Git-117)
next prev parent reply other threads:[~2019-05-14 23:06 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-14 23:06 [tarantool-patches] [PATCH 0/7] swim lua preparation, again Vladislav Shpilevoy
2019-05-14 23:06 ` [tarantool-patches] [PATCH 1/7] swim: drop swim_info() function Vladislav Shpilevoy
2019-05-15 2:00 ` [tarantool-patches] " Konstantin Osipov
2019-05-14 23:06 ` [tarantool-patches] [PATCH 2/7] swim: encapsulate 'uint16' payload size inside swim.c Vladislav Shpilevoy
2019-05-15 2:02 ` [tarantool-patches] " Konstantin Osipov
2019-05-14 23:06 ` Vladislav Shpilevoy [this message]
2019-05-15 2:02 ` [tarantool-patches] Re: [PATCH 3/7] swim: do not rebind when new 'port' is 0 Konstantin Osipov
2019-05-14 23:06 ` [tarantool-patches] [PATCH 4/7] swim: set 'left' status in self on swim_quit() Vladislav Shpilevoy
2019-05-15 2:03 ` [tarantool-patches] " Konstantin Osipov
2019-05-14 23:06 ` [tarantool-patches] [PATCH 5/7] msgpack: allow to pass 'struct ibuf *' into encode() Vladislav Shpilevoy
2019-05-15 2:05 ` [tarantool-patches] " Konstantin Osipov
2019-05-14 23:06 ` [tarantool-patches] [PATCH 6/7] msgpack: allow to pass 'const char *' into decode() Vladislav Shpilevoy
2019-05-15 2:05 ` [tarantool-patches] " Konstantin Osipov
2019-05-14 23:06 ` [tarantool-patches] [PATCH 7/7] Drop an unused function and class Vladislav Shpilevoy
2019-05-15 2:06 ` [tarantool-patches] " Konstantin Osipov
2019-05-15 10:02 ` [tarantool-patches] Re: [PATCH 0/7] swim lua preparation, again Vladislav Shpilevoy
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=22d5641734c11687a5adf489d7e49dc1de544239.1557875116.git.v.shpilevoy@tarantool.org \
--to=v.shpilevoy@tarantool.org \
--cc=kostja@tarantool.org \
--cc=tarantool-patches@freelists.org \
--subject='Re: [tarantool-patches] [PATCH 3/7] swim: do not rebind when new '\''port'\'' is 0' \
/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