--- ./source/private_module/pal/pal_adapt/pal_fsadapt.c	2018-04-10 08:10:16.000000000 +0000
+++ ./source/private_module/pal/pal_adapt/pal_fsadapt.c.hotpatch	2021-02-05 03:15:39.000000000 +0000
@@ -91,8 +91,8 @@
 #define FS_MAX_RETRYNUM 256
 //嵥ļϵͳhangʱʱʱ
 #define FS_HANG_MAX_TIMEOUT 60
-
-
+uint32_t FSADAPT_FLAGS_HM_RETRY_AGAIN = 0x00004000; /* ˫Ͽ֮ٴԵı */
+int32_t  ARB_HM_MASTER_OK             = 1;          /* ˫л֮˽ӹҵı */
 /**************************************************************************
       :  жϴǷɽ˫лΪEIO/EROFS/ECKSUM/EBST/ETIMEDOUTTRUE;
              뷵FALSE; 
@@ -105,9 +105,9 @@
 bool needHmSwitch(FS_ADAPT_RES_S *res)
 {
     int64_t curTime = (int64_t)JIFFIES_TO_SECOND(jiffies);
-
-    if (res->adaptReq.flags & FSADAPT_FLAGS_VAAI_IO)
-    {
+    /* Ѿ˫ٴԵıǣѾ˫л֮ԣٴл */
+    if (res->adaptReq.flags & FSADAPT_FLAGS_HM_RETRY_AGAIN) { res->adaptReq.flags &= ~FSADAPT_FLAGS_HM_RETRY_AGAIN; return FALSE; }
+    if (res->adaptReq.flags & FSADAPT_FLAGS_VAAI_IO) {
         PAL_LOG_INFO(DBG_LOGID_NEW, "VAAI IO, need not hm switch,flag(%u).",res->adaptReq.flags);
         return FALSE;
     }
@@ -143,7 +143,7 @@
     return FALSE;
 
 }
-
+extern int32_t getHmTimeoutHandleResult(uint32_t, int32_t *);
 /**************************************************************************
       :  ˫лĻص
   
@@ -156,7 +156,7 @@
 **************************************************************************/
 void handleIoErrorCbDone(void *context, int32_t result, int32_t arbResult)
 {   
-    
+    int32_t arbSyncResult = -1;
     FS_ADAPT_RES_S *res = (FS_ADAPT_RES_S*)getData(context);
     
     VOLS_COUNTER_BACK_INC(VOLS_COUNTER_NOTIFY_HM_SWTICH, VOLS_DEBUG_PAL_IO, result);
@@ -177,20 +177,20 @@
     {
         PAL_LOG_INFO(DBG_LOGID_NEW, "HM_handle: FS(ID:%llu) HM handle arb timeout(%d).",
                 res->adaptReq.fsId, arbResult);
-
-        if (FH_ARB_MASTER_OK == arbResult)
-        {
+        if (FH_ARB_MASTER_OK == arbResult) {
             res->result = RETURN_OK;
-        }
-        else
-        {
+        } else {
             res->result = RETURN_SPACE_ETIMEDOUT;
         }
+    } else {
+        if (getHmTimeoutHandleResult(getFsIdByFsSrvId(res->adaptReq.fsId), &arbSyncResult) == RETURN_OK && arbSyncResult == ARB_HM_MASTER_OK) {
+            res->adaptReq.flags |= FSADAPT_FLAGS_HM_RETRY_AGAIN;
+            res->retryIoInfo.ioTimePoint = ((int64_t)JIFFIES_TO_SECOND(jiffies) - (25));
+            setNextStep(context, res->retryIoInfo.retryStep); sendContextToIod(context); return;
+        }
     }
-    
     executeContext((CONTEXT_S*)context);
-
-    return;    
+    return;
 }
 
 
--- ./source/private_module/pal/pal_core/pal_core_vec_write.c	2018-04-27 09:30:05.000000000 +0000
+++ ./source/private_module/pal/pal_core/pal_core_vec_write.c.hotpatch	2021-01-20 08:28:39.000000000 +0000
@@ -955,20 +955,20 @@
      :  д
  :
  :
- ֵ  :
      :  ʧ
 **************************************************************************/
+extern int32_t getHmTimeoutHandleResult(uint32_t fsId, int32_t *arbResult);
 STATIC int32_t wLockDmnForWrite(CONTEXT_S* context)
 {
     CORE_WRITE_RES_S* res = (CORE_WRITE_RES_S*)getData(context);
-
+    if (res->lockResult == RETURN_SPACE_ETIMEDOUT) { /* ѸֵΪʱѯƴIOʱĽ */
+        if (getHmTimeoutHandleResult((uint32_t)FAI_OBJSETID(res->in->fai), NULL) == RETURN_OK || LVOS_GetMilliSecond() - res->delayTimeBegin >= 3000) { return CONTEXT_FINISH; } /* Ѿɻѯʱ䳬3sѯ */
+        setNextStep(context, CORE_WRITE_WLOCK_DMN); /* 򣬼ѯ */
+        return CONTEXT_CONTINUE_SLOW;
+    }
     VOLS_COUNTER_START_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO);
-
     palRttBegin(context, PAL_2_CORE_WRITE_LOCK_WRITE_DMN);
-
-    /* Ԫݼд */
-    return lockSpcDmnforTimeoutWrite(VNODE_DMN(res->vnode), PAL_ASYNC_LOCK_DEFAULT_TIMEOUT,
-                                     wLockDmnForWriteCb, context);
+    return lockSpcDmnforTimeoutWrite(VNODE_DMN(res->vnode), PAL_ASYNC_LOCK_DEFAULT_TIMEOUT, wLockDmnForWriteCb, context); /* Ԫݼд */
 }
 
 /**************************************************************************
@@ -976,26 +976,20 @@
  :
  :
  ֵ  :
-     :  
 **************************************************************************/
