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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]