This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new 4551d4f713 Moving deleteSegment call from POST to DELETE call (#12663) 4551d4f713 is described below commit 4551d4f713345f3cfab8fc037f375bc635fe54c7 Author: Pratik Tibrewal <tibrewalpra...@uber.com> AuthorDate: Fri Mar 22 04:22:53 2024 +0530 Moving deleteSegment call from POST to DELETE call (#12663) --- .../api/resources/PinotSegmentRestletResource.java | 26 ++++++++++++---- .../api/PinotSegmentRestletResourceTest.java | 35 ++++++++++++++++++++++ .../utils/builder/ControllerRequestURLBuilder.java | 10 +++++++ 3 files changed, 65 insertions(+), 6 deletions(-) diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java index 03897f2456..b1d12a1f97 100644 --- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java +++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotSegmentRestletResource.java @@ -666,14 +666,17 @@ public class PinotSegmentRestletResource { @Path("/segments/{tableName}") @Authorize(targetType = TargetType.TABLE, paramName = "tableName", action = Actions.Table.DELETE_SEGMENT) @Authenticate(AccessType.DELETE) - @ApiOperation(value = "Delete all segments", notes = "Delete all segments") - public SuccessResponse deleteAllSegments( + @ApiOperation(value = "Delete the list of segments provided in the queryParam else all segments", + notes = "Delete the list of segments provided in the queryParam else all segments") + public SuccessResponse deleteMultipleSegments( @ApiParam(value = "Name of the table", required = true) @PathParam("tableName") String tableName, @ApiParam(value = "OFFLINE|REALTIME", required = true) @QueryParam("type") String tableTypeStr, @ApiParam(value = "Retention period for the table segments (e.g. 12h, 3d); If not set, the retention period " + "will default to the first config that's not null: the table config, then to cluster setting, then '7d'. " + "Using 0d or -1d will instantly delete segments without retention") - @QueryParam("retention") String retentionPeriod, @Context HttpHeaders headers) { + @QueryParam("retention") String retentionPeriod, + @ApiParam(value = "Segment names to be deleted if not provided deletes all segments by default", + allowMultiple = true) @QueryParam("segments") List<String> segments, @Context HttpHeaders headers) { tableName = DatabaseUtils.translateTableName(tableName, headers); TableType tableType = Constants.validateTableType(tableTypeStr); if (tableType == null) { @@ -681,11 +684,22 @@ public class PinotSegmentRestletResource { } String tableNameWithType = ResourceUtils.getExistingTableNamesWithType(_pinotHelixResourceManager, tableName, tableType, LOGGER).get(0); - deleteSegmentsInternal(tableNameWithType, - _pinotHelixResourceManager.getSegmentsFromPropertyStore(tableNameWithType), retentionPeriod); - return new SuccessResponse("All segments of table " + tableNameWithType + " deleted"); + if (segments == null || segments.isEmpty()) { + deleteSegmentsInternal(tableNameWithType, + _pinotHelixResourceManager.getSegmentsFromPropertyStore(tableNameWithType), retentionPeriod); + return new SuccessResponse("All segments of table " + tableNameWithType + " deleted"); + } else { + int numSegments = segments.size(); + deleteSegmentsInternal(tableNameWithType, segments, retentionPeriod); + if (numSegments <= 5) { + return new SuccessResponse("Deleted segments: " + segments + " from table: " + tableNameWithType); + } else { + return new SuccessResponse("Deleted " + numSegments + " segments from table: " + tableNameWithType); + } + } } + @Deprecated @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotSegmentRestletResourceTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotSegmentRestletResourceTest.java index eae4892009..78a9923d99 100644 --- a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotSegmentRestletResourceTest.java +++ b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotSegmentRestletResourceTest.java @@ -47,6 +47,7 @@ import static org.testng.Assert.assertTrue; public class PinotSegmentRestletResourceTest { private static final ControllerTest TEST_INSTANCE = ControllerTest.getInstance(); + private static final String TEST_RAW_OFFLINE_TABLE_NAME = "offlineTableName1"; @BeforeClass public void setUp() @@ -202,6 +203,40 @@ public class PinotSegmentRestletResourceTest { assertTrue(reply.contains("Deleted 1 segments")); } + @Test + public void testDeleteMultipleSegments() + throws Exception { + // Adding table and segment + TEST_INSTANCE.addDummySchema(TEST_RAW_OFFLINE_TABLE_NAME); + String offlineTableName = TableNameBuilder.OFFLINE.tableNameWithType(TEST_RAW_OFFLINE_TABLE_NAME); + TableConfig tableConfig = + new TableConfigBuilder(TableType.OFFLINE).setTableName(TEST_RAW_OFFLINE_TABLE_NAME).setNumReplicas(1) + .setDeletedSegmentsRetentionPeriod("0d").build(); + PinotHelixResourceManager resourceManager = TEST_INSTANCE.getHelixResourceManager(); + resourceManager.addTable(tableConfig); + SegmentMetadata segmentMetadata = SegmentMetadataMockUtils.mockSegmentMetadata(TEST_RAW_OFFLINE_TABLE_NAME, + "segment1"); + resourceManager.addNewSegment(offlineTableName, segmentMetadata, "downloadUrl"); + segmentMetadata = SegmentMetadataMockUtils.mockSegmentMetadata(TEST_RAW_OFFLINE_TABLE_NAME, + "segment2"); + resourceManager.addNewSegment(offlineTableName, segmentMetadata, "downloadUrl"); + segmentMetadata = SegmentMetadataMockUtils.mockSegmentMetadata(TEST_RAW_OFFLINE_TABLE_NAME, + "segment3"); + resourceManager.addNewSegment(offlineTableName, segmentMetadata, "downloadUrl"); + + // Send query and verify + ControllerRequestURLBuilder urlBuilder = TEST_INSTANCE.getControllerRequestURLBuilder(); + // case 1: send list of segments + String reply = ControllerTest.sendDeleteRequest(urlBuilder.forDeleteMultipleSegments( + TEST_RAW_OFFLINE_TABLE_NAME, TableType.OFFLINE.toString(), List.of("segment1"))); + assertTrue(reply.contains("Deleted segments: [segment1] from table: offlineTableName1_OFFLINE")); + + // case 2: delete all remaining segments + reply = ControllerTest.sendDeleteRequest(urlBuilder.forDeleteMultipleSegments( + TEST_RAW_OFFLINE_TABLE_NAME, TableType.OFFLINE.toString(), Collections.emptyList())); + assertTrue(reply.contains("All segments of table offlineTableName1_OFFLINE deleted")); + } + private void checkCrcRequest(String tableName, Map<String, SegmentMetadata> metadataTable, int expectedSize) throws Exception { String crcMapStr = ControllerTest.sendGetRequest( diff --git a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/builder/ControllerRequestURLBuilder.java b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/builder/ControllerRequestURLBuilder.java index 2841849f14..3b22e04941 100644 --- a/pinot-spi/src/main/java/org/apache/pinot/spi/utils/builder/ControllerRequestURLBuilder.java +++ b/pinot-spi/src/main/java/org/apache/pinot/spi/utils/builder/ControllerRequestURLBuilder.java @@ -435,6 +435,16 @@ public class ControllerRequestURLBuilder { return url.toString(); } + public String forDeleteMultipleSegments(String tableName, String tableType, List<String> segments) { + StringBuilder fullUrl = new StringBuilder( + StringUtil.join("?", StringUtil.join("/", _baseUrl, "segments", tableName), + "type=" + tableType)); + for (String segment : segments) { + fullUrl.append("&segments=").append(segment); + } + return fullUrl.toString(); + } + private void appendUrlParameter(StringBuilder url, String urlParameterKey, String urlParameterValue) { if (url.length() == 0) { url.append("?").append(urlParameterKey).append("=").append(urlParameterValue); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org