You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by xi...@apache.org on 2023/02/01 02:46:21 UTC
[iotdb] 01/01: fix the bug that timePartition cannot be found sometimes
This is an automated email from the ASF dual-hosted git repository.
xingtanzjr pushed a commit to branch geely_car
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit fb6ff373d911015febdf006ee33255f0bb084ccd
Author: Jinrui.Zhang <xi...@gmail.com>
AuthorDate: Tue Jan 31 23:17:42 2023 +0800
fix the bug that timePartition cannot be found sometimes
---
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 2 +-
.../mpp/plan/analyze/ClusterPartitionFetcher.java | 45 ++++++++++++++++------
2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index 0f28f2fc89..5298dc16f9 100644
--- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -875,7 +875,7 @@ public class IoTDBConfig {
* series partition
*/
private String seriesPartitionExecutorClass =
- "org.apache.iotdb.commons.partition.executor.hash.APHashExecutor";
+ "org.apache.iotdb.commons.partition.executor.hash.BKDRHashExecutor";
/** The number of series partitions in a database */
private int seriesPartitionSlotNum = 10000;
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
index 029c878114..117dc169ed 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/ClusterPartitionFetcher.java
@@ -58,9 +58,11 @@ import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Set;
public class ClusterPartitionFetcher implements IPartitionFetcher {
@@ -260,9 +262,8 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
if (null == dataPartition) {
try (ConfigNodeClient client =
configNodeClientManager.borrowClient(ConfigNodeInfo.configNodeRegionId)) {
- TDataPartitionTableResp dataPartitionTableResp =
- client.getOrCreateDataPartitionTable(
- constructDataPartitionReq(splitDataPartitionQueryParams));
+ TDataPartitionReq req = constructDataPartitionReq(splitDataPartitionQueryParams);
+ TDataPartitionTableResp dataPartitionTableResp = client.getOrCreateDataPartitionTable(req);
if (dataPartitionTableResp.getStatus().getCode()
== TSStatusCode.SUCCESS_STATUS.getStatusCode()) {
@@ -346,6 +347,22 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
}
}
+ private static class ComplexTimeSlotList {
+ Set<TTimePartitionSlot> timeSlotList;
+ boolean needLeftAll;
+ boolean needRightAll;
+
+ private ComplexTimeSlotList() {
+ timeSlotList = new HashSet<>();
+ needLeftAll = false;
+ needRightAll = false;
+ }
+
+ private void putTimeSlot(List<TTimePartitionSlot> slotList) {
+ timeSlotList.addAll(slotList);
+ }
+ }
+
private TDataPartitionReq constructDataPartitionReq(
Map<String, List<DataPartitionQueryParam>> sgNameToQueryParamsMap) {
Map<String, Map<TSeriesPartitionSlot, TTimeSlotList>> partitionSlotsMap = new HashMap<>();
@@ -353,16 +370,22 @@ public class ClusterPartitionFetcher implements IPartitionFetcher {
sgNameToQueryParamsMap.entrySet()) {
// for each sg
Map<TSeriesPartitionSlot, TTimeSlotList> deviceToTimePartitionMap = new HashMap<>();
+
+ Map<TSeriesPartitionSlot, ComplexTimeSlotList> seriesSlotTimePartitionMap = new HashMap<>();
+
for (DataPartitionQueryParam queryParam : entry.getValue()) {
- TTimeSlotList timePartitionSlotList =
- new TTimeSlotList(
- queryParam.getTimePartitionSlotList(),
- queryParam.isNeedLeftAll(),
- queryParam.isNeedRightAll());
- deviceToTimePartitionMap.put(
- partitionExecutor.getSeriesPartitionSlot(queryParam.getDevicePath()),
- timePartitionSlotList);
+ seriesSlotTimePartitionMap
+ .computeIfAbsent(
+ partitionExecutor.getSeriesPartitionSlot(queryParam.getDevicePath()),
+ k -> new ComplexTimeSlotList())
+ .putTimeSlot(queryParam.getTimePartitionSlotList());
}
+ seriesSlotTimePartitionMap.forEach(
+ (k, v) ->
+ deviceToTimePartitionMap.put(
+ k,
+ new TTimeSlotList(
+ new ArrayList<>(v.timeSlotList), v.needLeftAll, v.needRightAll)));
partitionSlotsMap.put(entry.getKey(), deviceToTimePartitionMap);
}
return new TDataPartitionReq(partitionSlotsMap);