If all interfaces were faulty, passive_mcast_flush_send and related
functions ended in endless loop. This is now handled and if there is no
live interface, message is dropped.

Signed-off-by: Jan Friesse <jfrie...@redhat.com>
---
 exec/totemrrp.c |   29 ++++++++++++++++++++---------
 1 files changed, 20 insertions(+), 9 deletions(-)

diff --git a/exec/totemrrp.c b/exec/totemrrp.c
index 83292ad..a5abb1b 100644
--- a/exec/totemrrp.c
+++ b/exec/totemrrp.c
@@ -1015,12 +1015,16 @@ static void passive_mcast_flush_send (
        unsigned int msg_len)
 {
        struct passive_instance *passive_instance = (struct passive_instance 
*)instance->rrp_algo_instance;
+       int i = 0;
 
        do {
                passive_instance->msg_xmit_iface = 
(passive_instance->msg_xmit_iface + 1) % instance->interface_count;
-       } while (passive_instance->faulty[passive_instance->msg_xmit_iface] == 
1);
+               i++;
+       } while ((i <= instance->interface_count) && 
(passive_instance->faulty[passive_instance->msg_xmit_iface] == 1));
 
-       totemnet_mcast_flush_send 
(instance->net_handles[passive_instance->msg_xmit_iface], msg, msg_len);
+       if (i <= instance->interface_count) {
+               totemnet_mcast_flush_send 
(instance->net_handles[passive_instance->msg_xmit_iface], msg, msg_len);
+       }
 }
 
 static void passive_mcast_noflush_send (
@@ -1029,13 +1033,16 @@ static void passive_mcast_noflush_send (
        unsigned int msg_len)
 {
        struct passive_instance *passive_instance = (struct passive_instance 
*)instance->rrp_algo_instance;
+       int i = 0;
 
        do {
                passive_instance->msg_xmit_iface = 
(passive_instance->msg_xmit_iface + 1) % instance->interface_count;
-       } while (passive_instance->faulty[passive_instance->msg_xmit_iface] == 
1);
-
+               i++;
+       } while ((i <= instance->interface_count) && 
(passive_instance->faulty[passive_instance->msg_xmit_iface] == 1));
 
-       totemnet_mcast_noflush_send 
(instance->net_handles[passive_instance->msg_xmit_iface], msg, msg_len);
+       if (i <= instance->interface_count) {
+               totemnet_mcast_noflush_send 
(instance->net_handles[passive_instance->msg_xmit_iface], msg, msg_len);
+       }
 }
 
 static void passive_token_recv (
@@ -1070,14 +1077,18 @@ static void passive_token_send (
        unsigned int msg_len)
 {
        struct passive_instance *passive_instance = (struct passive_instance 
*)instance->rrp_algo_instance;
+       int i = 0;
 
        do {
                passive_instance->token_xmit_iface = 
(passive_instance->token_xmit_iface + 1) % instance->interface_count;
-       } while (passive_instance->faulty[passive_instance->token_xmit_iface] 
== 1);
+               i++;
+       } while ((i <= instance->interface_count) && 
(passive_instance->faulty[passive_instance->token_xmit_iface] == 1));
 
-       totemnet_token_send (
-               instance->net_handles[passive_instance->token_xmit_iface],
-               msg, msg_len);
+       if (i <= instance->interface_count) {
+               totemnet_token_send (
+                   instance->net_handles[passive_instance->token_xmit_iface],
+                   msg, msg_len);
+       }
 
 }
 
-- 
1.7.1

_______________________________________________
Openais mailing list
Openais@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/openais

Reply via email to