osaf/services/infrastructure/fm/fms/fm_cb.h   |   1 +
 osaf/services/infrastructure/fm/fms/fm_evt.h  |   1 +
 osaf/services/infrastructure/fm/fms/fm_main.c |  54 +++++++++++++++++++++++---
 osaf/services/infrastructure/fm/fms/fm_mds.c  |  12 +++++-
 4 files changed, 59 insertions(+), 9 deletions(-)


diff --git a/osaf/services/infrastructure/fm/fms/fm_cb.h 
b/osaf/services/infrastructure/fm/fms/fm_cb.h
--- a/osaf/services/infrastructure/fm/fms/fm_cb.h
+++ b/osaf/services/infrastructure/fm/fms/fm_cb.h
@@ -106,6 +106,7 @@ typedef struct fm_cb {
        SaClmHandleT clm_hdl;
        bool use_remote_fencing;
        SaNameT peer_clm_node_name;
+       bool peer_node_terminated;
 } FM_CB;
 
 extern char *role_string[];
diff --git a/osaf/services/infrastructure/fm/fms/fm_evt.h 
b/osaf/services/infrastructure/fm/fms/fm_evt.h
--- a/osaf/services/infrastructure/fm/fms/fm_evt.h
+++ b/osaf/services/infrastructure/fm/fms/fm_evt.h
@@ -21,6 +21,7 @@
 /* EVT from other GFM over MDS.*/
 typedef enum {
        GFM_GFM_EVT_NODE_INFO_EXCHANGE,
+       GFM_GFM_EVT_PEER_IS_TERMINATING,
        GFM_GFM_EVT_MAX
 } GFM_GFM_MSG_TYPE;
 
diff --git a/osaf/services/infrastructure/fm/fms/fm_main.c 
b/osaf/services/infrastructure/fm/fms/fm_main.c
--- a/osaf/services/infrastructure/fm/fms/fm_main.c
+++ b/osaf/services/infrastructure/fm/fms/fm_main.c
@@ -59,6 +59,7 @@ char *role_string[] = { "UNDEFINED", "AC
 static uint32_t fm_agents_startup(void);
 static uint32_t fm_get_args(FM_CB *);
 static uint32_t fms_fms_exchange_node_info(FM_CB *);
+static uint32_t fms_fms_inform_terminating(FM_CB *fm_cb);
 static uint32_t fm_nid_notify(uint32_t);
 static uint32_t fm_tmr_start(FM_TMR *, SaTimeT);
 static SaAisErrorT get_peer_clm_node_name(NODE_ID);
@@ -280,6 +281,7 @@ int main(int argc, char *argv[])
                }
 
                if (fds[FD_TERM].revents & POLLIN) {
+                       fms_fms_inform_terminating(&fm_cb);
                        daemon_exit();
                }
 
