npawar commented on a change in pull request #6336: URL: https://github.com/apache/incubator-pinot/pull/6336#discussion_r550005832
########## File path: pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java ########## @@ -355,6 +355,67 @@ public SuccessResponse reloadSegment( } } + /** + * Resets the segment of the table, by disabling and then enabling it. + * This API will take segments to OFFLINE state, wait for External View to stabilize, and then back to ONLINE/CONSUMING state, + * thus effective in resetting segments or consumers in error states. + */ + @POST + @Path("segments/{tableNameWithType}/{segmentName}/reset") + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value = "Resets a segment by first disabling it, waiting for external view to stabilize, and finally enabling it again", notes = "Resets a segment by disabling and then enabling the segment") + public SuccessResponse resetSegment( + @ApiParam(value = "Name of the table with type", required = true) @PathParam("tableNameWithType") String tableNameWithType, + @ApiParam(value = "Name of the segment", required = true) @PathParam("segmentName") @Encoded String segmentName, + @ApiParam(value = "Maximum time in milliseconds to wait for reset to be completed. By default, uses serverAdminRequestTimeout") @QueryParam("maxWaitTimeMs") long maxWaitTimeMs) { + segmentName = URIUtils.decode(segmentName); + TableType tableType = TableNameBuilder.getTableTypeFromTableName(tableNameWithType); + try { + Preconditions.checkState(tableType != null, "Must provide table name with type: %s", tableNameWithType); + _pinotHelixResourceManager.resetSegment(tableNameWithType, segmentName, + maxWaitTimeMs > 0 ? maxWaitTimeMs : _controllerConf.getServerAdminRequestTimeoutSeconds() * 1000); + return new SuccessResponse( + String.format("Successfully reset segment: %s of table: %s", segmentName, tableNameWithType)); + } catch (IllegalStateException e) { + throw new ControllerApplicationException(LOGGER, + String.format("Failed to reset segments in table: %s. %s", tableNameWithType, e.getMessage()), + Status.NOT_FOUND); + } catch (Exception e) { + throw new ControllerApplicationException(LOGGER, + String.format("Failed to reset segment: %s of table: %s. %s", segmentName, tableNameWithType, e.getMessage()), + Status.INTERNAL_SERVER_ERROR); + } + } + + /** + * Resets all segments of the given table + * This API will take segments to OFFLINE state, wait for External View to stabilize, and then back to ONLINE/CONSUMING state, + * thus effective in resetting segments or consumers in error states. + */ + @POST + @Path("segments/{tableNameWithType}/reset") + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value = "Resets all segments of the table, by first disabling them, waiting for external view to stabilize, and finally enabling the segments", notes = "Resets a segment by disabling and then enabling a segment") + public SuccessResponse resetAllSegments( + @ApiParam(value = "Name of the table with type", required = true) @PathParam("tableNameWithType") String tableNameWithType, + @ApiParam(value = "Maximum time in milliseconds to wait for reset to be completed. By default, uses serverAdminRequestTimeout") @QueryParam("maxWaitTimeMs") long maxWaitTimeMs) { + TableType tableType = TableNameBuilder.getTableTypeFromTableName(tableNameWithType); + try { + Preconditions.checkState(tableType != null, "Must provide table name with type: %s", tableNameWithType); + _pinotHelixResourceManager.resetAllSegments(tableNameWithType, + maxWaitTimeMs > 0 ? maxWaitTimeMs : _controllerConf.getServerAdminRequestTimeoutSeconds() * 1000); + return new SuccessResponse(String.format("Successfully reset all segments of table: %s", tableNameWithType)); + } catch (IllegalStateException e) { + throw new ControllerApplicationException(LOGGER, + String.format("Failed to reset segments in table: %s. %s", tableNameWithType, e.getMessage()), + Status.NOT_FOUND); + } catch (Exception e) { Review comment: In case of timeout, the message will be `Timed out waiting for external view to stabilize after call to disable/reset segment: %s of table: %s. Skipping enable of segment.`. The way it is handled right now, we will return the message from the exception. And for timeout, generally 5xx response code is recommended, hence kept it with the general exception which is also 5xx. The task will not get completed if there's a timeout. We will skip the enabling (as indicated in the message). In such a case, user would have to invoke API again with increased timeout. ---------------------------------------------------------------- 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