+extern int32_t notifyHmTimeoutHandle(uint32_t fsId);
 STATIC int32_t wLockDmnForWriteDone(CONTEXT_S* context)
 {
     CORE_WRITE_RES_S* res = (CORE_WRITE_RES_S*)getData(context);
 
-
     palRttEnd(context, PAL_2_CORE_WRITE_LOCK_WRITE_DMN);
-
-    /* FTDS begin*/
     FTDS_TRACE_RECORD(getTraceFromFsContext(context), RETURN_OK, WLOCK_DMN_FOR_WRITE);
-    /* FTDS end*/
-
     SET_LOCKED_FLAG(res->isDmnWLocked, res->lockResult);
 
     if (unlikely(RETURN_OK != res->lockResult))
     {
         VOLS_COUNTER_BACK_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO,
                               RETURN_ERROR);
-
         res->out->result = res->lockResult;
         PAL_LOG_ERROR(DBG_LOGID_NEW, "Lock dmn(fs %llu, obj %llu) failed %d.",
                       FAI_OBJSETID(res->fai), res->in->fid,
@@ -1006,12 +1000,18 @@
             res->holdBonusOut.bonusBuf = NULL;
         }
         releaseResourceForWrite(context);
+        if (res->lockResult == RETURN_SPACE_ETIMEDOUT) { /* ʱ֪ͨ˫ */
+            if (notifyHmTimeoutHandle((uint32_t)FAI_OBJSETID(res->in->fai)) == RETURN_OK) { /* ֪ͨƴʱƷط0ʱʾҪֱԭ߼ */
+                /* ѯ */
+                res->delayTimeBegin = LVOS_GetMilliSecond();
+                setNextStep(context, CORE_WRITE_WLOCK_DMN);
+                return CONTEXT_CONTINUE_SLOW;
+            }
+        }
         return CONTEXT_FINISH;
     }
-
     VOLS_COUNTER_BACK_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO,
                           RETURN_OK);
-
     return CONTEXT_CONTINUE;
 }
 
--- ./source/private_module/pal/pal_core/pal_core_write_zero_copy.c	2018-04-27 09:30:05.000000000 +0000
+++ ./source/private_module/pal/pal_core/pal_core_write_zero_copy.c.hotpatch	2021-01-20 08:28:39.000000000 +0000
@@ -1176,20 +1176,20 @@
      :  д
  :
  :
