This is an automated email from the ASF dual-hosted git repository.

tanxinyu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 3ad58700a54 Add parameter configuration to adjust time partition 
origin (#12759)
3ad58700a54 is described below

commit 3ad58700a54da314021c1f2f5a33905b3f061a9b
Author: Xiangpeng Hu <[email protected]>
AuthorDate: Fri Jun 28 15:57:00 2024 +0800

    Add parameter configuration to adjust time partition origin (#12759)
---
 .../it/env/cluster/config/MppCommonConfig.java     |   6 +
 .../env/cluster/config/MppSharedCommonConfig.java  |   7 +
 .../it/env/remote/config/RemoteCommonConfig.java   |   5 +
 .../org/apache/iotdb/itbase/env/CommonConfig.java  |   2 +
 .../it/partition/IoTDBTimePartitionIT.java         | 150 +++++++++++++++++++++
 .../org/apache/iotdb/db/it/IoTDBRestServiceIT.java |   2 +
 .../iotdb/db/it/auth/IoTDBSeriesPermissionIT.java  |   2 +-
 .../pipe/it/manual/IoTDBPipeMetaHistoricalIT.java  |   6 +-
 .../confignode/conf/ConfigNodeStartupCheck.java    |   5 +
 .../confignode/conf/SystemPropertiesUtils.java     |  16 +++
 .../iotdb/confignode/manager/ConfigManager.java    |   1 +
 .../iotdb/confignode/manager/node/NodeManager.java |   1 +
 .../manager/schema/ClusterSchemaManager.java       |   1 +
 .../thrift/ConfigNodeRPCServiceProcessor.java      |  18 +++
 .../common/header/ColumnHeaderConstant.java        |   3 +
 .../config/metadata/GetTimeSlotListTask.java       |   6 +-
 .../config/metadata/ShowVariablesTask.java         |   6 +
 .../statement/metadata/ShowDatabaseStatement.java  |  15 ++-
 .../conf/iotdb-system.properties.template          |   8 ++
 .../apache/iotdb/commons/conf/CommonConfig.java    |  11 ++
 .../iotdb/commons/conf/CommonDescriptor.java       |   8 ++
 .../iotdb/commons/utils/TimePartitionUtils.java    |  35 ++---
 .../commons/utils/TimePartitionUtilsTest.java      |  92 +++++++++++++
 .../src/main/thrift/confignode.thrift              |   4 +
 24 files changed, 378 insertions(+), 32 deletions(-)

diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
index 095562db5a5..98e8afffd5f 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java
@@ -232,6 +232,12 @@ public class MppCommonConfig extends MppBaseConfig 
implements CommonConfig {
     return this;
   }
 
+  @Override
+  public CommonConfig setTimePartitionOrigin(long timePartitionOrigin) {
+    setProperty("time_partition_origin", String.valueOf(timePartitionOrigin));
+    return this;
+  }
+
   @Override
   public CommonConfig setTimestampPrecision(String timestampPrecision) {
     setProperty("timestamp_precision", timestampPrecision);
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
index 7724bcf09c0..0fad99bc8ae 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java
@@ -231,6 +231,13 @@ public class MppSharedCommonConfig implements CommonConfig 
{
     return this;
   }
 
+  @Override
+  public CommonConfig setTimePartitionOrigin(long timePartitionOrigin) {
+    cnConfig.setTimePartitionOrigin(timePartitionOrigin);
+    dnConfig.setTimePartitionOrigin(timePartitionOrigin);
+    return this;
+  }
+
   @Override
   public CommonConfig setTimestampPrecision(String timestampPrecision) {
     cnConfig.setTimestampPrecision(timestampPrecision);
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/config/RemoteCommonConfig.java
 
b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/config/RemoteCommonConfig.java
index 36675e64686..b70e0f645a8 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/it/env/remote/config/RemoteCommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/it/env/remote/config/RemoteCommonConfig.java
@@ -166,6 +166,11 @@ public class RemoteCommonConfig implements CommonConfig {
     return this;
   }
 
+  @Override
+  public CommonConfig setTimePartitionOrigin(long timePartitionOrigin) {
+    return this;
+  }
+
   @Override
   public CommonConfig setTimestampPrecision(String timestampPrecision) {
     return this;
diff --git 
a/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java 
b/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
index c06c45ddcd4..5b9e51d8b11 100644
--- 
a/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
+++ 
b/integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java
@@ -80,6 +80,8 @@ public interface CommonConfig {
 
   CommonConfig setTimePartitionInterval(long timePartitionInterval);
 
+  CommonConfig setTimePartitionOrigin(long timePartitionOrigin);
+
   CommonConfig setTimestampPrecision(String timestampPrecision);
 
   TimeUnit getTimestampPrecision();
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
new file mode 100644
index 00000000000..771e7cdc505
--- /dev/null
+++ 
b/integration-test/src/test/java/org/apache/iotdb/confignode/it/partition/IoTDBTimePartitionIT.java
@@ -0,0 +1,150 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.confignode.it.partition;
+
+import org.apache.iotdb.commons.client.sync.SyncConfigNodeIServiceClient;
+import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.schema.SchemaConstant;
+import org.apache.iotdb.commons.utils.TimePartitionUtils;
+import org.apache.iotdb.confignode.rpc.thrift.TGetDatabaseReq;
+import org.apache.iotdb.confignode.rpc.thrift.TShowDatabaseResp;
+import org.apache.iotdb.consensus.ConsensusFactory;
+import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
+import 
org.apache.iotdb.db.queryengine.plan.statement.metadata.ShowDatabaseStatement;
+import org.apache.iotdb.db.utils.constant.SqlConstant;
+import org.apache.iotdb.it.env.EnvFactory;
+import org.apache.iotdb.it.framework.IoTDBTestRunner;
+import org.apache.iotdb.itbase.category.ClusterIT;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+@RunWith(IoTDBTestRunner.class)
+@Category({ClusterIT.class})
+public class IoTDBTimePartitionIT {
+
+  private static final String TEST_CONSENSUS_PROTOCOL_CLASS = 
ConsensusFactory.RATIS_CONSENSUS;
+  private static final int TEST_REPLICATION_FACTOR = 3;
+  private static final long TEST_TIME_PARTITION_ORIGIN = 1000L;
+  private static final long TEST_TIME_PARTITION_INTERVAL = 3600000L;
+
+  private static final Logger LOGGER = 
LoggerFactory.getLogger(IoTDBTimePartitionIT.class);
+  private static final String INSERTION_1 =
+      "INSERT INTO root.sg1.d1(timestamp,speed,temperature) values(0, 1, 2)";
+  private static final String INSERTION_2 =
+      "INSERT INTO root.sg1.d1(timestamp,speed,temperature) values(1000, 1, 
2)";
+  private static final String INSERTION_3 =
+      "INSERT INTO root.sg1.d1(timestamp,speed,temperature) values(3601000, 1, 
2)";
+
+  private List<Long> timestatmps = Arrays.asList(0L, 1000L, 3601000L);
+
+  private static final String SHOW_TIME_PARTITION = "show timePartition where 
database = root.sg1";
+
+  private static final TGetDatabaseReq showAllDatabasesReq;
+
+  static {
+    try {
+      showAllDatabasesReq =
+          new TGetDatabaseReq(
+              Arrays.asList(
+                  new ShowDatabaseStatement(new 
PartialPath(SqlConstant.getSingleRootArray()))
+                      .getPathPattern()
+                      .getNodes()),
+              SchemaConstant.ALL_MATCH_SCOPE.serialize());
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    EnvFactory.getEnv()
+        .getConfig()
+        .getCommonConfig()
+        .setSchemaRegionConsensusProtocolClass(TEST_CONSENSUS_PROTOCOL_CLASS)
+        .setDataRegionConsensusProtocolClass(TEST_CONSENSUS_PROTOCOL_CLASS)
+        .setSchemaReplicationFactor(TEST_REPLICATION_FACTOR)
+        .setDataReplicationFactor(TEST_REPLICATION_FACTOR)
+        .setTimePartitionOrigin(TEST_TIME_PARTITION_ORIGIN)
+        .setTimePartitionInterval(TEST_TIME_PARTITION_INTERVAL);
+    // Init 1C3D environment
+    EnvFactory.getEnv().initClusterEnvironment(1, 3);
+  }
+
+  @After
+  public void tearDown() throws Exception {
+    EnvFactory.getEnv().cleanClusterEnvironment();
+  }
+
+  @Test
+  public void testTimePartition() throws Exception {
+    try (final Connection connection = EnvFactory.getEnv().getConnection();
+        final Statement statement = connection.createStatement();
+        SyncConfigNodeIServiceClient client =
+            (SyncConfigNodeIServiceClient) 
EnvFactory.getEnv().getLeaderConfigNodeConnection()) {
+
+      // create three databases
+      statement.execute(INSERTION_1);
+      statement.execute(INSERTION_2);
+      statement.execute(INSERTION_3);
+
+      // check database info
+      TShowDatabaseResp resp = client.showDatabase(showAllDatabasesReq);
+      resp.databaseInfoMap.forEach(
+          (k, v) -> {
+            assertEquals(TEST_TIME_PARTITION_ORIGIN, 
v.getTimePartitionOrigin());
+            assertEquals(TEST_TIME_PARTITION_INTERVAL, 
v.getTimePartitionInterval());
+          });
+
+      // check time partition
+      ResultSet result = statement.executeQuery(SHOW_TIME_PARTITION);
+      List<Long> timePartitions = new ArrayList<>();
+
+      while (result.next()) {
+        LOGGER.info(
+            "timePartition: {}, startTime: {}",
+            result.getLong(ColumnHeaderConstant.TIME_PARTITION),
+            result.getString(ColumnHeaderConstant.START_TIME));
+        
timePartitions.add(result.getLong(ColumnHeaderConstant.TIME_PARTITION));
+      }
+      timestatmps.forEach(
+          t -> {
+            long timePartitionId = TimePartitionUtils.getTimePartitionId(t);
+            assertTrue(timePartitions.contains(timePartitionId));
+          });
+    }
+  }
+}
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBRestServiceIT.java 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBRestServiceIT.java
index 655d34a1636..53b92918877 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBRestServiceIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/IoTDBRestServiceIT.java
@@ -1096,6 +1096,7 @@ public class IoTDBRestServiceIT {
             add("Database");
             add("SchemaReplicationFactor");
             add("DataReplicationFactor");
+            add("TimePartitionOrigin");
             add("TimePartitionInterval");
           }
         };
@@ -1747,6 +1748,7 @@ public class IoTDBRestServiceIT {
             add("Database");
             add("SchemaReplicationFactor");
             add("DataReplicationFactor");
+            add("TimePartitionOrigin");
             add("TimePartitionInterval");
           }
         };
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBSeriesPermissionIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBSeriesPermissionIT.java
index 9bd2c82b385..eee4a86dc08 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBSeriesPermissionIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/db/it/auth/IoTDBSeriesPermissionIT.java
@@ -163,7 +163,7 @@ public class IoTDBSeriesPermissionIT {
         showStorageGroupsColumnHeaders.stream()
             .map(ColumnHeader::getColumnName)
             .toArray(String[]::new),
-        new String[] {"root.test,1,1,604800000,"},
+        new String[] {"root.test,1,1,0,604800000,"},
         "test1",
         "test123");
     resultSetEqualTest(
diff --git 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeMetaHistoricalIT.java
 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeMetaHistoricalIT.java
index c785ac7f385..b6fd01a8efe 100644
--- 
a/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeMetaHistoricalIT.java
+++ 
b/integration-test/src/test/java/org/apache/iotdb/pipe/it/manual/IoTDBPipeMetaHistoricalIT.java
@@ -150,10 +150,10 @@ public class IoTDBPipeMetaHistoricalIT extends 
AbstractPipeDualManualIT {
       TestUtils.assertDataEventuallyOnEnv(
           receiverEnv,
           "show databases",
-          
"Database,SchemaReplicationFactor,DataReplicationFactor,TimePartitionInterval,",
+          
"Database,SchemaReplicationFactor,DataReplicationFactor,TimePartitionOrigin,TimePartitionInterval,",
           // Receiver's SchemaReplicationFactor/DataReplicationFactor shall be 
3/2 regardless of the
           // sender
-          Collections.singleton("root.ln,3,2,604800000,"));
+          Collections.singleton("root.ln,3,2,0,604800000,"));
       TestUtils.assertDataEventuallyOnEnv(
           receiverEnv,
           "select * from root.**",
@@ -245,7 +245,7 @@ public class IoTDBPipeMetaHistoricalIT extends 
AbstractPipeDualManualIT {
       TestUtils.assertDataAlwaysOnEnv(
           receiverEnv,
           "show databases",
-          
"Database,SchemaReplicationFactor,DataReplicationFactor,TimePartitionInterval,",
+          
"Database,SchemaReplicationFactor,DataReplicationFactor,TimePartitionOrigin,TimePartitionInterval,",
           Collections.emptySet());
       TestUtils.assertDataAlwaysOnEnv(
           receiverEnv, "select * from root.**", "Time", 
Collections.emptySet());
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeStartupCheck.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeStartupCheck.java
index 245e04934b6..ced2964ec5c 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeStartupCheck.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeStartupCheck.java
@@ -182,6 +182,11 @@ public class ConfigNodeStartupCheck extends StartupChecks {
       throw new ConfigurationException("The default_data_region_group_num 
should be positive");
     }
 
+    // Check time partition origin
+    if (COMMON_CONFIG.getTimePartitionOrigin() < 0) {
+      throw new ConfigurationException("The time_partition_origin should be 
non-negative");
+    }
+
     // Check time partition interval
     if (COMMON_CONFIG.getTimePartitionInterval() <= 0) {
       throw new ConfigurationException("The time_partition_interval should be 
positive");
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
index 65e05bccfac..edd478e053b 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/SystemPropertiesUtils.java
@@ -56,6 +56,7 @@ public class SystemPropertiesUtils {
   private static final String SCHEMA_CONSENSUS_PROTOCOL = 
"schema_region_consensus_protocol_class";
   private static final String SERIES_PARTITION_SLOT_NUM = 
"series_partition_slot_num";
   private static final String SERIES_PARTITION_EXECUTOR_CLASS = 
"series_partition_executor_class";
+  private static final String TIME_PARTITION_ORIGIN = "time_partition_origin";
   private static final String TIME_PARTITION_INTERVAL = 
"time_partition_interval";
 
   private SystemPropertiesUtils() {
@@ -177,6 +178,19 @@ public class SystemPropertiesUtils {
       conf.setSeriesPartitionExecutorClass(seriesPartitionSlotExecutorClass);
     }
 
+    if (systemProperties.getProperty(TIME_PARTITION_ORIGIN, null) != null) {
+      long timePartitionOrigin =
+          Long.parseLong(systemProperties.getProperty(TIME_PARTITION_ORIGIN));
+      if (timePartitionOrigin != COMMON_CONFIG.getTimePartitionOrigin()) {
+        LOGGER.warn(
+            format,
+            TIME_PARTITION_ORIGIN,
+            COMMON_CONFIG.getTimePartitionOrigin(),
+            timePartitionOrigin);
+        COMMON_CONFIG.setTimePartitionOrigin(timePartitionOrigin);
+      }
+    }
+
     if (systemProperties.getProperty(TIME_PARTITION_INTERVAL, null) != null) {
       long timePartitionInterval =
           
Long.parseLong(systemProperties.getProperty(TIME_PARTITION_INTERVAL));
@@ -250,6 +264,8 @@ public class SystemPropertiesUtils {
         SERIES_PARTITION_SLOT_NUM, String.valueOf(conf.getSeriesSlotNum()));
     systemProperties.setProperty(
         SERIES_PARTITION_EXECUTOR_CLASS, 
conf.getSeriesPartitionExecutorClass());
+    systemProperties.setProperty(
+        TIME_PARTITION_ORIGIN, 
String.valueOf(COMMON_CONFIG.getTimePartitionOrigin()));
     systemProperties.setProperty(
         TIME_PARTITION_INTERVAL, 
String.valueOf(COMMON_CONFIG.getTimePartitionInterval()));
     systemProperties.setProperty(TIMESTAMP_PRECISION, 
COMMON_CONFIG.getTimestampPrecision());
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
index 69b21829237..61d5c7351d6 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java
@@ -535,6 +535,7 @@ public class ConfigManager implements IManager {
     clusterParameters.setSeriesPartitionSlotNum(CONF.getSeriesSlotNum());
     
clusterParameters.setSeriesPartitionExecutorClass(CONF.getSeriesPartitionExecutorClass());
     clusterParameters.setDefaultTTL(COMMON_CONF.getDefaultTTLInMs());
+    
clusterParameters.setTimePartitionOrigin(COMMON_CONF.getTimePartitionOrigin());
     
clusterParameters.setTimePartitionInterval(COMMON_CONF.getTimePartitionInterval());
     
clusterParameters.setDataReplicationFactor(CONF.getDataReplicationFactor());
     
clusterParameters.setSchemaReplicationFactor(CONF.getSchemaReplicationFactor());
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
index 19c630f2188..4cb7945cf9d 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java
@@ -151,6 +151,7 @@ public class NodeManager {
     globalConfig.setSeriesPartitionExecutorClass(
         configNodeConfig.getSeriesPartitionExecutorClass());
     
globalConfig.setTimePartitionInterval(commonConfig.getTimePartitionInterval());
+    globalConfig.setTimePartitionOrigin(commonConfig.getTimePartitionOrigin());
     
globalConfig.setReadConsistencyLevel(configNodeConfig.getReadConsistencyLevel());
     
globalConfig.setDiskSpaceWarningThreshold(commonConfig.getDiskSpaceWarningThreshold());
     globalConfig.setTimestampPrecision(commonConfig.getTimestampPrecision());
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
index 382253d6bfc..63a06519165 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java
@@ -362,6 +362,7 @@ public class ClusterSchemaManager {
       databaseInfo.setName(database);
       
databaseInfo.setSchemaReplicationFactor(databaseSchema.getSchemaReplicationFactor());
       
databaseInfo.setDataReplicationFactor(databaseSchema.getDataReplicationFactor());
+      
databaseInfo.setTimePartitionOrigin(databaseSchema.getTimePartitionOrigin());
       
databaseInfo.setTimePartitionInterval(databaseSchema.getTimePartitionInterval());
       databaseInfo.setMinSchemaRegionNum(
           getMinRegionGroupNum(database, TConsensusGroupType.SchemaRegion));
diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
index 70c6aa7fba7..4743c397066 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java
@@ -335,6 +335,16 @@ public class ConfigNodeRPCServiceProcessor implements 
IConfigNodeRPCService.Ifac
                   "Failed to create database. The dataReplicationFactor should 
be positive.");
     }
 
+    if (!databaseSchema.isSetTimePartitionOrigin()) {
+      databaseSchema.setTimePartitionOrigin(
+          CommonDescriptor.getInstance().getConfig().getTimePartitionOrigin());
+    } else if (databaseSchema.getTimePartitionOrigin() < 0) {
+      errorResp =
+          new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+              .setMessage(
+                  "Failed to create database. The timePartitionOrigin should 
be non-negative.");
+    }
+
     if (!databaseSchema.isSetTimePartitionInterval()) {
       databaseSchema.setTimePartitionInterval(
           
CommonDescriptor.getInstance().getConfig().getTimePartitionInterval());
@@ -409,6 +419,14 @@ public class ConfigNodeRPCServiceProcessor implements 
IConfigNodeRPCService.Ifac
               .setMessage(
                   "Failed to alter database. Doesn't support ALTER 
DataReplicationFactor yet.");
     }
+
+    if (databaseSchema.isSetTimePartitionOrigin()) {
+      errorResp =
+          new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
+              .setMessage(
+                  "Failed to alter database. Doesn't support ALTER 
TimePartitionOrigin yet.");
+    }
+
     if (databaseSchema.isSetTimePartitionInterval()) {
       errorResp =
           new TSStatus(TSStatusCode.DATABASE_CONFIG_ERROR.getStatusCode())
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/ColumnHeaderConstant.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/ColumnHeaderConstant.java
index 43ba34095a4..43a2de6602a 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/ColumnHeaderConstant.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/common/header/ColumnHeaderConstant.java
@@ -55,6 +55,7 @@ public class ColumnHeaderConstant {
   public static final String COLUMN_TTL = "TTL(ms)";
   public static final String SCHEMA_REPLICATION_FACTOR = 
"SchemaReplicationFactor";
   public static final String DATA_REPLICATION_FACTOR = "DataReplicationFactor";
+  public static final String TIME_PARTITION_ORIGIN = "TimePartitionOrigin";
   public static final String TIME_PARTITION_INTERVAL = "TimePartitionInterval";
   public static final String SCHEMA_REGION_GROUP_NUM = "SchemaRegionGroupNum";
   public static final String MIN_SCHEMA_REGION_GROUP_NUM = 
"MinSchemaRegionGroupNum";
@@ -254,6 +255,7 @@ public class ColumnHeaderConstant {
           new ColumnHeader(DATABASE, TSDataType.TEXT),
           new ColumnHeader(SCHEMA_REPLICATION_FACTOR, TSDataType.INT32),
           new ColumnHeader(DATA_REPLICATION_FACTOR, TSDataType.INT32),
+          new ColumnHeader(TIME_PARTITION_ORIGIN, TSDataType.INT64),
           new ColumnHeader(TIME_PARTITION_INTERVAL, TSDataType.INT64));
 
   public static final List<ColumnHeader> showStorageGroupsDetailColumnHeaders =
@@ -261,6 +263,7 @@ public class ColumnHeaderConstant {
           new ColumnHeader(DATABASE, TSDataType.TEXT),
           new ColumnHeader(SCHEMA_REPLICATION_FACTOR, TSDataType.INT32),
           new ColumnHeader(DATA_REPLICATION_FACTOR, TSDataType.INT32),
+          new ColumnHeader(TIME_PARTITION_ORIGIN, TSDataType.INT64),
           new ColumnHeader(TIME_PARTITION_INTERVAL, TSDataType.INT64),
           new ColumnHeader(SCHEMA_REGION_GROUP_NUM, TSDataType.INT32),
           new ColumnHeader(MIN_SCHEMA_REGION_GROUP_NUM, TSDataType.INT32),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/GetTimeSlotListTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/GetTimeSlotListTask.java
index 621b49a2ff5..99f1810a759 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/GetTimeSlotListTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/GetTimeSlotListTask.java
@@ -20,7 +20,7 @@
 package org.apache.iotdb.db.queryengine.plan.execution.config.metadata;
 
 import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
-import org.apache.iotdb.commons.conf.CommonDescriptor;
+import org.apache.iotdb.commons.utils.TimePartitionUtils;
 import org.apache.iotdb.confignode.rpc.thrift.TGetTimeSlotListResp;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeader;
 import org.apache.iotdb.db.queryengine.common.header.ColumnHeaderConstant;
@@ -62,9 +62,7 @@ public class GetTimeSlotListTask implements IConfigTask {
     builder.getTimeColumnBuilder().writeLong(0L);
     builder
         .getColumnBuilder(0)
-        .writeLong(
-            timePartitionSlot.getStartTime()
-                / 
CommonDescriptor.getInstance().getConfig().getTimePartitionInterval());
+        
.writeLong(TimePartitionUtils.getTimePartitionId(timePartitionSlot.getStartTime()));
     builder
         .getColumnBuilder(1)
         .writeBinary(
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowVariablesTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowVariablesTask.java
index 2c8e63d263a..6a7dbbd6cd7 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowVariablesTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/execution/config/metadata/ShowVariablesTask.java
@@ -98,6 +98,12 @@ public class ShowVariablesTask implements IConfigTask {
             ColumnHeaderConstant.CONFIG_NODE_CONSENSUS_PROTOCOL_CLASS, 
TSFileConfig.STRING_CHARSET),
         new Binary(
             clusterParameters.getConfigNodeConsensusProtocolClass(), 
TSFileConfig.STRING_CHARSET));
+    buildTSBlock(
+        builder,
+        new Binary(ColumnHeaderConstant.TIME_PARTITION_ORIGIN, 
TSFileConfig.STRING_CHARSET),
+        new Binary(
+            String.valueOf(clusterParameters.getTimePartitionOrigin()),
+            TSFileConfig.STRING_CHARSET));
     buildTSBlock(
         builder,
         new Binary(ColumnHeaderConstant.TIME_PARTITION_INTERVAL, 
TSFileConfig.STRING_CHARSET),
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java
index 290d2eaf0f3..356336bf5ad 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/statement/metadata/ShowDatabaseStatement.java
@@ -97,14 +97,15 @@ public class ShowDatabaseStatement extends ShowStatement 
implements IConfigState
           .writeBinary(new Binary(storageGroup, TSFileConfig.STRING_CHARSET));
       
builder.getColumnBuilder(1).writeInt(storageGroupInfo.getSchemaReplicationFactor());
       
builder.getColumnBuilder(2).writeInt(storageGroupInfo.getDataReplicationFactor());
-      
builder.getColumnBuilder(3).writeLong(storageGroupInfo.getTimePartitionInterval());
+      
builder.getColumnBuilder(3).writeLong(storageGroupInfo.getTimePartitionOrigin());
+      
builder.getColumnBuilder(4).writeLong(storageGroupInfo.getTimePartitionInterval());
       if (isDetailed) {
-        
builder.getColumnBuilder(4).writeInt(storageGroupInfo.getSchemaRegionNum());
-        
builder.getColumnBuilder(5).writeInt(storageGroupInfo.getMinSchemaRegionNum());
-        
builder.getColumnBuilder(6).writeInt(storageGroupInfo.getMaxSchemaRegionNum());
-        
builder.getColumnBuilder(7).writeInt(storageGroupInfo.getDataRegionNum());
-        
builder.getColumnBuilder(8).writeInt(storageGroupInfo.getMinDataRegionNum());
-        
builder.getColumnBuilder(9).writeInt(storageGroupInfo.getMaxDataRegionNum());
+        
builder.getColumnBuilder(5).writeInt(storageGroupInfo.getSchemaRegionNum());
+        
builder.getColumnBuilder(6).writeInt(storageGroupInfo.getMinSchemaRegionNum());
+        
builder.getColumnBuilder(7).writeInt(storageGroupInfo.getMaxSchemaRegionNum());
+        
builder.getColumnBuilder(8).writeInt(storageGroupInfo.getDataRegionNum());
+        
builder.getColumnBuilder(9).writeInt(storageGroupInfo.getMinDataRegionNum());
+        
builder.getColumnBuilder(10).writeInt(storageGroupInfo.getMaxDataRegionNum());
       }
       builder.declarePosition();
     }
diff --git 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
index 4d961e9fcd4..64b87c3feb1 100644
--- 
a/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
+++ 
b/iotdb-core/node-commons/src/assembly/resources/conf/iotdb-system.properties.template
@@ -651,6 +651,14 @@ enable_auto_leader_balance_for_iot_consensus=true
 ### Cluster management
 ####################
 
+# Time partition origin in milliseconds, default is equal to zero.
+# This origin is set by default to the beginning of Unix time, which is 
January 1, 1970, at 00:00 UTC (Coordinated Universal Time).
+# This point is known as the Unix epoch, and its timestamp is 0.
+# If you want to specify a different time partition origin, you can set this 
value to a specific Unix timestamp in milliseconds.
+# effectiveMode: first_start
+# Datatype: long
+time_partition_origin=0
+
 # Time partition interval in milliseconds, and partitioning data inside each 
data region, default is equal to one week
 # effectiveMode: first_start
 # Datatype: long
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
index aef1a020a7f..d105c2cb765 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java
@@ -157,6 +157,9 @@ public class CommonConfig {
   /** Disk Monitor. */
   private double diskSpaceWarningThreshold = 0.05;
 
+  /** Time partition origin in milliseconds. */
+  private long timePartitionOrigin = 0;
+
   /** Time partition interval in milliseconds. */
   private long timePartitionInterval = 604_800_000;
 
@@ -552,6 +555,14 @@ public class CommonConfig {
     isStopping = stopping;
   }
 
+  public long getTimePartitionOrigin() {
+    return timePartitionOrigin;
+  }
+
+  public void setTimePartitionOrigin(long timePartitionOrigin) {
+    this.timePartitionOrigin = timePartitionOrigin;
+  }
+
   public long getTimePartitionInterval() {
     return timePartitionInterval;
   }
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
index eb949bae87f..84caf66bc7a 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java
@@ -229,6 +229,11 @@ public class CommonDescriptor {
             properties.getProperty(
                 "tag_attribute_total_size", 
String.valueOf(config.getTagAttributeTotalSize()))));
 
+    config.setTimePartitionOrigin(
+        Long.parseLong(
+            properties.getProperty(
+                "time_partition_origin", 
String.valueOf(config.getTimePartitionOrigin()))));
+
     config.setTimePartitionInterval(
         Long.parseLong(
             properties.getProperty(
@@ -652,6 +657,9 @@ public class CommonDescriptor {
 
   public void loadGlobalConfig(TGlobalConfig globalConfig) {
     config.setTimestampPrecision(globalConfig.timestampPrecision);
+    config.setTimePartitionOrigin(
+        CommonDateTimeUtils.convertMilliTimeWithPrecision(
+            globalConfig.timePartitionOrigin, config.getTimestampPrecision()));
     config.setTimePartitionInterval(
         CommonDateTimeUtils.convertMilliTimeWithPrecision(
             globalConfig.timePartitionInterval, 
config.getTimestampPrecision()));
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/TimePartitionUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/TimePartitionUtils.java
index b0339cb6822..4fd6d8d9ff1 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/TimePartitionUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/TimePartitionUtils.java
@@ -25,17 +25,20 @@ import org.apache.tsfile.read.filter.basic.Filter;
 
 public class TimePartitionUtils {
 
+  /**
+   * Time partition origin for dividing database, the time unit is the same 
with IoTDB's
+   * TimestampPrecision
+   */
+  private static long timePartitionOrigin =
+      CommonDescriptor.getInstance().getConfig().getTimePartitionOrigin();
+
   /** Time range for dividing database, the time unit is the same with IoTDB's 
TimestampPrecision */
   private static long timePartitionInterval =
       CommonDescriptor.getInstance().getConfig().getTimePartitionInterval();
 
   public static TTimePartitionSlot getTimePartitionSlot(long time) {
     TTimePartitionSlot timePartitionSlot = new TTimePartitionSlot();
-    if (time > 0 || time % timePartitionInterval == 0) {
-      timePartitionSlot.setStartTime(time / timePartitionInterval * 
timePartitionInterval);
-    } else {
-      timePartitionSlot.setStartTime((time / timePartitionInterval - 1) * 
timePartitionInterval);
-    }
+    timePartitionSlot.setStartTime(getTimePartitionLowerBound(time));
     return timePartitionSlot;
   }
 
@@ -43,21 +46,19 @@ public class TimePartitionUtils {
     return timePartitionInterval;
   }
 
+  public static long getTimePartitionLowerBound(long time) {
+    long lowerBoundOfTimePartition;
+    lowerBoundOfTimePartition =
+        getTimePartitionId(time) * timePartitionInterval + timePartitionOrigin;
+    return lowerBoundOfTimePartition;
+  }
+
   public static long getTimePartitionUpperBound(long time) {
-    long upperBoundOfTimePartition;
-    if (time > 0 || time % TimePartitionUtils.timePartitionInterval == 0) {
-      upperBoundOfTimePartition =
-          (time / TimePartitionUtils.timePartitionInterval + 1)
-              * TimePartitionUtils.timePartitionInterval;
-    } else {
-      upperBoundOfTimePartition =
-          (time / TimePartitionUtils.timePartitionInterval)
-              * TimePartitionUtils.timePartitionInterval;
-    }
-    return upperBoundOfTimePartition;
+    return getTimePartitionLowerBound(time) + timePartitionInterval;
   }
 
   public static long getTimePartitionId(long time) {
+    time -= timePartitionOrigin;
     return time > 0 || time % timePartitionInterval == 0
         ? time / timePartitionInterval
         : time / timePartitionInterval - 1;
@@ -75,7 +76,7 @@ public class TimePartitionUtils {
   }
 
   public static boolean satisfyTimePartition(Filter timeFilter, long 
partitionId) {
-    long partitionStartTime = partitionId * timePartitionInterval;
+    long partitionStartTime = partitionId * timePartitionInterval + 
timePartitionOrigin;
     return satisfyPartitionStartTime(timeFilter, partitionStartTime);
   }
 
diff --git 
a/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/utils/TimePartitionUtilsTest.java
 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/utils/TimePartitionUtilsTest.java
new file mode 100644
index 00000000000..372c2068186
--- /dev/null
+++ 
b/iotdb-core/node-commons/src/test/java/org/apache/iotdb/commons/utils/TimePartitionUtilsTest.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.iotdb.commons.utils;
+
+import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TimePartitionUtilsTest {
+
+  private static final long TEST_TIME_PARTITION_ORIGIN = 1000L;
+  private static final long TEST_TIME_PARTITION_INTERVAL = 3600000L;
+
+  @Before
+  public void setUp() {
+    
CommonDescriptor.getInstance().getConfig().setTimePartitionOrigin(TEST_TIME_PARTITION_ORIGIN);
+    CommonDescriptor.getInstance()
+        .getConfig()
+        .setTimePartitionInterval(TEST_TIME_PARTITION_INTERVAL);
+  }
+
+  @Test
+  public void testGetTimePartitionSlot_StartOfInterval() {
+    long testTime = TEST_TIME_PARTITION_ORIGIN;
+    TTimePartitionSlot expectedSlot = new TTimePartitionSlot();
+    expectedSlot.setStartTime(TEST_TIME_PARTITION_ORIGIN);
+
+    TTimePartitionSlot actualSlot = 
TimePartitionUtils.getTimePartitionSlot(testTime);
+    assertEquals(expectedSlot.getStartTime(), actualSlot.getStartTime());
+  }
+
+  @Test
+  public void testGetTimePartitionSlot_MiddleOfInterval() {
+    long testTime = TEST_TIME_PARTITION_ORIGIN + (TEST_TIME_PARTITION_INTERVAL 
/ 2);
+    TTimePartitionSlot expectedSlot = new TTimePartitionSlot();
+    expectedSlot.setStartTime(TEST_TIME_PARTITION_ORIGIN);
+
+    TTimePartitionSlot actualSlot = 
TimePartitionUtils.getTimePartitionSlot(testTime);
+    assertEquals(expectedSlot.getStartTime(), actualSlot.getStartTime());
+  }
+
+  @Test
+  public void testGetTimePartitionSlot_EndOfInterval() {
+    long testTime = TEST_TIME_PARTITION_ORIGIN + TEST_TIME_PARTITION_INTERVAL 
- 1;
+    TTimePartitionSlot expectedSlot = new TTimePartitionSlot();
+    expectedSlot.setStartTime(TEST_TIME_PARTITION_ORIGIN);
+
+    TTimePartitionSlot actualSlot = 
TimePartitionUtils.getTimePartitionSlot(testTime);
+    assertEquals(expectedSlot.getStartTime(), actualSlot.getStartTime());
+  }
+
+  @Test
+  public void testGetTimePartitionSlot_NegativeTime() {
+    long testTime = TEST_TIME_PARTITION_ORIGIN - 1;
+    TTimePartitionSlot expectedSlot = new TTimePartitionSlot();
+    expectedSlot.setStartTime(TEST_TIME_PARTITION_ORIGIN - 
TEST_TIME_PARTITION_INTERVAL);
+
+    TTimePartitionSlot actualSlot = 
TimePartitionUtils.getTimePartitionSlot(testTime);
+    assertEquals(expectedSlot.getStartTime(), actualSlot.getStartTime());
+  }
+
+  @Test
+  public void testGetTimePartitionSlot_NegativeBoundaryTime() {
+    long testTime = TEST_TIME_PARTITION_ORIGIN - TEST_TIME_PARTITION_INTERVAL;
+    TTimePartitionSlot expectedSlot = new TTimePartitionSlot();
+    expectedSlot.setStartTime(TEST_TIME_PARTITION_ORIGIN - 
TEST_TIME_PARTITION_INTERVAL);
+
+    TTimePartitionSlot actualSlot = 
TimePartitionUtils.getTimePartitionSlot(testTime);
+    assertEquals(expectedSlot.getStartTime(), actualSlot.getStartTime());
+  }
+}
diff --git a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift 
b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
index f218e004ede..7b39aa50743 100644
--- a/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
+++ b/iotdb-protocol/thrift-confignode/src/main/thrift/confignode.thrift
@@ -41,6 +41,7 @@ struct TGlobalConfig {
   9: optional string schemaEngineMode
   10: optional i32 tagAttributeTotalSize
   11: optional bool isEnterprise
+  12: optional i64 timePartitionOrigin
 }
 
 struct TRatisConfig {
@@ -206,6 +207,7 @@ struct TDatabaseSchema {
     7: optional i32 maxSchemaRegionGroupNum
     8: optional i32 minDataRegionGroupNum
     9: optional i32 maxDataRegionGroupNum
+    10: optional i64 timePartitionOrigin
 }
 
 // Schema
@@ -397,6 +399,7 @@ struct TClusterParameters {
   16: optional string schemaEngineMode
   17: optional i32 tagAttributeTotalSize
   18: optional i32 databaseLimitThreshold
+  19: optional i64 timePartitionOrigin
 }
 
 struct TConfigNodeRegisterReq {
@@ -577,6 +580,7 @@ struct TDatabaseInfo {
   9: required i32 dataRegionNum
   10: required i32 minDataRegionNum
   11: required i32 maxDataRegionNum
+  12: optional i64 timePartitionOrigin
 }
 
 struct TGetDatabaseReq {


Reply via email to