diff --git a/server/src/main/java/org/apache/druid/server/http/DataSourcesResource.java b/server/src/main/java/org/apache/druid/server/http/DataSourcesResource.java index d0458243fcfc..a633640f0e22 100644 --- a/server/src/main/java/org/apache/druid/server/http/DataSourcesResource.java +++ b/server/src/main/java/org/apache/druid/server/http/DataSourcesResource.java @@ -68,6 +68,7 @@ import org.apache.druid.timeline.TimelineObjectHolder; import org.apache.druid.timeline.VersionedIntervalTimeline; import org.apache.druid.timeline.partition.PartitionChunk; +import org.apache.druid.utils.CollectionUtils; import org.joda.time.DateTime; import org.joda.time.Interval; @@ -1020,7 +1021,12 @@ public Set getSegmentIds() public boolean isValid() { - return (interval == null ^ segmentIds == null) && (segmentIds == null || !segmentIds.isEmpty()); + final boolean hasSegmentIds = !CollectionUtils.isNullOrEmpty(segmentIds); + if (interval == null) { + return hasSegmentIds; + } else { + return !hasSegmentIds; + } } } } diff --git a/server/src/test/java/org/apache/druid/server/http/DataSourcesResourceTest.java b/server/src/test/java/org/apache/druid/server/http/DataSourcesResourceTest.java index ace68ad3c21e..bd673f078b29 100644 --- a/server/src/test/java/org/apache/druid/server/http/DataSourcesResourceTest.java +++ b/server/src/test/java/org/apache/druid/server/http/DataSourcesResourceTest.java @@ -826,7 +826,7 @@ public void testMarkAsUsedNonOvershadowedSegmentsNoDataSource() } @Test - public void testMarkAsUsedNonOvershadowedSegmentsInvalidPayloadNoArguments() + public void testMarkAsUsedNonOvershadowedSegmentsWithNullIntervalAndSegmentIds() { DataSourcesResource dataSourcesResource = createResource(); @@ -838,7 +838,7 @@ public void testMarkAsUsedNonOvershadowedSegmentsInvalidPayloadNoArguments() } @Test - public void testMarkAsUsedNonOvershadowedSegmentsInvalidPayloadBothArguments() + public void testMarkAsUsedNonOvershadowedSegmentsWithNonNullIntervalAndEmptySegmentIds() { DataSourcesResource dataSourcesResource = createResource(); @@ -846,11 +846,37 @@ public void testMarkAsUsedNonOvershadowedSegmentsInvalidPayloadBothArguments() "datasource1", new DataSourcesResource.MarkDataSourceSegmentsPayload(Intervals.of("2010-01-22/P1D"), ImmutableSet.of()) ); + Assert.assertEquals(200, response.getStatus()); + Assert.assertEquals(ImmutableMap.of("numChangedSegments", 0), response.getEntity()); + } + + @Test + public void testMarkAsUsedNonOvershadowedSegmentsWithNonNullIntervalAndNullSegmentIds() + { + DataSourcesResource dataSourcesResource = createResource(); + + Response response = dataSourcesResource.markAsUsedNonOvershadowedSegments( + "datasource1", + new DataSourcesResource.MarkDataSourceSegmentsPayload(Intervals.of("2010-01-22/P1D"), null) + ); + Assert.assertEquals(200, response.getStatus()); + Assert.assertEquals(ImmutableMap.of("numChangedSegments", 0), response.getEntity()); + } + + @Test + public void testMarkAsUsedNonOvershadowedSegmentsWithNonNullIntervalAndSegmentIds() + { + DataSourcesResource dataSourcesResource = createResource(); + + Response response = dataSourcesResource.markAsUsedNonOvershadowedSegments( + "datasource1", + new DataSourcesResource.MarkDataSourceSegmentsPayload(Intervals.of("2010-01-22/P1D"), ImmutableSet.of("segment1")) + ); Assert.assertEquals(400, response.getStatus()); } @Test - public void testMarkAsUsedNonOvershadowedSegmentsInvalidPayloadEmptyArray() + public void testMarkAsUsedNonOvershadowedSegmentsWithNullIntervalAndEmptySegmentIds() { DataSourcesResource dataSourcesResource = createResource(); @@ -1170,8 +1196,7 @@ public void testMarkAsUnusedSegmentsInIntervalNoDataSource() @Test public void testMarkSegmentsAsUnusedNullPayload() { - DataSourcesResource dataSourcesResource = - createResource(); + DataSourcesResource dataSourcesResource = createResource(); Response response = dataSourcesResource.markSegmentsAsUnused("datasource1", null, request); Assert.assertEquals(400, response.getStatus()); @@ -1183,10 +1208,9 @@ public void testMarkSegmentsAsUnusedNullPayload() } @Test - public void testMarkSegmentsAsUnusedInvalidPayload() + public void testMarkSegmentsAsUnusedWithNullIntervalAndSegmentIds() { - DataSourcesResource dataSourcesResource = - createResource(); + DataSourcesResource dataSourcesResource = createResource(); final DataSourcesResource.MarkDataSourceSegmentsPayload payload = new DataSourcesResource.MarkDataSourceSegmentsPayload(null, null); @@ -1197,17 +1221,17 @@ public void testMarkSegmentsAsUnusedInvalidPayload() } @Test - public void testMarkSegmentsAsUnusedInvalidPayloadBothArguments() + public void testMarkSegmentsAsUnusedWithNonNullIntervalAndEmptySegmentIds() { - DataSourcesResource dataSourcesResource = - createResource(); + DataSourcesResource dataSourcesResource = createResource(); final DataSourcesResource.MarkDataSourceSegmentsPayload payload = new DataSourcesResource.MarkDataSourceSegmentsPayload(Intervals.of("2010-01-01/P1D"), ImmutableSet.of()); - + prepareRequestForAudit(); Response response = dataSourcesResource.markSegmentsAsUnused("datasource1", payload, request); - Assert.assertEquals(400, response.getStatus()); - Assert.assertNotNull(response.getEntity()); + + Assert.assertEquals(200, response.getStatus()); + Assert.assertEquals(ImmutableMap.of("numChangedSegments", 0), response.getEntity()); } @Test