--- ./source/private_module/ctrl/sys/flow_manager/flow_scheduler/flow_schedule.c	2018-04-04 09:03:55.000000000 +0000
+++ ./source/private_module/ctrl/sys/flow_manager/flow_scheduler/flow_schedule.c.hotpatch	2020-01-08 09:08:33.000000000 +0000
@@ -28,7 +28,7 @@
 #include "eam_intf.h"
 #include "ctrl_public_util.h"
 #include "obj_comm.h"
-
+#include "ft_obj_node_fault.h"
 /*****************************************************************/
 MODULE_ID(OSP_SYS);
 
@@ -678,7 +678,7 @@
 
     return B_FALSE;
 }
-
+static void nodeFaultRedoFreeClsLogCB(int32_t ret, void *arg);
 /**************************************************************************
     :  еĴ
 :  \param[in] logId      У־logId,
@@ -728,7 +728,7 @@
 
     return B_TRUE;
 }
-
+int32_t checkNodeFaultObjRedoFlowCanExce(uint32_t flow_id, void *paraBuf);
 /**************************************************************************
     :  ȼ
 :  uint32_t opCode
@@ -817,24 +817,24 @@
             DBG_LogWarning(DBG_LOGID_NEW, "FLOW_MANAGER: Get log info by log id (%lld) failded, error code(%d), buff length (%u).",
                            curRedoLogId, retVal, paraSize);
         }
-
         memcpy(paraBuff, &curRedoLogId, sizeof(curRedoLogId));
-
         DBG_LogInfo(DBG_LOGID_NEW, "FLOW_MANAGER: Generate redoOpcode(%d), curRedoLogId(%llu), flowId(%d).",
                     curRedoOpCode, curRedoLogId, pRedoFlowLogIdSet[index].curNeedRedoFlowId);
-        
         if(INVALID_VALUE32 == curRedoOpCode)
         {
             continue;        
         }
-        
+        if(checkNodeFaultObjRedoFlowCanExce(pRedoFlowLogIdSet[index].curNeedRedoFlowId, paraBuff) != RETURN_OK)
+        {
+            freeClsLog(OSP_SYS, curRedoLogId, nodeFaultRedoFreeClsLogCB, NULL);
+            continue;
+        }
         retVal = RECEIVE_MUTEX_REQUEST(curRedoOpCode, SYS_CMD_PARAM_EVENT, paraSize + FLOW_REDO_LOGID_LEN_SIZE, paraBuff);
         if (RETURN_OK != retVal)
         {
             DBG_LogWarning(DBG_LOGID_NEW, "FLOW_MANAGER: Send mutex requset failed, error code (0x%x), opCode (%u).",
                 retVal, curRedoOpCode);
         }
-
     }
 
     /* ͷڴ */
@@ -1866,3 +1866,86 @@
 }
 /* added by z00382569 for DTS2016090510064, 2016/09/12 end*/
 
+static void nodeFaultRedoFreeClsLogCB(int32_t ret, void *arg)
+{
+    UNREFERENCE_PARAM(arg);
+
+    if (ret == RETURN_OK)
+    {
+        DBG_LogInfo(DBG_LOGID_NEW, "OBJ_FLOW: Delete Fault Node OBJ redo flow log success");
+    }
+    else
+    {
+        DBG_LogError(DBG_LOGID_NEW, "OBJ_FLOW: Delete Fault Node OBJ redo flow log failed!");
+    }
+    return;
+}
+
+/**************************************************************************
+     :  жϽڵ㼯Ⱥ״̬OBJ״̬ǷΪNormal
+ :
+ :  
+ ֵ  :
+     :  
+**************************************************************************/
+int32_t isNodeclsStatusAndObjStatusNormal(nid_t nodeNid)
+{
+    uint32_t nodeObjNormalBitMap = 0;
+    uint32_t nodeClsNormalBitMap = 0;
+
+    /*ȡȺ״̬ΪNormalOBJ״̬ΪNormalĽڵ*/
+    getNormalNodeBitMapInfo(&nodeClsNormalBitMap);
+    getNodesByFlowSrvStatus(FLOW_OBJ_NODE_SRV_STATUS_NORMAL, &nodeObjNormalBitMap);
+
+    if (CHECK_NODEMAP_BIT_VALID(nodeNid, nodeClsNormalBitMap) && 
+        CHECK_NODEMAP_BIT_VALID(nodeNid, nodeObjNormalBitMap))
+    {
+        return RETURN_OK;
+    }
+
+    return RETURN_ERROR;
+}
+EXPORT_SYMBOL(isNodeclsStatusAndObjStatusNormal);
+
+
+/**************************************************************************
+     :  жϽڵǷִ
+ : flow_id--ID
+           paraBuf--¼
+ : 
+ ֵ  :   RETURN_OK---ִ̿
+          RETURN_ERROR--ִ̲
+     :  ֻڵOBJǰ벿
+**************************************************************************/
+int32_t checkNodeFaultObjRedoFlowCanExce(uint32_t flow_id, void *paraBuf)
+{
+    CLS_EVENT_PARA_S* clsEventParam = NULL;
+    PARA_NODE_FAULT_SYS_INFO_S* sysinfo = NULL;
+    nid_t faultNid = INVALID_VALUE16;
+    
+    if (flow_id == FLOW_OBJ_NODE_FAULT_PRE)
+    {
+        clsEventParam = (CLS_EVENT_PARA_S*)(void *)((char *)paraBuf + FLOW_REDO_LOGID_LEN_SIZE);
+        faultNid = *(nid_t *)clsEventParam->eventPara;
+        if (isNodeclsStatusAndObjStatusNormal(faultNid) == RETURN_OK)
+        {
+            DBG_LogInfo(DBG_LOGID_NEW, "OBJ_FLOW: Fault node(%u) redo flow(%d) is forbid,"
+                "Becasue of node cls status and obj status is normal", faultNid, flow_id);
+            return RETURN_ERROR;
+        }
+    }
+    else if(flow_id == FLOW_OBJ_NODE_FAULT_POST)
+    {
+        sysinfo = (PARA_NODE_FAULT_SYS_INFO_S *)(void *)((char *)paraBuf + FLOW_REDO_LOGID_LEN_SIZE);
+        faultNid = sysinfo->faultNodeId;
+        if (isNodeclsStatusAndObjStatusNormal(faultNid) == RETURN_OK)
+        {
+            DBG_LogInfo(DBG_LOGID_NEW, "OBJ_FLOW: Fault Node(%u) redo flow(%d) is forbid," 
+                "Because of Node cls status and obj status is normal", faultNid, flow_id);
+            return RETURN_ERROR;
+        }
+    }    
+    return RETURN_OK;
+}
+
+
