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

Reply via email to