--- ./source/private_module/spa/meta_layout/tree_object.c	2018-02-09 13:47:03.000000000 +0000
+++ ./source/private_module/spa/meta_layout/tree_object.c.hotpatch	2019-05-11 10:52:01.000000000 +0000
@@ -5754,52 +5754,52 @@
     
     return insertTreeItem(objIter, data, len, callback, ctx);
 }
-
-/**************************************************************************
-     :  ɾextentϵ 
- :  metaIter  Ԫݵ
-                cb    ص
-                ctx   ص
- :  
- ֵ  :  RETURN_ERROR
-               RETURN_OK
-     :  
-**************************************************************************/
+uint32_t revNumForTest = 0;  uint32_t delayReqForTest = 0;  extern void schedTreeObjReqForPatchTest(REQ_S  *req,void   *cb, void   *ctx, uint32_t delayReqForTest);
 int32_t deleteVolExtentTreeItemByInfo(META_ITERATOR_S   *metaIter,
                        PFN_META_CALLBACK cb,
                        void              *ctx)
 {
-    REQ_S * req = NULL;
-    uint8_t * actionSet = NULL;
-
-    extentid_t *keyArray = NULL;
-    EXTENT_INFO_S  *tempExtInfo = NULL;
-    uint32_t index;
-
+    REQ_S * req = NULL;    uint8_t * actionSet = NULL;    extentid_t *keyArray = NULL;    EXTENT_INFO_S  *tempExtInfo = NULL;    uint32_t index;
+    uint32_t revNum = 0;    int32_t ret;    TREE_OBJECT_S *treeObj;    uint64_t *nodeId = NULL;
     req = genMobjReqAction(DELETE_TREE_ITEM, metaIter->mobj);
     if (NULL == req)
     {
         SPA_LIMIT_PRINT_ERROR(META_LAYOUT_ID_017A, "Generate meta object req action failed, so delete tree item failed yet.");
         return RETURN_ERROR;
     }
-   
     PVT_ITERATOR_PTR(req) = (uint64_t)(ptrdiff_t)metaIter;
-    PVT_NODE_NUM(req)     = BTREE_MAX_RSV_NODES;
     PVT_NMGR_PTR(req)     = 
         (uint64_t)(ptrdiff_t)getMobjNodeMgrInst(&metaIter->mobj->key);
-    
     keyArray = &PVT_META_BEGIN(req);
     tempExtInfo = (EXTENT_INFO_S *)metaIter->key;
     for (index = 0; index < metaIter->itemNum; index++)
     {
         keyArray[index] = tempExtInfo[index].extentId;
     }
-    
+    //btreeȡɾextentҪԤĽڵΪ֤ԭ̾䣬ԤBTREE_MAX_RSV_NODES
+    //Ԥṹ֧BTREE_INSERT_MAX_RSV_NODES
+    treeObj = (TREE_OBJECT_S*)(ptrdiff_t)(metaIter->mobj);
+    ret = GET_BATCH_DEL_RESV_NODE_NUM((uint32_t)metaIter->itemNum, &(treeObj->btreeInst), &revNum);
+    if(RETURN_OK != ret)    {
+        SPA_LIMIT_PRINT_ERROR(META_LAYOUT_ID_017A, "Get batch del resv num error,ret(%d),delnum(%llu),ext0id(%llx).",  ret, metaIter->itemNum, keyArray[0]);
+        revNum = BTREE_INSERT_MAX_RSV_NODES;
+    }
+    revNum = (revNum < BTREE_MAX_RSV_NODES) ? BTREE_MAX_RSV_NODES : revNum;
+    revNum = (revNum > BTREE_INSERT_MAX_RSV_NODES) ? BTREE_INSERT_MAX_RSV_NODES : revNum;
+    if ( 0 != revNumForTest) {revNum = revNumForTest;}
+    PVT_NODE_NUM(req)     = (uint8_t)revNum;
+    metaIter->batchOpType = DISCRETE_KEY_CONTINUOUS_DATA;  //ｫoptypeΪʱʹö̬ڴreqе˽ֶ
+    ret = ALLOCATE_PUB_STRUCTURE(sizeof(uint64_t) * BTREE_INSERT_MAX_RSV_NODES, (void **)(ptrdiff_t)&nodeId);
+    if ((RETURN_OK != ret) || (NULL == nodeId))    {
+        SPA_LIMIT_PRINT_ERROR(META_LAYOUT_ID_017A, "Alloc resv node error,ret(%d),delnum(%llu),ext0id(%llx).", ret, metaIter->itemNum, keyArray[0]);
+        return RETURN_ERROR;    }
+    memset(nodeId, 0, sizeof(uint64_t) * BTREE_INSERT_MAX_RSV_NODES);
+    PVT_NODE_ID_BEGIN(req) = (uint64_t)(ptrdiff_t)nodeId;
+    PVT_NODE_ID_END(req) = (uint64_t)(ptrdiff_t)(nodeId + BTREE_INSERT_MAX_RSV_NODES - 1);
+    DBG_LogDebug(NO_LOGID, "Delete ext delnum(%llu), ext0id(%llx), revNum(%u)", metaIter->itemNum, keyArray[0], revNum);
     actionSet = &PVT_ACTION_SET(req);
     PVT_MAX_ACTION(req) = initDeleteTreeItemAction(actionSet);
-    
-    schedTreeObjReq(req, (void*)(ptrdiff_t)cb, ctx);
-
+    if (0==delayReqForTest){schedTreeObjReq(req, (void*)(ptrdiff_t)cb, ctx);}    else {schedTreeObjReqForPatchTest(req, (void*)(ptrdiff_t)cb, ctx, delayReqForTest);}
     return RETURN_OK;
 }
 
