--- ./source/private_module/framework/directory/cht.c	2018-12-02 02:40:58.000000000 +0800
+++ ./source/private_module/framework/directory/cht.c.hotpatch	2018-12-02 02:40:58.000000000 +0800
@@ -808,13 +808,6 @@
 }
 
 /**
-    \brief 㲥Ϣ
-    \param[in] diralg:
-    \param[in] msg:㲥Ϣ
-    \param[in] len:Ϣ
-    \param[inout]
-    \return 
-    \notes
 */
 void dlmChtProcessBroadcastMsg(DLM_DIR_ALG_S* diralg, void* msg, uint32_t len)
 {
@@ -822,12 +815,11 @@
     DLM_DIR_BROADCAST_MSG_S* broadcastMsg = NULL;
     int32_t ret = RETURN_ERROR;
     uint16_t localNid = 0;
-
+    DLM_DIR_NID_S srcNid;
+    DLM_DIR_NID_S dstNid;
     UNREFERENCE_PARAM(len);
     cht = (DLM_DIR_CHT_S*)diralg;
     broadcastMsg = (DLM_DIR_BROADCAST_MSG_S*)msg;
-    /* begin-end l00296137@20150502 (A)SSERTģ˴ȾΪsizeof DLM_DIR_BROADCAST_MSG_S*/
-
     localNid = cht->zone->nid;
     DLM_LOG(DBG_LOG_INFO, DLM_LOG_ID_DIR(1), "Zone(0x%x): Process broadcast msg, curent node %u, srcNid(%u,%u), dstNid(%u,%u), event %u.", 
                           ZONE_NAME(cht->zone), localNid, broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid, 
@@ -837,61 +829,69 @@
     {
         dlmChtRecordRecvEvent(cht, &broadcastMsg->srcNid, &broadcastMsg->dstNid, broadcastMsg->eventType);
     }
-
+    srcNid.nid = broadcastMsg->srcNid.nid;
+    srcNid.vnid = broadcastMsg->srcNid.vnid;
+    dstNid.nid = broadcastMsg->dstNid.nid;
+    dstNid.vnid = broadcastMsg->dstNid.vnid;
     spin_lock(&cht->lock); 
+    if(broadcastMsg->eventType == DLM_DIR_TASK_EVENT_TYPE_ONLINE_MIG_DONE
+        && !dlmTmTaskisExist(&cht->tm, srcNid, dstNid))
+    {
+        spin_unlock(&cht->lock);
+        DLM_LOG(DBG_LOG_INFO, 0, "Zone(0x%x): broadcastMsg is invalid.",
+            ZONE_NAME(cht->zone));
+        return;
+    }
     switch(broadcastMsg->eventType)
     {
         case DLM_DIR_TASK_EVENT_TYPE_ONLINE_MIG_DONE:
             ret = dlmChtVnodeEventHandle(cht, broadcastMsg->dstNid.nid, broadcastMsg->dstNid.vnid, DLM_NODE_STATE_NORMAL);
-            break;
-                        
+            break;                      
         case DLM_DIR_TASK_EVENT_TYPE_OFFLINE_MIG_DONE:
             ret = dlmChtVnodeEventHandle(cht, broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid, DLM_NODE_STATE_INI);
-            break;
-            
+            break;     
         case DLM_DIR_TASK_EVENT_TYPE_ONLINE_MIG_FAIL:
             ret = dlmChtOnlineMigFailHandle(cht, broadcastMsg->dstNid.nid, broadcastMsg->dstNid.vnid);
-            break;
-            
+            break;            
         case DLM_DIR_TASK_EVENT_TYPE_OFFLINE_MIG_FAIL:
             ret = dlmChtOfflineMigFailHandle(cht, broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid);
-            break;
-            
+            break;           
         case DLM_DIR_TASK_EVENT_TYPE_OFFLINE:
-            /*Խڵĸڵ㴦*/
             ret = dlmChtNodeEventHandle(cht, broadcastMsg->srcNid.nid, DLM_NODE_EVENT_NODE_LEAVE);
-            break;
-            
+            break;     
         case DLM_DIR_TASK_EVENT_TYPE_RECOVERY_DONE:
-            /*Թϵڵ㴦*/
             DLM_LOG(DBG_LOG_DEBUG, DLM_LOG_ID_DIR(1), "DLMRec, recv broadcast, evtCnt(%u).",broadcastMsg->eventCount); 
-            if (broadcastMsg->eventCount == 0)
-            {
-                ret = dlmChtVnodeEventHandle(cht, broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid, DLM_NODE_STATE_INI);
+            if (broadcastMsg->eventCount == 0) {
+                if(dlmTmTaskisExist(&cht->tm, broadcastMsg->srcNid, broadcastMsg->dstNid)) {
+                    ret = dlmChtVnodeEventHandle(cht, broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid, DLM_NODE_STATE_INI);
+                }
+                else {
+                    DLM_LOG(DBG_LOG_WARNING, 0, "Zone(0x%x): broadcastMsg is invalid srcNid(%u,%u), dstNid(%u,%u)", ZONE_NAME(cht->zone), broadcastMsg->srcNid.nid, broadcastMsg->srcNid.vnid, broadcastMsg->dstNid.nid, broadcastMsg->dstNid.vnid);
+                    ret = RETURN_ERROR;
+                }
             }
-            else
-            {
-            /* жǷ֧ccdbpackbroadcastMsg->eventCountжǷǿۺϵ¼,
-                ֹۺϹУȺгֲ֧־ۺϵĳ²ۺϵ¼
-            */
+            else {
                 uint8_t i =0;
                 for(i=0; i<broadcastMsg->eventCount; i++)
                 {
-                    ret = dlmChtVnodeEventHandle(cht, broadcastMsg->srcNidList[i].nid, broadcastMsg->srcNidList[i].vnid, DLM_NODE_STATE_INI);
+                    DLM_LOG(DBG_LOG_INFO, DLM_LOG_ID_DIR(1), "Zone(0x%x): Process broadcast msg, curent node %u, srcNid(%u,%u), dstNid(%u,%u), event %u.", ZONE_NAME(cht->zone), localNid, broadcastMsg->srcNidList[i].nid, broadcastMsg->srcNidList[i].vnid, broadcastMsg->dstNidList[i].nid, broadcastMsg->dstNidList[i].vnid, broadcastMsg->eventType);
+                    if(dlmTmTaskisExist(&cht->tm, broadcastMsg->srcNidList[i], broadcastMsg->dstNidList[i])) {
+                        ret = dlmChtVnodeEventHandle(cht, broadcastMsg->srcNidList[i].nid, broadcastMsg->srcNidList[i].vnid, DLM_NODE_STATE_INI);
+                    }
+                    else {
+                        DLM_LOG(DBG_LOG_WARNING, 0, "Zone(0x%x): broadcastMsg is invalid.", ZONE_NAME(cht->zone));
+                        ret = RETURN_ERROR;
+                    }
                 }
-
             }
 #ifndef _SNAS_9000_              
             updateRecTimeStat(NULL, 9);
 #endif
-            break;
-                            
+            break;                 
         default:
-            break;
-            
+            break;            
     }
-    spin_unlock(&cht->lock); 
-    
+    spin_unlock(&cht->lock);    
     if(RETURN_OK != ret)
     {
         DLM_LOG(DBG_LOG_ERROR, DLM_LOG_ID_DIR(1), "Zone(0x%x): Process message failed, type(%d).", 