- ֵ  :
      :  ʧ
 **************************************************************************/
+extern int32_t getHmTimeoutHandleResult(uint32_t fsId, int32_t *arbResult);
 STATIC int32_t writeZcLockDmnForWrite(CONTEXT_S* context)
 {
     CORE_WRITE_ZERO_COPY_RES_S* res = (CORE_WRITE_ZERO_COPY_RES_S*)getData(context);
-
+    if (res->lockResult == RETURN_SPACE_ETIMEDOUT) { /* ѸֵΪʱѯƴIOʱĽ */
+        if (getHmTimeoutHandleResult((uint32_t)FAI_OBJSETID(res->in->fai), NULL) == RETURN_OK || LVOS_GetMilliSecond() - res->wormCheckIn.writeOffset >= 3000) { return CONTEXT_FINISH; } /* Ѿɻѯʱ䳬3sѯ */
+        setNextStep(context, WRITE_ZERO_WLOCK_DMN); /* 򣬼ѯ */
+        return CONTEXT_CONTINUE_SLOW;
+    }
     VOLS_COUNTER_START_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO);
-
     palRttBegin(context,PAL_2_CORE_WRITE_ZC_WLOCK_DMN);
-
-    /* Ԫݼд */
-    return lockSpcDmnforTimeoutWrite(VNODE_DMN(res->vnode), PAL_ASYNC_LOCK_DEFAULT_TIMEOUT,
-                                     lockDmnForWriteZcTimeoutCb, context);
+    return lockSpcDmnforTimeoutWrite(VNODE_DMN(res->vnode), PAL_ASYNC_LOCK_DEFAULT_TIMEOUT, lockDmnForWriteZcTimeoutCb, context); /* Ԫݼд */
 }
 
 /**************************************************************************
@@ -1197,35 +1197,35 @@
  :
  :
  ֵ  :
-     :  
 **************************************************************************/
+extern int32_t notifyHmTimeoutHandle(uint32_t fsId);
 STATIC int32_t writeZcLockDmnForWriteDone(CONTEXT_S* context)
 {
     CORE_WRITE_ZERO_COPY_RES_S* res = (CORE_WRITE_ZERO_COPY_RES_S*)getData(context);
-
     palRttEnd(context,PAL_2_CORE_WRITE_ZC_WLOCK_DMN);
     /* FTDS begin*/
-    FTDS_TRACE_RECORD(getTraceFromFsContext(context), RETURN_OK,
-                     WRITE_ZC_LOCK_WRITE_DONE);
+    FTDS_TRACE_RECORD(getTraceFromFsContext(context), RETURN_OK, WRITE_ZC_LOCK_WRITE_DONE);
     /* FTDS end*/
     SET_LOCKED_FLAG(res->isDmnWLocked, res->lockResult);
-    
     if (unlikely(RETURN_OK != res->lockResult))
     {
         VOLS_COUNTER_BACK_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO,
                               RETURN_ERROR);
-
         res->out->result = res->lockResult;
         PAL_LOG_ERROR(DBG_LOGID_NEW, "Lock FS(%llu) fid(%llu) dmn for read failed(%d).", 
             FAI_OBJSETID(res->fai), res->in->fid, res->out->result);
-        
         writeZcReleaseResource(context);
-        
+        if (res->lockResult == RETURN_SPACE_ETIMEDOUT) { /* ʱ֪ͨ˫ */
+            if (notifyHmTimeoutHandle((uint32_t)FAI_OBJSETID(res->in->fai)) == RETURN_OK) { /* ֪ͨƴʱƷط0ʱʾҪֱԭ߼ */
+                /* ѯ */
+                res->wormCheckIn.writeOffset = LVOS_GetMilliSecond();
+                setNextStep(context, WRITE_ZERO_WLOCK_DMN);
+                return CONTEXT_CONTINUE_SLOW;
+            }
+        }
         return CONTEXT_FINISH;
     }
-    
     VOLS_COUNTER_BACK_INC(VOLS_COUNTER_LOCK_SPC_DMNFOR_WRITE, VOLS_DEBUG_PAL_IO, RETURN_OK);
-
     return CONTEXT_CONTINUE;
 }
 
