[ 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)