From: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> To: Konstantin Osipov <kostja@tarantool.org> Cc: tarantool-patches@freelists.org Subject: [tarantool-patches] Re: [PATCH 5/6] swim: introduce routing Date: Thu, 25 Apr 2019 16:50:08 +0300 [thread overview] Message-ID: <921181b4-450c-9d83-1060-8d472303ddd0@tarantool.org> (raw) In-Reply-To: <20190425103949.GE29257@atlas> > Please document this decision and the reasons for it as you stated > above. Done in the last commit. ========================================================================= @@ -59,11 +59,22 @@ * ping. Replies are processed out of the main cycle, * asynchronously. * - * Random selection provides even network load of ~1 message on - * each member per one protocol step regardless of the cluster - * size. Without randomness each member would receive a network - * load of N messages in each protocol step, where N is the - * cluster size. + * When a member unacknowledged too many pings, its status is + * changed to 'suspected'. The SWIM paper describes suspicion + * subcomponent as a protection against false-positive detection + * of alive members as dead. It happens when a member is + * overloaded and responds to pings too slow, or when the network + * is in trouble and packets can not go through some channels. + * When a member is suspected, another instance pings it + * indirectly via other members. It sends a fixed number of pings + * to the suspected one in parallel via additional hops selected + * randomly among other members. + * + * Random selection in all the components provides even network + * load of ~1 message on each member per one protocol step + * regardless of the cluster size. Without randomness each member + * would receive a network load of N messages in each protocol + * step, where N is the cluster size. * * To speed up propagation of new information by means of a few * random messages SWIM proposes a kind of fairness: when @@ -1111,7 +1122,12 @@ swim_send_ack(struct swim *swim, struct swim_task *task, swim_send_fd_msg(swim, task, dst, SWIM_FD_MSG_ACK, NULL); } -/** Schedule an indirect ack through @a proxy. */ +/** + * Schedule an indirect ack through @a proxy. Indirect ACK is sent + * only when this instance receives an indirect ping. It means + * that another member tries to reach this one via other nodes, + * and inexplicably failed to do it directly. + */ static inline int swim_send_indirect_ack(struct swim *swim, const struct sockaddr_in *dst, const struct sockaddr_in *proxy) @@ -1155,7 +1171,16 @@ finish: swim_task_delete_cb(task, scheduler, rc); } -/** Schedule a number of indirect pings to a member @a dst. */ +/** + * Schedule a number of indirect pings to a member @a dst. + * Indirect pings are used when direct pings are not acked too + * long. The SWIM paper explains that it is a protection against + * false-positive failure detection when a node sends ACKs too + * slow, or the network is in trouble. Then other nodes can try to + * access it via different channels and members. The algorithm is + * simple - choose a fixed number of random members and send pings + * to the suspected member via them in parallel. + */ static inline int swim_send_indirect_pings(struct swim *swim, const struct swim_member *dst) { ========================================================================= >>>> +void >>>> +swim_task_proxy(struct swim_task *task, const struct sockaddr_in *proxy) >>> >>> Why not "swim_task_set_proxy_addr"? >> >> 1) Because the transport level operates on addresses only. It is excessive >> to say everywhere '_addr' suffix. It is impossible to send to UUID or >> anything else except inet address; >> >> 2) For consistency - 'swim_task_send()' is not named >> 'swim_task_send_to_addr()'; >> >> 3) '_addr' suffix is too long. I tried it on the first SWIM version, >> but it does not help at all, only pads the code out. > > Then swim_task_set_proxy(). A method should have a verb in its > name, otherwise the name looks like a constructor. Done. ========================================================================= void -swim_task_proxy(struct swim_task *task, const struct sockaddr_in *proxy) +swim_task_set_proxy(struct swim_task *task, const struct sockaddr_in *proxy) { /* * Route meta should be reserved before body encoding is diff --git a/src/lib/swim/swim_io.h b/src/lib/swim/swim_io.h index 977859db7..03f268bc1 100644 --- a/src/lib/swim/swim_io.h +++ b/src/lib/swim/swim_io.h @@ -243,7 +243,7 @@ swim_task_is_scheduled(struct swim_task *task) * into metadata section. */ void -swim_task_proxy(struct swim_task *task, const struct sockaddr_in *proxy); +swim_task_set_proxy(struct swim_task *task, const struct sockaddr_in *proxy); =========================================================================
next prev parent reply other threads:[~2019-04-25 13:50 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-04-24 14:36 [tarantool-patches] [PATCH 0/6] swim suspicion Vladislav Shpilevoy 2019-04-24 14:36 ` [tarantool-patches] [PATCH 1/6] test: rename swim_cluster_node to swim_cluster_member Vladislav Shpilevoy 2019-04-24 16:37 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 14:36 ` [tarantool-patches] [PATCH 2/6] test: remove swim packet filter destructors Vladislav Shpilevoy 2019-04-24 16:37 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 14:36 ` [tarantool-patches] [PATCH 3/6] test: introduce swim packet filter by destination address Vladislav Shpilevoy 2019-04-24 16:38 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 14:36 ` [tarantool-patches] [PATCH 4/6] swim: wrap sio_strfaddr() Vladislav Shpilevoy 2019-04-24 16:40 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 20:23 ` Vladislav Shpilevoy 2019-04-25 10:34 ` Konstantin Osipov 2019-04-25 13:50 ` Vladislav Shpilevoy 2019-04-24 14:36 ` [tarantool-patches] [PATCH 5/6] swim: introduce routing Vladislav Shpilevoy 2019-04-24 16:46 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 20:25 ` Vladislav Shpilevoy 2019-04-25 10:39 ` Konstantin Osipov 2019-04-25 13:50 ` Vladislav Shpilevoy [this message] 2019-04-25 13:57 ` Konstantin Osipov 2019-04-24 14:36 ` [tarantool-patches] [PATCH 6/6] swim: introduce suspicion Vladislav Shpilevoy 2019-04-24 17:01 ` [tarantool-patches] " Konstantin Osipov 2019-04-24 20:28 ` Vladislav Shpilevoy 2019-04-25 10:42 ` Konstantin Osipov
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=921181b4-450c-9d83-1060-8d472303ddd0@tarantool.org \ --to=v.shpilevoy@tarantool.org \ --cc=kostja@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='[tarantool-patches] Re: [PATCH 5/6] swim: introduce routing' \ /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