[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"));