mayankshriv commented on a change in pull request #6977: URL: https://github.com/apache/incubator-pinot/pull/6977#discussion_r640791087
########## 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: Suggestions on identifying whether it is during state transition or real 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