You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by yo...@apache.org on 2023/11/06 07:37:38 UTC
(iotdb) 01/01: bug fix
This is an automated email from the ASF dual-hosted git repository.
yongzao pushed a commit to branch time-precision
in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 7d99db6b7a28bc327ab9802aaffe764b3b64760d
Author: YongzaoDan <53...@qq.com>
AuthorDate: Mon Nov 6 15:37:25 2023 +0800
bug fix
---
.../write/region/CreateRegionGroupsPlan.java | 63 ++++++++++++++++------
.../manager/load/balancer/RegionBalancer.java | 6 ++-
.../partition/DatabasePartitionTable.java | 8 ++-
.../persistence/partition/PartitionInfo.java | 6 ++-
.../statemachine/CreateRegionGroupsProcedure.java | 13 +++--
.../request/ConfigPhysicalPlanSerDeTest.java | 15 +++---
.../confignode/persistence/PartitionInfoTest.java | 13 +++--
.../impl/CreateRegionGroupsProcedureTest.java | 11 ++--
.../org/apache/iotdb/db/audit/AuditLogger.java | 4 +-
.../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 7 ---
.../db/queryengine/plan/parser/ASTVisitor.java | 19 ++++---
.../planner/plan/parameter/SeriesScanOptions.java | 7 +--
.../db/storageengine/dataregion/DataRegion.java | 17 +++---
.../dataregion/flush/MemTableFlushTask.java | 4 +-
.../dataregion/tsfile/TsFileResource.java | 4 +-
.../org/apache/iotdb/db/utils/DateTimeUtils.java | 14 -----
.../apache/iotdb/commons/conf/CommonConfig.java | 7 +++
.../iotdb/commons/utils/CommonDateTimeUtils.java | 15 ++++++
18 files changed, 147 insertions(+), 86 deletions(-)
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/region/CreateRegionGroupsPlan.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/region/CreateRegionGroupsPlan.java
index 14f6d851563..d2d88d39ad9 100644
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/region/CreateRegionGroupsPlan.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/consensus/request/write/region/CreateRegionGroupsPlan.java
@@ -19,6 +19,7 @@
package org.apache.iotdb.confignode.consensus.request.write.region;
+import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.commons.utils.BasicStructureSerDeUtil;
@@ -39,40 +40,48 @@ import java.util.Map.Entry;
import java.util.Objects;
import java.util.stream.Collectors;
-/** Create regions for specific StorageGroups. */
+/** Create regions for specified Databases. */
public class CreateRegionGroupsPlan extends ConfigPhysicalPlan {
- // Map<StorageGroupName, List<TRegionReplicaSet>>
+ // Map<Database, List<TRegionReplicaSet>>
protected final Map<String, List<TRegionReplicaSet>> regionGroupMap;
+ protected final Map<TConsensusGroupId, Long> regionGroupCreateTimeMap;
public CreateRegionGroupsPlan() {
super(ConfigPhysicalPlanType.CreateRegionGroups);
this.regionGroupMap = new HashMap<>();
+ this.regionGroupCreateTimeMap = new HashMap<>();
}
public CreateRegionGroupsPlan(ConfigPhysicalPlanType type) {
super(type);
this.regionGroupMap = new HashMap<>();
+ this.regionGroupCreateTimeMap = new HashMap<>();
}
public Map<String, List<TRegionReplicaSet>> getRegionGroupMap() {
return regionGroupMap;
}
- public void addRegionGroup(String storageGroup, TRegionReplicaSet regionReplicaSet) {
+ public Map<TConsensusGroupId, Long> getRegionGroupCreateTimeMap() {
+ return regionGroupCreateTimeMap;
+ }
+
+ public void addRegionGroup(String database, TRegionReplicaSet regionReplicaSet, long createTime) {
regionGroupMap
- .computeIfAbsent(storageGroup, regionReplicaSets -> new ArrayList<>())
+ .computeIfAbsent(database, regionReplicaSets -> new ArrayList<>())
.add(regionReplicaSet);
+ regionGroupCreateTimeMap.put(regionReplicaSet.getRegionId(), createTime);
}
public void planLog(Logger logger) {
for (Map.Entry<String, List<TRegionReplicaSet>> regionGroupEntry : regionGroupMap.entrySet()) {
- String storageGroup = regionGroupEntry.getKey();
+ String database = regionGroupEntry.getKey();
for (TRegionReplicaSet regionReplicaSet : regionGroupEntry.getValue()) {
logger.info(
- "[CreateRegionGroups] RegionGroup: {}, belonged StorageGroup: {}, on DataNodes: {}",
+ "[CreateRegionGroups] RegionGroup: {}, belonged database: {}, on DataNodes: {}",
regionReplicaSet.getRegionId(),
- storageGroup,
+ database,
regionReplicaSet.getDataNodeLocations().stream()
.map(TDataNodeLocation::getDataNodeId)
.collect(Collectors.toList()));
@@ -96,28 +105,46 @@ public class CreateRegionGroupsPlan extends ConfigPhysicalPlan {
stream.writeInt(regionGroupMap.size());
for (Entry<String, List<TRegionReplicaSet>> entry : regionGroupMap.entrySet()) {
- String storageGroup = entry.getKey();
+ String database = entry.getKey();
List<TRegionReplicaSet> regionReplicaSets = entry.getValue();
- BasicStructureSerDeUtil.write(storageGroup, stream);
+ BasicStructureSerDeUtil.write(database, stream);
stream.writeInt(regionReplicaSets.size());
regionReplicaSets.forEach(
regionReplicaSet ->
ThriftCommonsSerDeUtils.serializeTRegionReplicaSet(regionReplicaSet, stream));
}
+
+ stream.writeInt(regionGroupCreateTimeMap.size());
+ for (Entry<TConsensusGroupId, Long> entry : regionGroupCreateTimeMap.entrySet()) {
+ TConsensusGroupId regionId = entry.getKey();
+ long createTime = entry.getValue();
+ ThriftCommonsSerDeUtils.serializeTConsensusGroupId(regionId, stream);
+ stream.writeLong(createTime);
+ }
}
@Override
protected void deserializeImpl(ByteBuffer buffer) throws IOException {
- int storageGroupNum = buffer.getInt();
- for (int i = 0; i < storageGroupNum; i++) {
- String storageGroup = BasicStructureSerDeUtil.readString(buffer);
- regionGroupMap.put(storageGroup, new ArrayList<>());
+ int databaseNum = buffer.getInt();
+ for (int i = 0; i < databaseNum; i++) {
+ String database = BasicStructureSerDeUtil.readString(buffer);
+ regionGroupMap.put(database, new ArrayList<>());
int regionReplicaSetNum = buffer.getInt();
for (int j = 0; j < regionReplicaSetNum; j++) {
TRegionReplicaSet regionReplicaSet =
ThriftCommonsSerDeUtils.deserializeTRegionReplicaSet(buffer);
- regionGroupMap.get(storageGroup).add(regionReplicaSet);
+ regionGroupMap.get(database).add(regionReplicaSet);
+ }
+ }
+
+ if (buffer.hasRemaining()) {
+ // For compatibility
+ int regionGroupCreateTimeMapSize = buffer.getInt();
+ for (int i = 0; i < regionGroupCreateTimeMapSize; i++) {
+ TConsensusGroupId regionId = ThriftCommonsSerDeUtils.deserializeTConsensusGroupId(buffer);
+ long createTime = buffer.getLong();
+ regionGroupCreateTimeMap.put(regionId, createTime);
}
}
}
@@ -130,12 +157,16 @@ public class CreateRegionGroupsPlan extends ConfigPhysicalPlan {
if (o == null || getClass() != o.getClass()) {
return false;
}
+ if (!super.equals(o)) {
+ return false;
+ }
CreateRegionGroupsPlan that = (CreateRegionGroupsPlan) o;
- return regionGroupMap.equals(that.regionGroupMap);
+ return Objects.equals(regionGroupMap, that.regionGroupMap)
+ && Objects.equals(regionGroupCreateTimeMap, that.regionGroupCreateTimeMap);
}
@Override
public int hashCode() {
- return Objects.hash(regionGroupMap);
+ return Objects.hash(super.hashCode(), regionGroupMap, regionGroupCreateTimeMap);
}
}
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/balancer/RegionBalancer.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/balancer/RegionBalancer.java
index c9965fe036c..eb801ba1525 100644
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/balancer/RegionBalancer.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/load/balancer/RegionBalancer.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
import org.apache.iotdb.common.rpc.thrift.TDataNodeConfiguration;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.commons.cluster.NodeStatus;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.confignode.conf.ConfigNodeDescriptor;
import org.apache.iotdb.confignode.consensus.request.write.region.CreateRegionGroupsPlan;
import org.apache.iotdb.confignode.exception.DatabaseNotExistsException;
@@ -64,7 +65,7 @@ public class RegionBalancer {
/**
* Generate a RegionGroups' allocation plan(CreateRegionGroupsPlan)
*
- * @param allotmentMap Map<StorageGroupName, RegionGroup allotment>
+ * @param allotmentMap Map<DatabaseName, RegionGroup allotment>
* @param consensusGroupType TConsensusGroupType of the new RegionGroups
* @return CreateRegionGroupsPlan
* @throws NotEnoughDataNodeException When the number of DataNodes is not enough for allocation
@@ -119,7 +120,8 @@ public class RegionBalancer {
replicationFactor,
new TConsensusGroupId(
consensusGroupType, getPartitionManager().generateNextRegionGroupId()));
- createRegionGroupsPlan.addRegionGroup(database, newRegionGroup);
+ createRegionGroupsPlan.addRegionGroup(
+ database, newRegionGroup, CommonDateTimeUtils.currentTime());
// Mark the new RegionGroup as allocated
allocatedRegionGroups.add(newRegionGroup);
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/DatabasePartitionTable.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/DatabasePartitionTable.java
index bdca8aa7959..59364e4d004 100644
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/DatabasePartitionTable.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/DatabasePartitionTable.java
@@ -90,12 +90,16 @@ public class DatabasePartitionTable {
* Cache allocation result of new RegionGroups.
*
* @param replicaSets List<TRegionReplicaSet>
+ * @param regionGroupCreateTimeMap Map<RegionGroupId, create time>
*/
- public void createRegionGroups(List<TRegionReplicaSet> replicaSets) {
+ public void createRegionGroups(
+ List<TRegionReplicaSet> replicaSets, Map<TConsensusGroupId, Long> regionGroupCreateTimeMap) {
replicaSets.forEach(
replicaSet ->
regionGroupMap.put(
- replicaSet.getRegionId(), new RegionGroup(System.currentTimeMillis(), replicaSet)));
+ replicaSet.getRegionId(),
+ new RegionGroup(
+ regionGroupCreateTimeMap.get(replicaSet.getRegionId()), replicaSet)));
}
/** @return Deep copy of all Regions' RegionReplicaSet within one StorageGroup */
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java
index 710c4b91ebf..66034f362f7 100644
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java
@@ -164,8 +164,10 @@ public class PartitionInfo implements SnapshotProcessor {
plan.getRegionGroupMap()
.forEach(
- (storageGroup, regionReplicaSets) -> {
- databasePartitionTables.get(storageGroup).createRegionGroups(regionReplicaSets);
+ (database, regionReplicaSets) -> {
+ databasePartitionTables
+ .get(database)
+ .createRegionGroups(regionReplicaSets, plan.getRegionGroupCreateTimeMap());
regionReplicaSets.forEach(
regionReplicaSet ->
maxRegionId.set(
diff --git a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/statemachine/CreateRegionGroupsProcedure.java b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/statemachine/CreateRegionGroupsProcedure.java
index 9a017a43eba..caefac2a0d0 100644
--- a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/statemachine/CreateRegionGroupsProcedure.java
+++ b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/statemachine/CreateRegionGroupsProcedure.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
import org.apache.iotdb.commons.cluster.RegionStatus;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.commons.utils.ThriftCommonsSerDeUtils;
import org.apache.iotdb.confignode.consensus.request.write.region.CreateRegionGroupsPlan;
@@ -95,14 +96,15 @@ public class CreateRegionGroupsProcedure
createRegionGroupsPlan
.getRegionGroupMap()
.forEach(
- (storageGroup, regionReplicaSets) ->
+ (database, regionReplicaSets) ->
regionReplicaSets.forEach(
regionReplicaSet -> {
if (!failedRegionReplicaSets.containsKey(
regionReplicaSet.getRegionId())) {
// A RegionGroup was created successfully when
// all RegionReplicas were created successfully
- persistPlan.addRegionGroup(storageGroup, regionReplicaSet);
+ persistPlan.addRegionGroup(
+ database, regionReplicaSet, CommonDateTimeUtils.currentTime());
LOGGER.info(
"[CreateRegionGroups] All replicas of RegionGroup: {} are created successfully!",
regionReplicaSet.getRegionId());
@@ -114,7 +116,8 @@ public class CreateRegionGroupsProcedure
<= (regionReplicaSet.getDataNodeLocationsSize() - 1) / 2) {
// A RegionGroup can provide service as long as there are more than
// half of the RegionReplicas created successfully
- persistPlan.addRegionGroup(storageGroup, regionReplicaSet);
+ persistPlan.addRegionGroup(
+ database, regionReplicaSet, CommonDateTimeUtils.currentTime());
// Build recreate tasks
failedRegionReplicas
@@ -123,11 +126,11 @@ public class CreateRegionGroupsProcedure
targetDataNode -> {
RegionCreateTask createTask =
new RegionCreateTask(
- targetDataNode, storageGroup, regionReplicaSet);
+ targetDataNode, database, regionReplicaSet);
if (TConsensusGroupType.DataRegion.equals(
regionReplicaSet.getRegionId().getType())) {
try {
- createTask.setTTL(env.getTTL(storageGroup));
+ createTask.setTTL(env.getTTL(database));
} catch (DatabaseNotExistsException e) {
LOGGER.error("Can't get TTL", e);
}
diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
index 82ff95a64af..02523c99c17 100644
--- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
+++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/consensus/request/ConfigPhysicalPlanSerDeTest.java
@@ -51,6 +51,7 @@ import org.apache.iotdb.commons.sync.PipeStatus;
import org.apache.iotdb.commons.sync.TsFilePipeInfo;
import org.apache.iotdb.commons.trigger.TriggerInformation;
import org.apache.iotdb.commons.udf.UDFInformation;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.confignode.consensus.request.auth.AuthorPlan;
import org.apache.iotdb.confignode.consensus.request.read.database.CountDatabasePlan;
import org.apache.iotdb.confignode.consensus.request.read.database.GetDatabasePlan;
@@ -349,12 +350,12 @@ public class ConfigPhysicalPlanSerDeTest {
TRegionReplicaSet dataRegionSet = new TRegionReplicaSet();
dataRegionSet.setRegionId(new TConsensusGroupId(TConsensusGroupType.DataRegion, 0));
dataRegionSet.setDataNodeLocations(Collections.singletonList(dataNodeLocation));
- req0.addRegionGroup("root.sg0", dataRegionSet);
+ req0.addRegionGroup("root.sg0", dataRegionSet, CommonDateTimeUtils.currentTime());
TRegionReplicaSet schemaRegionSet = new TRegionReplicaSet();
schemaRegionSet.setRegionId(new TConsensusGroupId(TConsensusGroupType.SchemaRegion, 1));
schemaRegionSet.setDataNodeLocations(Collections.singletonList(dataNodeLocation));
- req0.addRegionGroup("root.sg1", schemaRegionSet);
+ req0.addRegionGroup("root.sg1", schemaRegionSet, CommonDateTimeUtils.currentTime());
CreateRegionGroupsPlan req1 =
(CreateRegionGroupsPlan) ConfigPhysicalPlan.Factory.create(req0.serializeToByteBuffer());
@@ -866,11 +867,13 @@ public class ConfigPhysicalPlanSerDeTest {
failedRegions.put(dataRegionGroupId, dataRegionSet);
failedRegions.put(schemaRegionGroupId, schemaRegionSet);
CreateRegionGroupsPlan createRegionGroupsPlan = new CreateRegionGroupsPlan();
- createRegionGroupsPlan.addRegionGroup("root.sg0", dataRegionSet);
- createRegionGroupsPlan.addRegionGroup("root.sg1", schemaRegionSet);
+ createRegionGroupsPlan.addRegionGroup(
+ "root.sg0", dataRegionSet, CommonDateTimeUtils.currentTime());
+ createRegionGroupsPlan.addRegionGroup(
+ "root.sg1", schemaRegionSet, CommonDateTimeUtils.currentTime());
CreateRegionGroupsPlan persistPlan = new CreateRegionGroupsPlan();
- persistPlan.addRegionGroup("root.sg0", dataRegionSet);
- persistPlan.addRegionGroup("root.sg1", schemaRegionSet);
+ persistPlan.addRegionGroup("root.sg0", dataRegionSet, CommonDateTimeUtils.currentTime());
+ persistPlan.addRegionGroup("root.sg1", schemaRegionSet, CommonDateTimeUtils.currentTime());
CreateRegionGroupsProcedure procedure0 =
new CreateRegionGroupsProcedure(
TConsensusGroupType.DataRegion, createRegionGroupsPlan, persistPlan, failedRegions);
diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/PartitionInfoTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/PartitionInfoTest.java
index f39dbae6a63..2f289dd7246 100644
--- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/PartitionInfoTest.java
+++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/persistence/PartitionInfoTest.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
import org.apache.iotdb.commons.partition.DataPartitionTable;
import org.apache.iotdb.commons.partition.SchemaPartitionTable;
import org.apache.iotdb.commons.partition.SeriesPartitionTable;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.confignode.consensus.request.ConfigPhysicalPlanType;
import org.apache.iotdb.confignode.consensus.request.read.region.GetRegionInfoListPlan;
import org.apache.iotdb.confignode.consensus.request.write.database.DatabaseSchemaPlan;
@@ -113,7 +114,8 @@ public class PartitionInfoTest {
testFlag.SchemaPartition.getFlag(),
generateTConsensusGroupId(
testFlag.SchemaPartition.getFlag(), TConsensusGroupType.SchemaRegion));
- createRegionGroupsReq.addRegionGroup("root.test", schemaRegionReplicaSet);
+ createRegionGroupsReq.addRegionGroup(
+ "root.test", schemaRegionReplicaSet, CommonDateTimeUtils.currentTime());
partitionInfo.createRegionGroups(createRegionGroupsReq);
// Create a DataRegion
@@ -123,7 +125,8 @@ public class PartitionInfoTest {
testFlag.DataPartition.getFlag(),
generateTConsensusGroupId(
testFlag.DataPartition.getFlag(), TConsensusGroupType.DataRegion));
- createRegionGroupsReq.addRegionGroup("root.test", dataRegionReplicaSet);
+ createRegionGroupsReq.addRegionGroup(
+ "root.test", dataRegionReplicaSet, CommonDateTimeUtils.currentTime());
partitionInfo.createRegionGroups(createRegionGroupsReq);
// Create a SchemaPartition
@@ -168,7 +171,8 @@ public class PartitionInfoTest {
testFlag.SchemaPartition.getFlag(),
generateTConsensusGroupId(
testFlag.SchemaPartition.getFlag(), TConsensusGroupType.SchemaRegion));
- createRegionGroupsPlan.addRegionGroup("root.test" + i, schemaRegionReplicaSet);
+ createRegionGroupsPlan.addRegionGroup(
+ "root.test" + i, schemaRegionReplicaSet, CommonDateTimeUtils.currentTime());
partitionInfo.createRegionGroups(createRegionGroupsPlan);
// Create a DataRegion
@@ -178,7 +182,8 @@ public class PartitionInfoTest {
testFlag.DataPartition.getFlag(),
generateTConsensusGroupId(
testFlag.DataPartition.getFlag(), TConsensusGroupType.DataRegion));
- createRegionGroupsPlan.addRegionGroup("root.test" + i, dataRegionReplicaSet);
+ createRegionGroupsPlan.addRegionGroup(
+ "root.test" + i, dataRegionReplicaSet, CommonDateTimeUtils.currentTime());
partitionInfo.createRegionGroups(createRegionGroupsPlan);
}
GetRegionInfoListPlan regionReq = new GetRegionInfoListPlan();
diff --git a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/CreateRegionGroupsProcedureTest.java b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/CreateRegionGroupsProcedureTest.java
index 9cd9d41301c..15108131c61 100644
--- a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/CreateRegionGroupsProcedureTest.java
+++ b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/CreateRegionGroupsProcedureTest.java
@@ -24,6 +24,7 @@ import org.apache.iotdb.common.rpc.thrift.TConsensusGroupType;
import org.apache.iotdb.common.rpc.thrift.TDataNodeLocation;
import org.apache.iotdb.common.rpc.thrift.TEndPoint;
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.confignode.consensus.request.write.region.CreateRegionGroupsPlan;
import org.apache.iotdb.confignode.procedure.impl.statemachine.CreateRegionGroupsProcedure;
import org.apache.iotdb.confignode.procedure.store.ProcedureFactory;
@@ -91,11 +92,13 @@ public class CreateRegionGroupsProcedureTest {
assertEquals(failedRegions0, failedRegions1);
CreateRegionGroupsPlan createRegionGroupsPlan = new CreateRegionGroupsPlan();
- createRegionGroupsPlan.addRegionGroup("root.sg0", dataRegionSet);
- createRegionGroupsPlan.addRegionGroup("root.sg1", schemaRegionSet);
+ createRegionGroupsPlan.addRegionGroup(
+ "root.sg0", dataRegionSet, CommonDateTimeUtils.currentTime());
+ createRegionGroupsPlan.addRegionGroup(
+ "root.sg1", schemaRegionSet, CommonDateTimeUtils.currentTime());
CreateRegionGroupsPlan persistPlan = new CreateRegionGroupsPlan();
- persistPlan.addRegionGroup("root.sg0", dataRegionSet);
- persistPlan.addRegionGroup("root.sg1", schemaRegionSet);
+ persistPlan.addRegionGroup("root.sg0", dataRegionSet, CommonDateTimeUtils.currentTime());
+ persistPlan.addRegionGroup("root.sg1", schemaRegionSet, CommonDateTimeUtils.currentTime());
CreateRegionGroupsProcedure procedure0 =
new CreateRegionGroupsProcedure(
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java
index 4db6c11ea33..aad36dbafb1 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/audit/AuditLogger.java
@@ -21,6 +21,7 @@ package org.apache.iotdb.db.audit;
import org.apache.iotdb.commons.conf.IoTDBConstant;
import org.apache.iotdb.commons.exception.IllegalPathException;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.db.auth.AuthorityChecker;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -35,7 +36,6 @@ import org.apache.iotdb.db.queryengine.plan.analyze.cache.schema.DataNodeDeviceP
import org.apache.iotdb.db.queryengine.plan.statement.Statement;
import org.apache.iotdb.db.queryengine.plan.statement.StatementType;
import org.apache.iotdb.db.queryengine.plan.statement.crud.InsertRowStatement;
-import org.apache.iotdb.db.utils.DateTimeUtils;
import org.apache.iotdb.rpc.IoTDBConnectionException;
import org.apache.iotdb.tsfile.common.conf.TSFileConfig;
import org.apache.iotdb.tsfile.enums.TSDataType;
@@ -85,7 +85,7 @@ public class AuditLogger {
InsertRowStatement insertStatement = new InsertRowStatement();
insertStatement.setDevicePath(
DEVICE_PATH_CACHE.getPartialPath(String.format(AUDIT_LOG_DEVICE, username)));
- insertStatement.setTime(DateTimeUtils.currentTime());
+ insertStatement.setTime(CommonDateTimeUtils.currentTime());
insertStatement.setMeasurements(new String[] {LOG, USERNAME, ADDRESS});
insertStatement.setAligned(false);
insertStatement.setValues(
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
index f0ec678e894..7e4d509c207 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java
@@ -799,9 +799,6 @@ public class IoTDBConfig {
private float udfCollectorMemoryBudgetInMB = (float) (1.0 / 3 * udfMemoryBudgetInMB);
- // time in nanosecond precision when starting up
- private long startUpNanosecond = System.nanoTime();
-
/** Unit: byte */
private int thriftMaxFrameSize = 536870912;
@@ -2512,10 +2509,6 @@ public class IoTDBConfig {
this.primitiveArraySize = primitiveArraySize;
}
- public long getStartUpNanosecond() {
- return startUpNanosecond;
- }
-
public int getThriftMaxFrameSize() {
return thriftMaxFrameSize;
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
index 108534f4bb7..4750d5e60af 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/parser/ASTVisitor.java
@@ -29,6 +29,7 @@ import org.apache.iotdb.commons.cq.TimeoutPolicy;
import org.apache.iotdb.commons.path.PartialPath;
import org.apache.iotdb.commons.schema.filter.SchemaFilter;
import org.apache.iotdb.commons.schema.filter.SchemaFilterFactory;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -971,7 +972,8 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
}
if (ctx.BOUNDARY() != null) {
- statement.setBoundaryTime(parseTimeValue(ctx.boundaryTime, DateTimeUtils.currentTime()));
+ statement.setBoundaryTime(
+ parseTimeValue(ctx.boundaryTime, CommonDateTimeUtils.currentTime()));
}
if (ctx.RANGE() != null) {
@@ -1511,7 +1513,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
*/
private void parseTimeRangeForGroupByTime(
IoTDBSqlParser.TimeRangeContext timeRange, GroupByTimeComponent groupByClauseComponent) {
- long currentTime = DateTimeUtils.currentTime();
+ long currentTime = CommonDateTimeUtils.currentTime();
long startTime = parseTimeValue(timeRange.timeValue(0), currentTime);
long endTime = parseTimeValue(timeRange.timeValue(1), currentTime);
groupByClauseComponent.setStartTime(startTime);
@@ -1799,10 +1801,11 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
throw new SemanticException("need timestamps when insert multi rows");
}
valueList.add(insertMultiValues.get(i).timeValue().getText());
- timestamp = DateTimeUtils.currentTime();
+ timestamp = CommonDateTimeUtils.currentTime();
} else {
timestamp =
- parseTimeValue(insertMultiValues.get(i).timeValue(), DateTimeUtils.currentTime());
+ parseTimeValue(
+ insertMultiValues.get(i).timeValue(), CommonDateTimeUtils.currentTime());
TimestampPrecisionUtils.checkTimestampPrecision(timestamp);
}
} else {
@@ -2027,7 +2030,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
throw new SemanticException("input timestamp cannot be empty");
}
if (timestampStr.equalsIgnoreCase(SqlConstant.NOW_FUNC)) {
- return DateTimeUtils.currentTime();
+ return CommonDateTimeUtils.currentTime();
}
try {
return DateTimeUtils.convertDatetimeStrToLong(timestampStr, zoneId);
@@ -3650,7 +3653,7 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
getRegionIdStatement.setDevice(ctx.device.getText());
}
if (ctx.time != null) {
- long timestamp = parseTimeValue(ctx.time, DateTimeUtils.currentTime());
+ long timestamp = parseTimeValue(ctx.time, CommonDateTimeUtils.currentTime());
getRegionIdStatement.setTimeStamp(timestamp);
}
return getRegionIdStatement;
@@ -3674,11 +3677,11 @@ public class ASTVisitor extends IoTDBSqlParserBaseVisitor<Statement> {
getTimeSlotListStatement.setRegionId(Integer.parseInt(ctx.regionId.getText()));
}
if (ctx.startTime != null) {
- long timestamp = parseTimeValue(ctx.startTime, DateTimeUtils.currentTime());
+ long timestamp = parseTimeValue(ctx.startTime, CommonDateTimeUtils.currentTime());
getTimeSlotListStatement.setStartTime(timestamp);
}
if (ctx.endTime != null) {
- long timestamp = parseTimeValue(ctx.endTime, DateTimeUtils.currentTime());
+ long timestamp = parseTimeValue(ctx.endTime, CommonDateTimeUtils.currentTime());
getTimeSlotListStatement.setEndTime(timestamp);
}
return getTimeSlotListStatement;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/SeriesScanOptions.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/SeriesScanOptions.java
index 82dd3ba5772..f2238efee2c 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/SeriesScanOptions.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/planner/plan/parameter/SeriesScanOptions.java
@@ -21,7 +21,7 @@ package org.apache.iotdb.db.queryengine.plan.planner.plan.parameter;
import org.apache.iotdb.commons.path.AlignedPath;
import org.apache.iotdb.commons.path.PartialPath;
-import org.apache.iotdb.db.utils.DateTimeUtils;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.tsfile.read.filter.TimeFilter;
import org.apache.iotdb.tsfile.read.filter.basic.Filter;
import org.apache.iotdb.tsfile.read.filter.operator.AndFilter;
@@ -100,9 +100,10 @@ public class SeriesScanOptions {
public static Filter updateFilterUsingTTL(Filter filter, long dataTTL) {
if (dataTTL != Long.MAX_VALUE) {
if (filter != null) {
- filter = new AndFilter(filter, TimeFilter.gtEq(DateTimeUtils.currentTime() - dataTTL));
+ filter =
+ new AndFilter(filter, TimeFilter.gtEq(CommonDateTimeUtils.currentTime() - dataTTL));
} else {
- filter = TimeFilter.gtEq(DateTimeUtils.currentTime() - dataTTL);
+ filter = TimeFilter.gtEq(CommonDateTimeUtils.currentTime() - dataTTL);
}
}
return filter;
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
index 3d63bc658ba..cdc2d1aa46a 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/DataRegion.java
@@ -845,7 +845,8 @@ public class DataRegion implements IDataRegionForQuery {
public void insert(InsertRowNode insertRowNode) throws WriteProcessException {
// reject insertions that are out of ttl
if (!isAlive(insertRowNode.getTime())) {
- throw new OutOfTTLException(insertRowNode.getTime(), (DateTimeUtils.currentTime() - dataTTL));
+ throw new OutOfTTLException(
+ insertRowNode.getTime(), (CommonDateTimeUtils.currentTime() - dataTTL));
}
if (enableMemControl) {
StorageEngine.blockInsertionIfReject(null);
@@ -926,7 +927,8 @@ public class DataRegion implements IDataRegionForQuery {
String.format(
"Insertion time [%s] is less than ttl time bound [%s]",
DateTimeUtils.convertLongToDate(currTime),
- DateTimeUtils.convertLongToDate(DateTimeUtils.currentTime() - dataTTL)));
+ DateTimeUtils.convertLongToDate(
+ CommonDateTimeUtils.currentTime() - dataTTL)));
loc++;
noFailure = false;
} else {
@@ -937,7 +939,7 @@ public class DataRegion implements IDataRegionForQuery {
if (loc == insertTabletNode.getRowCount()) {
throw new OutOfTTLException(
insertTabletNode.getTimes()[insertTabletNode.getTimes().length - 1],
- (DateTimeUtils.currentTime() - dataTTL));
+ (CommonDateTimeUtils.currentTime() - dataTTL));
}
// before is first start point
int before = loc;
@@ -1011,7 +1013,7 @@ public class DataRegion implements IDataRegionForQuery {
* @return whether the given time falls in ttl
*/
private boolean isAlive(long time) {
- return dataTTL == Long.MAX_VALUE || (DateTimeUtils.currentTime() - time) <= dataTTL;
+ return dataTTL == Long.MAX_VALUE || (CommonDateTimeUtils.currentTime() - time) <= dataTTL;
}
/**
@@ -1513,7 +1515,7 @@ public class DataRegion implements IDataRegionForQuery {
logger.debug("{}: TTL not set, ignore the check", databaseName + "-" + dataRegionId);
return;
}
- long ttlLowerBound = DateTimeUtils.currentTime() - dataTTL;
+ long ttlLowerBound = CommonDateTimeUtils.currentTime() - dataTTL;
logger.debug(
"{}: TTL removing files before {}",
databaseName + "-" + dataRegionId,
@@ -1764,7 +1766,7 @@ public class DataRegion implements IDataRegionForQuery {
List<TsFileResource> tsfileResourcesForQuery = new ArrayList<>();
long timeLowerBound =
- dataTTL != Long.MAX_VALUE ? DateTimeUtils.currentTime() - dataTTL : Long.MIN_VALUE;
+ dataTTL != Long.MAX_VALUE ? CommonDateTimeUtils.currentTime() - dataTTL : Long.MIN_VALUE;
context.setQueryTimeLowerBound(timeLowerBound);
for (TsFileResource tsFileResource : tsFileResources) {
@@ -2742,7 +2744,8 @@ public class DataRegion implements IDataRegionForQuery {
String.format(
"Insertion time [%s] is less than ttl time bound [%s]",
DateTimeUtils.convertLongToDate(insertRowNode.getTime()),
- DateTimeUtils.convertLongToDate(DateTimeUtils.currentTime() - dataTTL))));
+ DateTimeUtils.convertLongToDate(
+ CommonDateTimeUtils.currentTime() - dataTTL))));
continue;
}
// init map
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
index 19450cbe9fc..1cf48033c63 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/flush/MemTableFlushTask.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.commons.schema.SchemaConstant;
import org.apache.iotdb.commons.service.metric.MetricService;
import org.apache.iotdb.commons.service.metric.enums.Metric;
import org.apache.iotdb.commons.service.metric.enums.Tag;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.service.metrics.WritingMetrics;
@@ -31,7 +32,6 @@ import org.apache.iotdb.db.storageengine.dataregion.memtable.IMemTable;
import org.apache.iotdb.db.storageengine.dataregion.memtable.IWritableMemChunk;
import org.apache.iotdb.db.storageengine.dataregion.memtable.IWritableMemChunkGroup;
import org.apache.iotdb.db.storageengine.rescon.memory.SystemInfo;
-import org.apache.iotdb.db.utils.DateTimeUtils;
import org.apache.iotdb.metrics.utils.MetricLevel;
import org.apache.iotdb.tsfile.write.chunk.IChunkWriter;
import org.apache.iotdb.tsfile.write.writer.RestorableTsFileIOWriter;
@@ -303,7 +303,7 @@ public class MemTableFlushTask {
lastIndex = storageGroup.length();
}
String storageGroupName = storageGroup.substring(0, lastIndex);
- long currentTime = DateTimeUtils.currentTime();
+ long currentTime = CommonDateTimeUtils.currentTime();
// compute the flush points
long writeTime =
flushPointsCache.compute(
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
index 75f88327a16..0e228cbc7e0 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/tsfile/TsFileResource.java
@@ -22,6 +22,7 @@ import org.apache.iotdb.commons.consensus.index.ProgressIndex;
import org.apache.iotdb.commons.consensus.index.ProgressIndexType;
import org.apache.iotdb.commons.consensus.index.impl.MinimumProgressIndex;
import org.apache.iotdb.commons.path.PartialPath;
+import org.apache.iotdb.commons.utils.CommonDateTimeUtils;
import org.apache.iotdb.commons.utils.TestOnly;
import org.apache.iotdb.db.conf.IoTDBConfig;
import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -37,7 +38,6 @@ import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.FileTimeInd
import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.ITimeIndex;
import org.apache.iotdb.db.storageengine.dataregion.tsfile.timeindex.TimeIndexLevel;
import org.apache.iotdb.db.storageengine.rescon.disk.TierManager;
-import org.apache.iotdb.db.utils.DateTimeUtils;
import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
import org.apache.iotdb.tsfile.file.metadata.IChunkMetadata;
import org.apache.iotdb.tsfile.file.metadata.ITimeSeriesMetadata;
@@ -804,7 +804,7 @@ public class TsFileResource {
/** @return whether the given time falls in ttl */
private boolean isAlive(long time, long dataTTL) {
- return dataTTL == Long.MAX_VALUE || (DateTimeUtils.currentTime() - time) <= dataTTL;
+ return dataTTL == Long.MAX_VALUE || (CommonDateTimeUtils.currentTime() - time) <= dataTTL;
}
public void setProcessor(TsFileProcessor processor) {
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
index 48befee79cd..278122486d5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/utils/DateTimeUtils.java
@@ -20,7 +20,6 @@ package org.apache.iotdb.db.utils;
import org.apache.iotdb.commons.conf.CommonDescriptor;
import org.apache.iotdb.commons.utils.TestOnly;
-import org.apache.iotdb.db.conf.IoTDBDescriptor;
import org.apache.iotdb.db.protocol.session.SessionManager;
import org.apache.iotdb.tsfile.utils.TimeDuration;
@@ -666,19 +665,6 @@ public class DateTimeUtils {
}
}
- public static long currentTime() {
- long startupNano = IoTDBDescriptor.getInstance().getConfig().getStartUpNanosecond();
- String timePrecision = CommonDescriptor.getInstance().getConfig().getTimestampPrecision();
- switch (timePrecision) {
- case "ns":
- return System.currentTimeMillis() * 1000_000 + (System.nanoTime() - startupNano) % 1000_000;
- case "us":
- return System.currentTimeMillis() * 1000 + (System.nanoTime() - startupNano) / 1000 % 1000;
- default:
- return System.currentTimeMillis();
- }
- }
-
public static String convertLongToDate(long timestamp) {
return convertLongToDate(
timestamp, CommonDescriptor.getInstance().getConfig().getTimestampPrecision());
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 e4abbc10f89..48a3a30dda9 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
@@ -209,6 +209,9 @@ public class CommonConfig {
private long seriesLimitThreshold = -1;
private long deviceLimitThreshold = -1;
+ // time in nanosecond precision when starting up
+ private final long startUpNanosecond = System.nanoTime();
+
CommonConfig() {
// Empty constructor
}
@@ -835,4 +838,8 @@ public class CommonConfig {
public void setDeviceLimitThreshold(long deviceLimitThreshold) {
this.deviceLimitThreshold = deviceLimitThreshold;
}
+
+ public long getStartUpNanosecond() {
+ return startUpNanosecond;
+ }
}
diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/CommonDateTimeUtils.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/CommonDateTimeUtils.java
index 3d65058abc9..2723c545265 100644
--- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/CommonDateTimeUtils.java
+++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/CommonDateTimeUtils.java
@@ -19,6 +19,8 @@
package org.apache.iotdb.commons.utils;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
+
public class CommonDateTimeUtils {
public CommonDateTimeUtils() {
@@ -39,4 +41,17 @@ public class CommonDateTimeUtils {
}
return result;
}
+
+ public static long currentTime() {
+ long startupNano = CommonDescriptor.getInstance().getConfig().getStartUpNanosecond();
+ String timePrecision = CommonDescriptor.getInstance().getConfig().getTimestampPrecision();
+ switch (timePrecision) {
+ case "ns":
+ return System.currentTimeMillis() * 1000_000 + (System.nanoTime() - startupNano) % 1000_000;
+ case "us":
+ return System.currentTimeMillis() * 1000 + (System.nanoTime() - startupNano) / 1000 % 1000;
+ default:
+ return System.currentTimeMillis();
+ }
+ }
}