This is an automated email from the ASF dual-hosted git repository. marklau99 pushed a commit to branch fix-npe-in-cpu-metrics in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit c5d269369240ed4bf34c019a2376042c1f0f1618 Author: YongzaoDan <[email protected]> AuthorDate: Mon Jun 19 17:59:00 2023 +0800 [IOTDB-5998] Fix device query bugs in show slot APIs (#10209) --- .../manager/partition/PartitionManager.java | 17 +++++++++ .../manager/schema/ClusterSchemaManager.java | 16 +++++++++ .../persistence/partition/PartitionInfo.java | 42 +++++++--------------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java index 4b1f962b525..1d9d4c95756 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/partition/PartitionManager.java @@ -96,6 +96,7 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Queue; import java.util.Set; @@ -853,8 +854,14 @@ public class PartitionManager { if (req.isSetDatabase()) { plan.setDatabase(req.getDatabase()); } else { + plan.setDatabase(getClusterSchemaManager().getDatabaseNameByDevice(req.getDevice())); plan.setSeriesSlotId(executor.getSeriesPartitionSlot(req.getDevice())); } + if (Objects.equals(plan.getDatabase(), "")) { + // Return empty result if Database not specified + return new GetRegionIdResp(RpcUtils.SUCCESS_STATUS, new ArrayList<>()); + } + if (req.isSetTimeStamp()) { plan.setTimeSlotId( new TTimePartitionSlot( @@ -870,7 +877,12 @@ public class PartitionManager { if (req.isSetDatabase()) { plan.setDatabase(req.getDatabase()); } else if (req.isSetDevice()) { + plan.setDatabase(getClusterSchemaManager().getDatabaseNameByDevice(req.getDevice())); plan.setSeriesSlotId(executor.getSeriesPartitionSlot(req.getDevice())); + if (Objects.equals(plan.getDatabase(), "")) { + // Return empty result if Database not specified + return new GetTimeSlotListResp(RpcUtils.SUCCESS_STATUS, new ArrayList<>()); + } } else { plan.setRegionId( new TConsensusGroupId(TConsensusGroupType.DataRegion, (int) req.getRegionId())); @@ -885,7 +897,12 @@ public class PartitionManager { if (req.isSetDatabase()) { plan.setDatabase(req.getDatabase()); } else if (req.isSetDevice()) { + plan.setDatabase(getClusterSchemaManager().getDatabaseNameByDevice(req.getDevice())); plan.setSeriesSlotId(executor.getSeriesPartitionSlot(req.getDevice())); + if (Objects.equals(plan.getDatabase(), "")) { + // Return empty result if Database not specified + return new CountTimeSlotListResp(RpcUtils.SUCCESS_STATUS, 0); + } } else { plan.setRegionId( new TConsensusGroupId(TConsensusGroupType.DataRegion, (int) req.getRegionId())); diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java b/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java index 355e6744878..b000b213db1 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/manager/schema/ClusterSchemaManager.java @@ -26,6 +26,7 @@ import org.apache.iotdb.commons.exception.IllegalPathException; import org.apache.iotdb.commons.exception.MetadataException; import org.apache.iotdb.commons.path.PartialPath; import org.apache.iotdb.commons.service.metric.MetricService; +import org.apache.iotdb.commons.utils.PathUtils; import org.apache.iotdb.commons.utils.StatusUtils; import org.apache.iotdb.confignode.client.DataNodeRequestType; import org.apache.iotdb.confignode.client.async.AsyncDataNodeClientPool; @@ -525,6 +526,21 @@ public class ClusterSchemaManager { return clusterSchemaInfo.getMatchedDatabaseSchemaByName(database); } + /** + * Only leader use this interface. + * + * @return The DatabaseName of the specified Device. Empty String if not exists. + */ + public String getDatabaseNameByDevice(String devicePath) { + List<String> databases = getDatabaseNames(); + for (String database : databases) { + if (PathUtils.isStartWith(devicePath, database)) { + return database; + } + } + return ""; + } + /** * Only leader use this interface. Get the specified Databases' schema * diff --git a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java index 6771f17d75b..0a31ef5de68 100644 --- a/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java +++ b/confignode/src/main/java/org/apache/iotdb/confignode/persistence/partition/PartitionInfo.java @@ -862,37 +862,21 @@ public class PartitionInfo implements SnapshotProcessor { * @return GetRegionIdResp with STATUS and List<TConsensusGroupId>. */ public DataSet getRegionId(GetRegionIdPlan plan) { - if (!plan.getDatabase().equals("")) { - // get regionId of specific database. - if (!isDatabaseExisted(plan.getDatabase())) { - return new GetRegionIdResp( - new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), new ArrayList<>()); - } else { - DatabasePartitionTable sgPartitionTable = databasePartitionTables.get(plan.getDatabase()); - return new GetRegionIdResp( - new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), - sgPartitionTable - .getRegionId(plan.getPartitionType(), plan.getSeriesSlotId(), plan.getTimeSlotId()) - .stream() - .distinct() - .sorted(Comparator.comparing(TConsensusGroupId::getId)) - .collect(Collectors.toList())); - } - } else { - // get regionId of specific seriesSlotId(device). - List<TConsensusGroupId> regionIds = new ArrayList<>(); - databasePartitionTables.forEach( - (database, databasePartitionTable) -> - regionIds.addAll( - databasePartitionTable.getRegionId( - plan.getPartitionType(), plan.getSeriesSlotId(), plan.getTimeSlotId()))); + if (!isDatabaseExisted(plan.getDatabase())) { + // Return empty result if Database doesn't exist return new GetRegionIdResp( - new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), - regionIds.stream() - .distinct() - .sorted(Comparator.comparing(TConsensusGroupId::getId)) - .collect(Collectors.toList())); + new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), new ArrayList<>()); } + + DatabasePartitionTable databasePartitionTable = databasePartitionTables.get(plan.getDatabase()); + return new GetRegionIdResp( + new TSStatus(TSStatusCode.SUCCESS_STATUS.getStatusCode()), + databasePartitionTable + .getRegionId(plan.getPartitionType(), plan.getSeriesSlotId(), plan.getTimeSlotId()) + .stream() + .distinct() + .sorted(Comparator.comparing(TConsensusGroupId::getId)) + .collect(Collectors.toList())); } /**