@@ -622,8 +624,12 @@ static void fm_mbx_msg_handler(FM_CB *fm
                                         * node_down event has been received.
                                         */
                                if (fm_cb->use_remote_fencing) {
-                                       opensaf_reboot(fm_cb->peer_node_id, 
(char *)fm_cb->peer_clm_node_name.value,
-                                                       "Received Node Down for 
peer controller");
+                                       if (fm_cb->peer_node_terminated == 
false) {
+                                               
opensaf_reboot(fm_cb->peer_node_id, (char *)fm_cb->peer_clm_node_name.value,
+                                                               "Received Node 
Down for peer controller");
+                                       } else {
+                                               LOG_NO("Peer node %s is 
terminated, fencing will not be performed", fm_cb->peer_clm_node_name.value);
+                                       }
                                } else {
                                        opensaf_reboot(fm_cb->peer_node_id, 
(char *)fm_cb->peer_node_name.value,
                                                        "Received Node Down for 
peer controller");
@@ -661,11 +667,12 @@ static void fm_mbx_msg_handler(FM_CB *fm
 
                        LOG_NO("Reseting peer controller node id: %x", 
fm_cb->peer_node_id);
                        if (fm_cb->use_remote_fencing) {
-                               LOG_NO("saClmClusterNodeGet succeeded node_id 
0x%X, clm peer node name %s",
-                                       fm_mbx_evt->node_id, 
fm_cb->peer_clm_node_name.value);
-
-                               opensaf_reboot(fm_cb->peer_node_id, (char 
*)fm_cb->peer_clm_node_name.value,
-                                               "Received Node Down for peer 
controller");
+                               if (fm_cb->peer_node_terminated == false) {
+                                       opensaf_reboot(fm_cb->peer_node_id, 
(char *)fm_cb->peer_clm_node_name.value,
+                                                       "Received Node Down for 
peer controller");
+                               } else {
+                                       LOG_NO("Peer node %s is terminated, 
fencing will not be performed", fm_cb->peer_clm_node_name.value);
+                               }
                        } else {
                                opensaf_reboot(fm_cb->peer_node_id, (char 
*)fm_cb->peer_node_name.value,
                                               "Received Node Down for Active 
peer");
@@ -868,6 +875,39 @@ static uint32_t fms_fms_exchange_node_in
 }
 
 /****************************************************************************
+* Name          : fms_fms_inform_terminating
+*
+* Description   : sends information to peer that terminating is undergoing.
+*
+* Arguments     : Pointer to Control Block.
+*
+* Return Values : NCSCC_RC_SUCCESS/NCSCC_RC_FAILURE.
+*
+* Notes         : None.
+*****************************************************************************/
+static uint32_t fms_fms_inform_terminating(FM_CB *fm_cb)
+{
+       GFM_GFM_MSG gfm_msg;
+       TRACE_ENTER();
+       if (fm_cb->peer_adest != 0) {
+/* peer fms present */
+               memset(&gfm_msg, 0, sizeof(GFM_GFM_MSG));
+               gfm_msg.msg_type = GFM_GFM_EVT_PEER_IS_TERMINATING;
+
+               if (NCSCC_RC_SUCCESS != fm_mds_async_send(fm_cb, 
(NCSCONTEXT)&gfm_msg,
+                                                         NCSMDS_SVC_ID_GFM, 
MDS_SEND_PRIORITY_VERY_HIGH,
+                                                         0, fm_cb->peer_adest, 
0)) {
+                       syslog(LOG_ERR, "Sending node-info message to peer fms 
failed");
+                       return NCSCC_RC_FAILURE;
+               }
+
+               return NCSCC_RC_SUCCESS;
+       }
+       TRACE_LEAVE();
+       return NCSCC_RC_FAILURE;
+}
+
+/****************************************************************************
 * Name          : fm_nid_notify
 *
 * Description   : Sends notification to NID
diff --git a/osaf/services/infrastructure/fm/fms/fm_mds.c 
b/osaf/services/infrastructure/fm/fms/fm_mds.c
--- a/osaf/services/infrastructure/fm/fms/fm_mds.c
+++ b/osaf/services/infrastructure/fm/fms/fm_mds.c
@@ -474,6 +474,7 @@ static uint32_t fm_mds_svc_evt(FM_CB *cb
                                }
                                cb->peer_adest = svc_evt->i_dest;
                                cb->peer_node_id = svc_evt->i_node_id;
+                               cb->peer_node_terminated = false;
                                return_val = fm_fill_mds_evt_post_fm_mbx(cb, 
fm_evt, cb->peer_node_id, FM_EVT_PEER_UP);
 
                                if (NCSCC_RC_FAILURE == return_val) {
@@ -533,7 +534,9 @@ static uint32_t fm_mds_rcv_evt(FM_CB *cb
                               cb->peer_node_name.length);
                        LOG_IN("Peer Node_id  %u : EE_ID %s", cb->peer_node_id, 
cb->peer_node_name.value);
                        break;
-
+               case GFM_GFM_EVT_PEER_IS_TERMINATING:
+                       fm_cb->peer_node_terminated = true;
+                       break;
                default:
                        syslog(LOG_INFO, "Wrong MDS event from GFM.");
                        return_val = NCSCC_RC_FAILURE;
@@ -768,7 +771,9 @@ static uint32_t fm_fm_mds_enc(MDS_CALLBA
                ncs_encode_n_octets_in_uba(uba, 
msg->info.node_info.node_name.value,
                                           
(uint32_t)msg->info.node_info.node_name.length);
                break;
-
+       case GFM_GFM_EVT_PEER_IS_TERMINATING:
+               fm_cb->peer_node_terminated = true;
+               break;
        default:
                syslog(LOG_INFO, "fm_fm_mds_enc: Invalid msg type for encode.");
                return m_LEAP_DBG_SINK(NCSCC_RC_FAILURE);
@@ -830,6 +835,9 @@ static uint32_t fm_fm_mds_dec(MDS_CALLBA
                ncs_decode_n_octets_from_uba(uba, 
msg->info.node_info.node_name.value,
                                             
msg->info.node_info.node_name.length);
                break;
+       case GFM_GFM_EVT_PEER_IS_TERMINATING:
+               fm_cb->peer_node_terminated = true;
+               break;
        default:
                syslog(LOG_INFO, "fm_fm_mds_dec: Invalid msg for decoding.");
                return m_LEAP_DBG_SINK(NCSCC_RC_FAILURE);

------------------------------------------------------------------------------
_______________________________________________
Opensaf-devel mailing list
Opensaf-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/opensaf-devel

Reply via email to