blob: cb9fa0a452f818aae00cf00cf27663f8f9c35ae3 [file] [log] [blame]
/*
* 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.persistence;
import org.apache.iotdb.common.rpc.thrift.TConsensusGroupId;
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.common.rpc.thrift.TSeriesPartitionSlot;
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.confignode.consensus.request.read.GetRegionInfoListPlan;
import org.apache.iotdb.confignode.consensus.request.write.partition.CreateDataPartitionPlan;
import org.apache.iotdb.confignode.consensus.request.write.partition.CreateSchemaPartitionPlan;
import org.apache.iotdb.confignode.consensus.request.write.region.CreateRegionGroupsPlan;
import org.apache.iotdb.confignode.consensus.request.write.region.OfferRegionMaintainTasksPlan;
import org.apache.iotdb.confignode.consensus.request.write.storagegroup.SetStorageGroupPlan;
import org.apache.iotdb.confignode.consensus.response.RegionInfoListResp;
import org.apache.iotdb.confignode.persistence.partition.PartitionInfo;
import org.apache.iotdb.confignode.persistence.partition.RegionCreateTask;
import org.apache.iotdb.confignode.persistence.partition.RegionDeleteTask;
import org.apache.iotdb.confignode.rpc.thrift.TShowRegionReq;
import org.apache.iotdb.confignode.rpc.thrift.TStorageGroupSchema;
import org.apache.commons.io.FileUtils;
import org.apache.thrift.TException;
import org.junit.AfterClass;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.apache.iotdb.db.constant.TestConstant.BASE_OUTPUT_PATH;
public class PartitionInfoTest {
private static PartitionInfo partitionInfo;
private static final File snapshotDir = new File(BASE_OUTPUT_PATH, "snapshot");
public enum testFlag {
DataPartition(20),
SchemaPartition(30);
private final int flag;
testFlag(int flag) {
this.flag = flag;
}
public int getFlag() {
return flag;
}
}
@BeforeClass
public static void setup() {
partitionInfo = new PartitionInfo();
if (!snapshotDir.exists()) {
snapshotDir.mkdirs();
}
}
@AfterClass
public static void cleanup() throws IOException {
partitionInfo.clear();
if (snapshotDir.exists()) {
FileUtils.deleteDirectory(snapshotDir);
}
}
@Test
public void testSnapshot() throws TException, IOException {
partitionInfo.generateNextRegionGroupId();
// Set StorageGroup
partitionInfo.setStorageGroup(new SetStorageGroupPlan(new TStorageGroupSchema("root.test")));
// Create a SchemaRegion
CreateRegionGroupsPlan createRegionGroupsReq = new CreateRegionGroupsPlan();
TRegionReplicaSet schemaRegionReplicaSet =
generateTRegionReplicaSet(
testFlag.SchemaPartition.getFlag(),
generateTConsensusGroupId(
testFlag.SchemaPartition.getFlag(), TConsensusGroupType.SchemaRegion));
createRegionGroupsReq.addRegionGroup("root.test", schemaRegionReplicaSet);
partitionInfo.createRegionGroups(createRegionGroupsReq);
// Create a DataRegion
createRegionGroupsReq = new CreateRegionGroupsPlan();
TRegionReplicaSet dataRegionReplicaSet =
generateTRegionReplicaSet(
testFlag.DataPartition.getFlag(),
generateTConsensusGroupId(
testFlag.DataPartition.getFlag(), TConsensusGroupType.DataRegion));
createRegionGroupsReq.addRegionGroup("root.test", dataRegionReplicaSet);
partitionInfo.createRegionGroups(createRegionGroupsReq);
// Create a SchemaPartition
CreateSchemaPartitionPlan createSchemaPartitionPlan =
generateCreateSchemaPartitionReq(
testFlag.SchemaPartition.getFlag(),
generateTConsensusGroupId(
testFlag.SchemaPartition.getFlag(), TConsensusGroupType.SchemaRegion));
partitionInfo.createSchemaPartition(createSchemaPartitionPlan);
// Create a DataPartition
CreateDataPartitionPlan createDataPartitionPlan =
generateCreateDataPartitionReq(
testFlag.DataPartition.getFlag(),
generateTConsensusGroupId(
testFlag.DataPartition.getFlag(), TConsensusGroupType.DataRegion));
partitionInfo.createDataPartition(createDataPartitionPlan);
partitionInfo.offerRegionMaintainTasks(generateOfferRegionMaintainTasksPlan());
partitionInfo.processTakeSnapshot(snapshotDir);
PartitionInfo partitionInfo1 = new PartitionInfo();
partitionInfo1.processLoadSnapshot(snapshotDir);
Assert.assertEquals(partitionInfo, partitionInfo1);
}
@Test
public void testShowRegion() {
for (int i = 0; i < 2; i++) {
partitionInfo.generateNextRegionGroupId();
// Set StorageGroup
partitionInfo.setStorageGroup(
new SetStorageGroupPlan(new TStorageGroupSchema("root.test" + i)));
// Create a SchemaRegion
CreateRegionGroupsPlan createRegionGroupsPlan = new CreateRegionGroupsPlan();
TRegionReplicaSet schemaRegionReplicaSet =
generateTRegionReplicaSet(
testFlag.SchemaPartition.getFlag(),
generateTConsensusGroupId(
testFlag.SchemaPartition.getFlag(), TConsensusGroupType.SchemaRegion));
createRegionGroupsPlan.addRegionGroup("root.test" + i, schemaRegionReplicaSet);
partitionInfo.createRegionGroups(createRegionGroupsPlan);
// Create a DataRegion
createRegionGroupsPlan = new CreateRegionGroupsPlan();
TRegionReplicaSet dataRegionReplicaSet =
generateTRegionReplicaSet(
testFlag.DataPartition.getFlag(),
generateTConsensusGroupId(
testFlag.DataPartition.getFlag(), TConsensusGroupType.DataRegion));
createRegionGroupsPlan.addRegionGroup("root.test" + i, dataRegionReplicaSet);
partitionInfo.createRegionGroups(createRegionGroupsPlan);
}
GetRegionInfoListPlan regionReq = new GetRegionInfoListPlan();
TShowRegionReq showRegionReq = new TShowRegionReq();
showRegionReq.setConsensusGroupType(null);
regionReq.setShowRegionReq(showRegionReq);
RegionInfoListResp regionInfoList1 =
(RegionInfoListResp) partitionInfo.getRegionInfoList(regionReq);
Assert.assertEquals(regionInfoList1.getRegionInfoList().size(), 20);
regionInfoList1
.getRegionInfoList()
.forEach(
(regionInfo) -> {
Assert.assertEquals(regionInfo.getClientRpcIp(), "127.0.0.1");
});
showRegionReq.setConsensusGroupType(TConsensusGroupType.SchemaRegion);
RegionInfoListResp regionInfoList2 =
(RegionInfoListResp) partitionInfo.getRegionInfoList(regionReq);
Assert.assertEquals(regionInfoList2.getRegionInfoList().size(), 10);
regionInfoList2
.getRegionInfoList()
.forEach(
(regionInfo) -> {
Assert.assertEquals(
regionInfo.getConsensusGroupId().getType(), TConsensusGroupType.SchemaRegion);
});
showRegionReq.setConsensusGroupType(TConsensusGroupType.DataRegion);
RegionInfoListResp regionInfoList3 =
(RegionInfoListResp) partitionInfo.getRegionInfoList(regionReq);
Assert.assertEquals(regionInfoList3.getRegionInfoList().size(), 10);
regionInfoList3
.getRegionInfoList()
.forEach(
(regionInfo) -> {
Assert.assertEquals(
regionInfo.getConsensusGroupId().getType(), TConsensusGroupType.DataRegion);
});
showRegionReq.setConsensusGroupType(null);
showRegionReq.setStorageGroups(Collections.singletonList("root.test1"));
RegionInfoListResp regionInfoList4 =
(RegionInfoListResp) partitionInfo.getRegionInfoList(regionReq);
Assert.assertEquals(regionInfoList4.getRegionInfoList().size(), 10);
regionInfoList4
.getRegionInfoList()
.forEach(
(regionInfo) -> {
Assert.assertEquals(regionInfo.getClientRpcIp(), "127.0.0.1");
Assert.assertEquals(regionInfo.getStorageGroup(), "root.test1");
});
}
private TRegionReplicaSet generateTRegionReplicaSet(
int startFlag, TConsensusGroupId tConsensusGroupId) {
TRegionReplicaSet tRegionReplicaSet = new TRegionReplicaSet();
tRegionReplicaSet.setRegionId(tConsensusGroupId);
List<TDataNodeLocation> dataNodeLocations = new ArrayList<>();
int locationNum = 5;
for (int i = startFlag; i < locationNum + startFlag; i++) {
TDataNodeLocation tDataNodeLocation = new TDataNodeLocation();
tDataNodeLocation.setDataNodeId(i);
tDataNodeLocation.setClientRpcEndPoint(new TEndPoint("127.0.0.1", 6000 + i));
tDataNodeLocation.setInternalEndPoint(new TEndPoint("127.0.0.1", 7000 + i));
tDataNodeLocation.setMPPDataExchangeEndPoint(new TEndPoint("127.0.0.1", 8000 + i));
tDataNodeLocation.setDataRegionConsensusEndPoint(new TEndPoint("127.0.0.1", 9000 + i));
tDataNodeLocation.setSchemaRegionConsensusEndPoint(new TEndPoint("127.0.0.1", 10000 + i));
dataNodeLocations.add(tDataNodeLocation);
}
tRegionReplicaSet.setDataNodeLocations(dataNodeLocations);
return tRegionReplicaSet;
}
private OfferRegionMaintainTasksPlan generateOfferRegionMaintainTasksPlan() {
TDataNodeLocation dataNodeLocation = new TDataNodeLocation();
dataNodeLocation.setDataNodeId(0);
dataNodeLocation.setClientRpcEndPoint(new TEndPoint("0.0.0.0", 6667));
dataNodeLocation.setInternalEndPoint(new TEndPoint("0.0.0.0", 9003));
dataNodeLocation.setMPPDataExchangeEndPoint(new TEndPoint("0.0.0.0", 8777));
dataNodeLocation.setDataRegionConsensusEndPoint(new TEndPoint("0.0.0.0", 40010));
dataNodeLocation.setSchemaRegionConsensusEndPoint(new TEndPoint("0.0.0.0", 50010));
TRegionReplicaSet regionReplicaSet = new TRegionReplicaSet();
regionReplicaSet.setRegionId(new TConsensusGroupId(TConsensusGroupType.DataRegion, 0));
regionReplicaSet.setDataNodeLocations(Collections.singletonList(dataNodeLocation));
OfferRegionMaintainTasksPlan offerPlan = new OfferRegionMaintainTasksPlan();
offerPlan.appendRegionMaintainTask(
new RegionCreateTask(dataNodeLocation, "root.sg", regionReplicaSet));
offerPlan.appendRegionMaintainTask(
new RegionCreateTask(dataNodeLocation, "root.sg", regionReplicaSet).setTTL(86400));
offerPlan.appendRegionMaintainTask(
new RegionDeleteTask(
dataNodeLocation, new TConsensusGroupId(TConsensusGroupType.SchemaRegion, 2)));
return offerPlan;
}
private CreateSchemaPartitionPlan generateCreateSchemaPartitionReq(
int startFlag, TConsensusGroupId tConsensusGroupId) {
CreateSchemaPartitionPlan createSchemaPartitionPlan = new CreateSchemaPartitionPlan();
// Map<StorageGroup, Map<TSeriesPartitionSlot, TSchemaRegionPlaceInfo>>
Map<String, SchemaPartitionTable> assignedSchemaPartition = new HashMap<>();
Map<TSeriesPartitionSlot, TConsensusGroupId> relationInfo = new HashMap<>();
relationInfo.put(new TSeriesPartitionSlot(startFlag), tConsensusGroupId);
assignedSchemaPartition.put("root.test", new SchemaPartitionTable(relationInfo));
createSchemaPartitionPlan.setAssignedSchemaPartition(assignedSchemaPartition);
return createSchemaPartitionPlan;
}
private CreateDataPartitionPlan generateCreateDataPartitionReq(
int startFlag, TConsensusGroupId tConsensusGroupId) {
startFlag = startFlag / 10;
CreateDataPartitionPlan createSchemaPartitionReq = new CreateDataPartitionPlan();
// Map<StorageGroup, Map<TSeriesPartitionSlot, Map<TTimePartitionSlot, List<TRegionMessage>>>>
Map<String, DataPartitionTable> dataPartitionMap = new HashMap<>();
Map<TTimePartitionSlot, List<TConsensusGroupId>> relationInfo = new HashMap<>();
for (int i = 0; i <= startFlag; i++) {
relationInfo.put(
new TTimePartitionSlot((System.currentTimeMillis() / 1000) + i),
Collections.singletonList(tConsensusGroupId));
}
Map<TSeriesPartitionSlot, SeriesPartitionTable> slotInfo = new HashMap<>();
for (int i = 0; i <= startFlag; i++) {
slotInfo.put(new TSeriesPartitionSlot(startFlag + i), new SeriesPartitionTable(relationInfo));
}
dataPartitionMap.put("root.test", new DataPartitionTable(slotInfo));
createSchemaPartitionReq.setAssignedDataPartition(dataPartitionMap);
return createSchemaPartitionReq;
}
private TConsensusGroupId generateTConsensusGroupId(
int startFlag, TConsensusGroupType consensusGroupType) {
return new TConsensusGroupId(consensusGroupType, 111000 + startFlag);
}
}