commit a2b9cb812f5107a2b05e1eddab54a12456738173
Author: thuan.tran <[email protected]>
Date:   Sun Oct 7 23:46:50 2018 +0000

    imm: fix incorrect set isCoord for both SCs [#2933]
    
    When current coordinator on payload crash and both SCs are ready
    with SC-2 active, the current code may set both SCs isCoord true.


---

** [tickets:#2933] imm: incorrect set isCoord both SCs when coordinator on 
payload crash**

**Status:** review
**Milestone:** 5.18.12
**Created:** Tue Oct 02, 2018 01:13 AM UTC by Thuan
**Last Updated:** Tue Oct 02, 2018 02:38 AM UTC
**Owner:** Thuan


IMMND Coordinator is set incorrectly by following code
~~~
                // Election priority:
                // 1) Coordinator on active node
                // 2) Coordinator on standby node
                // 3) Coordinator on PL node if SC absence is allowed.
                while (immnd_info_node) {
                        key = immnd_info_node->immnd_dest;
                        if ((immnd_info_node->isOnController) &&
                            (immnd_info_node->epoch == cb->mRulingEpoch)) {
                                candidate_coord_node = immnd_info_node;
                                immnd_info_node->isCoord = true;
                                if (immnd_info_node->immnd_key == cb->node_id) {
                                        /* Found a new candidate on active SC */
                                        break;
                                }
                        }

                        immd_immnd_info_node_getnext(&cb->immnd_tree, &key,
                                                     &immnd_info_node);
                }
~~~
When current coordinator is on payload (after headless) crash with both SC-1 
and SC-2 are ready and SC-2 is active, above loop can set isCoord true for both 
SC-1 and SC-2 instead of only SC-2.

Proposal fix:
~~~
diff --git a/src/imm/immd/immd_proc.c b/src/imm/immd/immd_proc.c
index b28506ba5..c16232d2d 100644
--- a/src/imm/immd/immd_proc.c
+++ b/src/imm/immd/immd_proc.c
@@ -346,7 +346,6 @@ bool immd_proc_elect_coord(IMMD_CB *cb, bool new_active)
                        if ((immnd_info_node->isOnController) &&
                            (immnd_info_node->epoch == cb->mRulingEpoch)) {
                                candidate_coord_node = immnd_info_node;
-                               immnd_info_node->isCoord = true;
                                if (immnd_info_node->immnd_key == cb->node_id) {
                                        /* Found a new candidate on active SC */
                                        break;
@@ -358,7 +357,9 @@ bool immd_proc_elect_coord(IMMD_CB *cb, bool new_active)
                }
 
                immnd_info_node = candidate_coord_node;
-               if (!immnd_info_node && cb->mScAbsenceAllowed) {
+               if (immnd_info_node != NULL) {
+                       immnd_info_node->isCoord = true;
+               } else if (cb->mScAbsenceAllowed) {
                        /* If SC absence is allowed and no SC based IMMND is
                           available then elect an IMMND coord at a payload.
                           Note this means that an IMMND at a payload may be
~~~


---

Sent from sourceforge.net because [email protected] is 
subscribed to https://sourceforge.net/p/opensaf/tickets/

To unsubscribe from further messages, a project admin can change settings at 
https://sourceforge.net/p/opensaf/admin/tickets/options.  Or, if this is a 
mailing list, you can unsubscribe from the mailing list.
_______________________________________________
Opensaf-tickets mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/opensaf-tickets

Reply via email to