--- ./source/private_module/spa/meta_layout/tree_object_core.c	2018-04-18 13:59:41.000000000 +0000
+++ ./source/private_module/spa/meta_layout/tree_object_core.c.hotpatch	2019-05-11 10:52:01.000000000 +0000
@@ -2010,11 +2010,9 @@
     uint64_t* nodeIdArray = NULL;
     uint32_t rsvNodeNum;
     uint32_t index;
- 
     treeObj = (TREE_OBJECT_S*)(ptrdiff_t)PVT_MOBJ_PTR(req);
     nmgr = (NODE_MGR_S*)(ptrdiff_t)PVT_NMGR_PTR(req);
     iter = (META_ITERATOR_S*)(ptrdiff_t)PVT_ITERATOR_PTR(req); 
-    
     ALLOC_BTREE_OP_CTRL(&deleteCtrl);
     if (NULL == deleteCtrl)
     {
@@ -2024,7 +2022,6 @@
                               treeObj->super.key.oid);
         return RETURN_ERROR;
     }
-
     ALLOC_BTREE_INS_OP_NODEINFO(&nodeInfo);
     if (NULL == nodeInfo)
     {
@@ -2035,15 +2032,13 @@
                               treeObj->super.key.oid);
         return RETURN_ERROR;
     }
-
     /*ʼdelete ctrl*/
     deleteCtrl->updateDataArr = &PVT_META_BEGIN(req);
     deleteCtrl->arrayLen      = (uint32_t)iter->itemNum;
     deleteCtrl->isRow         = treeObj->rowFlag;
-
     /*ʼԤnodeϢ*/
     rsvNodeNum = (uint32_t)PVT_NODE_NUM(req);
-    if (unlikely(BTREE_MAX_RSV_NODES < rsvNodeNum))
+    if (unlikely(BTREE_MAX_RSV_NODES < rsvNodeNum) && (MOBJ_VOL_EXTENT != treeObj->super.key.type))
     {
         FREE_BTREE_OP_CTRL(deleteCtrl);
         FREE_BTREE_INS_OP_NODEINFO(nodeInfo);
@@ -2051,13 +2046,18 @@
                                    rsvNodeNum, BTREE_MAX_RSV_NODES);
         return RETURN_ERROR;
     }
-    
-    nodeIdArray = &PVT_NODE_ID_BEGIN(req);
+    if (DISCRETE_KEY_CONTINUOUS_DATA == iter->batchOpType)
+    {
+        nodeIdArray = (uint64_t *)(ptrdiff_t)PVT_NODE_ID_BEGIN(req);
+    }
+    else
+    {
+        nodeIdArray = &PVT_NODE_ID_BEGIN(req);
+    }
     for (index = 0; index < rsvNodeNum; index++)
     {
         nodeInfo->reservedNewNodes[index] = nodeIdArray[index];
     }
-
     nodeInfo->usedNewNodeCnt = 0;
     nodeInfo->releasedOldNodeCnt = 0;
     nodeInfo->validNodeNum = rsvNodeNum;
@@ -6180,6 +6180,31 @@
     return;    
 }
 
+/**************************************************************************
+     :  req 
+ :  req  req
+            cb   ص
+            ctx  ص 
+ :  
+ ֵ  :  
+     :  
+**************************************************************************/
+void schedTreeObjReqForPatchTest(REQ_S  *req,void   *cb, void   *ctx, uint32_t delayReqForTest)
+{   
+    req->result           = RETURN_OK;   
+    PVT_CALLBACK_PTR(req) = (uint64_t)(ptrdiff_t)cb;
+    PVT_CALLBACK_CTX(req) = (uint64_t)(ptrdiff_t)ctx;
+
+    /* HVS modify*/
+    //ֵΪOK˵action⣬вᵼ¸ô
+    initReqAction(req, g_MobjAction);
 
+    TREE_OBJ_OP_RTT_BEGIN(req);
+    IOD_ADD_DELAY_STARTQ(delayReqForTest*1000, req);
+    DBG_LogError(META_LAYOUT_ID_0CA8,
+                     "Now delayreq for %uS.", delayReqForTest);
+    
+    return;
+}
 
 
