Jackie-Jiang commented on a change in pull request #6977:
URL: https://github.com/apache/incubator-pinot/pull/6977#discussion_r640859147



##########
File path: 
pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/TableDebugResource.java
##########
@@ -156,38 +177,94 @@ private TableDebugInfo 
debugTable(PinotHelixResourceManager pinotHelixResourceMa
    *
    * @param pinotHelixResourceManager Helix Resource Manager
    * @param tableNameWithType Name of table with type
+   * @param verbose If true, returns all segment info, else, only segments 
with errors
    * @return Debug information for segments
    */
   private List<TableDebugInfo.SegmentDebugInfo> 
debugSegments(PinotHelixResourceManager pinotHelixResourceManager,
-      String tableNameWithType) {
+      String tableNameWithType, boolean verbose) {
     ExternalView externalView = 
pinotHelixResourceManager.getTableExternalView(tableNameWithType);
     IdealState idealState = 
pinotHelixResourceManager.getTableIdealState(tableNameWithType);
 
-    List<TableDebugInfo.SegmentDebugInfo> segmentDebugInfos = new 
ArrayList<>();
+    List<TableDebugInfo.SegmentDebugInfo> result = new ArrayList<>();
     if (idealState == null) {
-      return segmentDebugInfos;
+      return result;
+    }
+
+    int serverRequestTimeoutMs = 
_controllerConf.getServerAdminRequestTimeoutSeconds() * 1000;
+    final Map<String, List<String>> serverToSegments =
+        _pinotHelixResourceManager.getServerToSegmentsMap(tableNameWithType);
+    Map<String, Map<String, SegmentServerDebugInfo>> 
segmentsDebugInfoFromServers;
+
+    BiMap<String, String> serverToEndpoints;
+    try {
+      serverToEndpoints = 
_pinotHelixResourceManager.getDataInstanceAdminEndpoints(serverToSegments.keySet());
+    } catch (InvalidConfigException e) {
+      throw new WebApplicationException(
+          "Caught exception when getting segment debug info for table: " + 
tableNameWithType);
     }
 
+    segmentsDebugInfoFromServers =
+        getSegmentsDebugInfoFromServers(tableNameWithType, serverToEndpoints, 
serverRequestTimeoutMs);
+
     for (Map.Entry<String, Map<String, String>> segmentMapEntry : 
idealState.getRecord().getMapFields().entrySet()) {
-      String segment = segmentMapEntry.getKey();
-      Map<String, String> instanceStateMap = segmentMapEntry.getValue();
+      String segmentName = segmentMapEntry.getKey();
+      Map<String, String> segmentIsMap = segmentMapEntry.getValue();
+
+      Map<String, TableDebugInfo.SegmentServerState> segmentServerState = new 
HashMap<>();
+      for (Map.Entry<String, Map<String, SegmentServerDebugInfo>> segmentEntry 
: segmentsDebugInfoFromServers
+          .entrySet()) {
+        String instanceName = segmentEntry.getKey();
 
-      List<TableDebugInfo.IsEvState> isEvStates = new ArrayList<>();
-      for (Map.Entry<String, String> entry : instanceStateMap.entrySet()) {
-        String serverName = entry.getKey();
-        String isState = entry.getValue();
+        String isState = segmentIsMap.get(instanceName);
+        String evState = (externalView != null) ? 
externalView.getStateMap(segmentName).get(instanceName) : "null";
+        Map<String, SegmentServerDebugInfo> segmentServerDebugInfoMap = 
segmentEntry.getValue();
 
-        String evState = (externalView != null) ? 
externalView.getStateMap(segment).get(serverName) : "null";
-        if (!isState.equals(evState)) {
-          isEvStates.add(new TableDebugInfo.IsEvState(serverName, isState, 
evState));
+        if (verbose || segmentHasErrors(segmentServerDebugInfoMap, isState, 
evState)) {
+          SegmentServerDebugInfo segmentServerDebugInfo = 
segmentServerDebugInfoMap.get(segmentName);
+
+          segmentServerState.put(instanceName,
+              new TableDebugInfo.SegmentServerState(isState, evState, 
segmentServerDebugInfo.getSegmentSize(),
+                  segmentServerDebugInfo.getConsumerInfo(), 
segmentServerDebugInfo.getErrorInfo()));
         }
       }
 
-      if (isEvStates.size() > 0) {
-        segmentDebugInfos.add(new TableDebugInfo.SegmentDebugInfo(segment, 
isEvStates));
+      if (!segmentServerState.isEmpty()) {
+        result.add(new TableDebugInfo.SegmentDebugInfo(segmentName, 
segmentServerState));
       }
     }
-    return segmentDebugInfos;
+
+    return result;
+  }
+
+  /**
+   * Helper method to check if a segment has any errors/issues.
+   *
+   * @param segmentServerDebugInfoMap Map from instanceName to segmentDebugInfo
+   * @param isState ideal state of segment
+   * @param evState external view of segment
+   * @return True if there's any error/issue for the segment, false otherwise.
+   */
+  private boolean segmentHasErrors(Map<String, SegmentServerDebugInfo> 
segmentServerDebugInfoMap, String isState,
+      String evState) {
+    if (!isState.equals(evState)) {
+      return true;

Review comment:
       Check if `evState` is `ERROR`




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org
For additional commands, e-mail: commits-h...@pinot.apache.org

Reply via email to