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 {