[IOTDB-4543] Fix error in calculating time partition slot (#7443)
diff --git a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngineV2.java b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngineV2.java
index 807a3e5..6bfe588 100644
--- a/server/src/main/java/org/apache/iotdb/db/engine/StorageEngineV2.java
+++ b/server/src/main/java/org/apache/iotdb/db/engine/StorageEngineV2.java
@@ -55,6 +55,7 @@
import org.apache.iotdb.db.rescon.SystemInfo;
import org.apache.iotdb.db.sync.SyncService;
import org.apache.iotdb.db.utils.ThreadUtils;
+import org.apache.iotdb.db.utils.TimePartitionUtils;
import org.apache.iotdb.db.utils.UpgradeUtils;
import org.apache.iotdb.db.wal.WALManager;
import org.apache.iotdb.db.wal.exception.WALException;
@@ -147,26 +148,10 @@
private static void initTimePartition() {
timePartitionIntervalForStorage =
- convertMilliWithPrecision(
+ TimePartitionUtils.convertMilliWithPrecision(
IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForStorage() * 1000L);
}
- public static long convertMilliWithPrecision(long milliTime) {
- long result = milliTime;
- String timePrecision = IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
- switch (timePrecision) {
- case "ns":
- result = milliTime * 1000_000L;
- break;
- case "us":
- result = milliTime * 1000L;
- break;
- default:
- break;
- }
- return result;
- }
-
public static long getTimePartitionIntervalForStorage() {
if (timePartitionIntervalForStorage == -1) {
initTimePartition();
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
index a58aafc..0ea0242 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/analyze/AnalyzeVisitor.java
@@ -1502,8 +1502,7 @@
List<TTimePartitionSlot> timePartitionSlots = new ArrayList<>();
String device = entry.getKey();
long endTime = device2MaxTime.get(device);
- long interval =
- IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting();
+ long interval = TimePartitionUtils.timePartitionIntervalForRouting;
long time = (entry.getValue() / interval) * interval;
for (; time <= endTime; time += interval) {
timePartitionSlots.add(TimePartitionUtils.getTimePartitionForRouting(time));
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
index 0b5742e..76d0cc7 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/planner/plan/node/write/InsertTabletNode.java
@@ -23,8 +23,6 @@
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.utils.TestOnly;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.conf.ServerConfigConsistent;
import org.apache.iotdb.db.mpp.common.schematree.DeviceSchemaInfo;
import org.apache.iotdb.db.mpp.common.schematree.ISchemaTree;
import org.apache.iotdb.db.mpp.plan.analyze.Analysis;
@@ -71,10 +69,6 @@
private static final String DATATYPE_UNSUPPORTED = "Data type %s is not supported.";
- @ServerConfigConsistent
- private long timePartitionIntervalForRouting =
- IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting();
-
private long[] times; // times should be sorted. It is done in the session API.
private BitMap[] bitMaps;
@@ -216,8 +210,9 @@
return Collections.emptyList();
}
long startTime =
- (times[0] / timePartitionIntervalForRouting) * timePartitionIntervalForRouting; // included
- long endTime = startTime + timePartitionIntervalForRouting; // excluded
+ (times[0] / TimePartitionUtils.timePartitionIntervalForRouting)
+ * TimePartitionUtils.timePartitionIntervalForRouting; // included
+ long endTime = startTime + TimePartitionUtils.timePartitionIntervalForRouting; // excluded
TTimePartitionSlot timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[0]);
int startLoc = 0; // included
@@ -234,7 +229,8 @@
startLoc = i;
startTime = endTime;
endTime =
- (times[i] / timePartitionIntervalForRouting + 1) * timePartitionIntervalForRouting;
+ (times[i] / TimePartitionUtils.timePartitionIntervalForRouting + 1)
+ * TimePartitionUtils.timePartitionIntervalForRouting;
timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[i]);
}
}
@@ -307,15 +303,17 @@
public List<TTimePartitionSlot> getTimePartitionSlots() {
List<TTimePartitionSlot> result = new ArrayList<>();
long startTime =
- (times[0] / timePartitionIntervalForRouting) * timePartitionIntervalForRouting; // included
- long endTime = startTime + timePartitionIntervalForRouting; // excluded
+ (times[0] / TimePartitionUtils.timePartitionIntervalForRouting)
+ * TimePartitionUtils.timePartitionIntervalForRouting; // included
+ long endTime = startTime + TimePartitionUtils.timePartitionIntervalForRouting; // excluded
TTimePartitionSlot timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[0]);
for (int i = 1; i < times.length; i++) { // times are sorted in session API.
if (times[i] >= endTime) {
result.add(timePartitionSlot);
// next init
endTime =
- (times[i] / timePartitionIntervalForRouting + 1) * timePartitionIntervalForRouting;
+ (times[i] / TimePartitionUtils.timePartitionIntervalForRouting + 1)
+ * TimePartitionUtils.timePartitionIntervalForRouting;
timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[i]);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
index e720790..77a3eee 100644
--- a/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
+++ b/server/src/main/java/org/apache/iotdb/db/mpp/plan/statement/crud/InsertTabletStatement.java
@@ -23,8 +23,6 @@
import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
import org.apache.iotdb.commons.partition.DataPartition;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
-import org.apache.iotdb.db.conf.ServerConfigConsistent;
import org.apache.iotdb.db.mpp.plan.constant.StatementType;
import org.apache.iotdb.db.mpp.plan.statement.StatementVisitor;
import org.apache.iotdb.db.utils.TimePartitionUtils;
@@ -36,10 +34,6 @@
public class InsertTabletStatement extends InsertBaseStatement {
- @ServerConfigConsistent
- private long timePartitionIntervalForRouting =
- IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting();
-
private long[] times; // times should be sorted. It is done in the session API.
private BitMap[] bitMaps;
private Object[] columns;
@@ -95,15 +89,17 @@
public List<TTimePartitionSlot> getTimePartitionSlots() {
List<TTimePartitionSlot> result = new ArrayList<>();
long startTime =
- (times[0] / timePartitionIntervalForRouting) * timePartitionIntervalForRouting; // included
- long endTime = startTime + timePartitionIntervalForRouting; // excluded
+ (times[0] / TimePartitionUtils.timePartitionIntervalForRouting)
+ * TimePartitionUtils.timePartitionIntervalForRouting; // included
+ long endTime = startTime + TimePartitionUtils.timePartitionIntervalForRouting; // excluded
TTimePartitionSlot timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[0]);
for (int i = 1; i < times.length; i++) { // times are sorted in session API.
if (times[i] >= endTime) {
result.add(timePartitionSlot);
// next init
endTime =
- (times[i] / timePartitionIntervalForRouting + 1) * timePartitionIntervalForRouting;
+ (times[i] / TimePartitionUtils.timePartitionIntervalForRouting + 1)
+ * TimePartitionUtils.timePartitionIntervalForRouting;
timePartitionSlot = TimePartitionUtils.getTimePartitionForRouting(times[i]);
}
}
diff --git a/server/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java b/server/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
index b082e94..3376699 100644
--- a/server/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
+++ b/server/src/main/java/org/apache/iotdb/db/utils/TimePartitionUtils.java
@@ -25,8 +25,9 @@
public class TimePartitionUtils {
@ServerConfigConsistent
- private static long timePartitionIntervalForRouting =
- IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting();
+ public static long timePartitionIntervalForRouting =
+ convertMilliWithPrecision(
+ IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting() * 1000L);
public static TTimePartitionSlot getTimePartitionForRouting(long time) {
TTimePartitionSlot timePartitionSlot = new TTimePartitionSlot();
@@ -34,6 +35,22 @@
return timePartitionSlot;
}
+ public static long convertMilliWithPrecision(long milliTime) {
+ long result = milliTime;
+ String timePrecision = IoTDBDescriptor.getInstance().getConfig().getTimestampPrecision();
+ switch (timePrecision) {
+ case "ns":
+ result = milliTime * 1000_000L;
+ break;
+ case "us":
+ result = milliTime * 1000L;
+ break;
+ default:
+ break;
+ }
+ return result;
+ }
+
@TestOnly
public static void setTimePartitionIntervalForRouting(long timePartitionIntervalForRouting) {
TimePartitionUtils.timePartitionIntervalForRouting = timePartitionIntervalForRouting;
diff --git a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/write/WritePlanNodeSplitTest.java b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/write/WritePlanNodeSplitTest.java
index fb8c77b..1209b8d 100644
--- a/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/write/WritePlanNodeSplitTest.java
+++ b/server/src/test/java/org/apache/iotdb/db/mpp/plan/plan/node/write/WritePlanNodeSplitTest.java
@@ -93,8 +93,7 @@
Map<TTimePartitionSlot, List<TRegionReplicaSet>> timePartitionSlotMap = new HashMap<>();
for (int t = 0; t < 5; t++) {
timePartitionSlotMap.put(
- new TTimePartitionSlot(
- t * IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting()),
+ new TTimePartitionSlot(t * TimePartitionUtils.timePartitionIntervalForRouting),
Collections.singletonList(
new TRegionReplicaSet(
new TConsensusGroupId(TConsensusGroupType.DataRegion, t), null)));
@@ -111,8 +110,7 @@
Map<TTimePartitionSlot, List<TRegionReplicaSet>> timePartitionSlotMap = new HashMap<>();
for (int t = 0; t < 5; t++) {
timePartitionSlotMap.put(
- new TTimePartitionSlot(
- t * IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting()),
+ new TTimePartitionSlot(t * TimePartitionUtils.timePartitionIntervalForRouting),
Collections.singletonList(
new TRegionReplicaSet(
new TConsensusGroupId(TConsensusGroupType.DataRegion, 5), null)));
@@ -268,8 +266,7 @@
for (int i = 0; i < 5; i++) {
InsertRowNode insertRowNode = new InsertRowNode(new PlanNodeId("plan node 3"));
insertRowNode.setDevicePath(new PartialPath(String.format("root.sg1.d%d", i)));
- insertRowNode.setTime(
- i * IoTDBDescriptor.getInstance().getConfig().getTimePartitionIntervalForRouting());
+ insertRowNode.setTime(i * TimePartitionUtils.timePartitionIntervalForRouting);
insertRowsNode.addOneInsertRowNode(insertRowNode, 2 * i);
insertRowNode = new InsertRowNode(new PlanNodeId("plan node 3"));