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

Reply via email to