From adc7e2d09af77b395b91d785a327a1ea855d7541 Mon Sep 17 00:00:00 2001 From: shiyuhang <1136742008@qq.com> Date: Tue, 26 Mar 2024 10:17:30 +0800 Subject: [PATCH] opt --- .../tikv/operation/iterator/DAGIterator.java | 50 +++++++++++-------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/tikv-client/src/main/java/com/pingcap/tikv/operation/iterator/DAGIterator.java b/tikv-client/src/main/java/com/pingcap/tikv/operation/iterator/DAGIterator.java index 1508db989..3a9cbc975 100644 --- a/tikv-client/src/main/java/com/pingcap/tikv/operation/iterator/DAGIterator.java +++ b/tikv-client/src/main/java/com/pingcap/tikv/operation/iterator/DAGIterator.java @@ -284,28 +284,36 @@ private SelectResponse process(RegionTask regionTask) { + remainTasks.size() + " tasks not executed due to", e); - String regionSt = Arrays.toString(region.getStartKey().toByteArray()); - String regionEd = Arrays.toString(region.getEndKey().toByteArray()); - Long storeId = store == null ? 0 : store.getId(); - logger.warn( - String.format( - "region task failed. host:%s region:%s, store: %d. region start key: %s, region end key: %s", - task.getHost(), region.getId(), storeId, regionSt, regionEd)); - logger.warn("start to print range"); - for (Coprocessor.KeyRange range : ranges) { + + // We guess range may exceed bound when codes go to IndexScanIterator. Since it is hard to + // find the root cause, we just log it and retry once here. + // We use splitRangeByRegion method to avoid exceed bound issue. It seems this method can + // split range correctly. + if (e.getMessage().contains("Request range exceeds bound")) { + String regionSt = Arrays.toString(region.getStartKey().toByteArray()); + String regionEd = Arrays.toString(region.getEndKey().toByteArray()); + Long storeId = store == null ? 0 : store.getId(); logger.warn( - "Sending DAG request with range " - + Arrays.toString(range.getStart().toByteArray()) - + " to " - + Arrays.toString(range.getEnd().toByteArray())); - } - if (retryCount < 1) { - retryCount++; - logger.info("Re-splitting region task and retry once"); - remainTasks.addAll( - RangeSplitter.newSplitter(clientSession.getTiKVSession().getRegionManager()) - .splitRangeByRegion(ranges, storeType)); - continue; + String.format( + "region task failed. host:%s region:%s, store: %d. region start key: %s, region end key: %s", + task.getHost(), region.getId(), storeId, regionSt, regionEd)); + logger.warn("start to print range"); + for (Coprocessor.KeyRange range : ranges) { + logger.warn( + "Sending DAG request with range " + + Arrays.toString(range.getStart().toByteArray()) + + " to " + + Arrays.toString(range.getEnd().toByteArray())); + } + if (retryCount < 1) { + retryCount++; + remainTasks.addAll( + RangeSplitter.newSplitter(clientSession.getTiKVSession().getRegionManager()) + .splitRangeByRegion(ranges, storeType)); + logger.info( + "Re-splitting region task and retry once. Task count: " + remainTasks.size()); + continue; + } } // Rethrow to upper levels throw new RegionTaskException("Handle region task failed:", e);