[
https://issues.apache.org/jira/browse/PHOENIX-6907?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17738840#comment-17738840
]
ASF GitHub Bot commented on PHOENIX-6907:
-----------------------------------------
jpisaac commented on code in PR #1598:
URL: https://github.com/apache/phoenix/pull/1598#discussion_r1247320076
##########
phoenix-core/src/main/java/org/apache/phoenix/iterate/ExplainTable.java:
##########
@@ -284,6 +355,106 @@ protected void explain(String prefix, List<String>
planSteps,
}
}
+ /**
+ * Retrieve region locations and set the values in the explain plan output.
+ *
+ * @param planSteps list of plan steps to add explain plan output to.
+ * @param explainPlanAttributesBuilder explain plan v2 attributes builder
instance.
+ * @param scansList list of the list of scans, to be used for parallel
scans.
+ */
+ private void getRegionLocations(List<String> planSteps,
+ ExplainPlanAttributesBuilder
explainPlanAttributesBuilder,
+ List<List<Scan>> scansList) {
+ String regionLocationPlan =
getRegionLocationsForExplainPlan(explainPlanAttributesBuilder,
+ scansList);
+ if (regionLocationPlan.length() > 0) {
+ planSteps.add(regionLocationPlan);
+ }
+ }
+
+ /**
+ * Retrieve region locations from hbase client and set the values for the
explain plan output.
+ * If the list of region locations exceed max limit, print only list with
the max limit and
+ * print num of total list size.
+ *
+ * @param explainPlanAttributesBuilder explain plan v2 attributes builder
instance.
+ * @param scansList list of the list of scans, to be used for parallel
scans.
+ * @return region locations to be added to the explain plan output.
+ */
+ private String getRegionLocationsForExplainPlan(
+ ExplainPlanAttributesBuilder explainPlanAttributesBuilder,
+ List<List<Scan>> scansList) {
+ try {
+ StringBuilder buf = new StringBuilder().append(REGION_LOCATIONS);
+ Set<RegionBoundary> regionBoundaries = new HashSet<>();
+ List<HRegionLocation> regionLocations = new ArrayList<>();
+ for (List<Scan> scans : scansList) {
+ for (Scan eachScan : scans) {
+
getRegionsInRange(tableRef.getTable().getPhysicalName().getBytes(),
+ eachScan.getStartRow(),
+ eachScan.getStopRow(),
+ true,
+ false,
+ regionBoundaries,
+ regionLocations);
+ }
+ }
+ int maxLimitRegionLoc =
context.getConnection().getQueryServices().getConfiguration()
+
.getInt(QueryServices.MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN,
+
QueryServicesOptions.DEFAULT_MAX_REGION_LOCATIONS_SIZE_EXPLAIN_PLAN);
+ if (explainPlanAttributesBuilder != null) {
+ explainPlanAttributesBuilder.setRegionLocations(
+ Collections.unmodifiableList(regionLocations));
+ }
+ if (regionLocations.size() > maxLimitRegionLoc) {
+ int originalSize = regionLocations.size();
+ List<HRegionLocation> trimmedRegionLocations =
+ regionLocations.subList(0, maxLimitRegionLoc);
+ buf.append(trimmedRegionLocations);
+ buf.append("...total size = ");
+ buf.append(originalSize);
+ } else {
+ buf.append(regionLocations);
+ }
+ buf.append(") ");
+ return buf.toString();
+ } catch (IOException | SQLException | UnsupportedOperationException e)
{
+ LOGGER.error("Explain table unable to add region locations.", e);
+ return "";
+ }
+ }
+
+ /**
+ * Region boundary class with start and end key of the region.
+ */
+ private static class RegionBoundary {
+ private final byte[] startKey;
+ private final byte[] endKey;
+
+ RegionBoundary(byte[] startKey, byte[] endKey) {
+ this.startKey = startKey;
+ this.endKey = endKey;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) {
+ return true;
+ }
+ if (o == null || getClass() != o.getClass()) {
+ return false;
+ }
+ RegionBoundary that = (RegionBoundary) o;
+ return Bytes.compareTo(startKey, that.startKey) == 0
+ && Bytes.compareTo(endKey, that.endKey) == 0;
+ }
+
+ @Override
+ public int hashCode() {
+ return 0;
Review Comment:
why hashcode of zero?
> Explain Plan should output region locations with servers
> --------------------------------------------------------
>
> Key: PHOENIX-6907
> URL: https://issues.apache.org/jira/browse/PHOENIX-6907
> Project: Phoenix
> Issue Type: Improvement
> Reporter: Viraj Jasani
> Assignee: Viraj Jasani
> Priority: Major
> Fix For: 5.2.0, 5.1.4
>
>
> As of today, explain plan provides details related to scan key range size,
> size of the scan lists (for parallel scans), hints, client/server sorted by,
> order by, server filter etc. It provides as much close details to the
> physical plans as possible.
> If we could also make explain plan output to include region locations that
> also contains regionserver details on which the region is currently residing,
> this might turn out to be really good insights. For full table scans, this
> also means that we would end up including very higher number of region
> locations and it would not be ideal to print all of them in the output. We
> can enforce a limit on the num of region locations to print (default value
> could be 10 or so). For point lookup and range scans, we can find the region
> locations with regionserver as quite useful for the real time analysis of
> slowness experienced by the given query.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)