mirror of https://github.com/apache/druid.git
bug fix and unit tests for DruidCoordinatorSegmentKiller
This commit is contained in:
parent
ab3edfa8fc
commit
f6b4dbd697
|
@ -25,5 +25,12 @@ import io.druid.server.coordinator.DruidCoordinatorRuntimeParams;
|
|||
*/
|
||||
public interface DruidCoordinatorHelper
|
||||
{
|
||||
public DruidCoordinatorRuntimeParams run(DruidCoordinatorRuntimeParams params);
|
||||
/**
|
||||
* Implementations of this method run various activities performed by the coordinator.
|
||||
* Input params can be used and modified. They are typically in a list and returned
|
||||
* DruidCoordinatorRuntimeParams is passed to the next helper.
|
||||
* @param params
|
||||
* @return same as input or a modified value to be used by next helper.
|
||||
*/
|
||||
DruidCoordinatorRuntimeParams run(DruidCoordinatorRuntimeParams params);
|
||||
}
|
||||
|
|
|
@ -19,9 +19,11 @@
|
|||
|
||||
package io.druid.server.coordinator.helper;
|
||||
|
||||
import com.google.common.annotations.VisibleForTesting;
|
||||
import com.google.common.base.Preconditions;
|
||||
import com.metamx.common.logger.Logger;
|
||||
import io.druid.client.indexing.IndexingServiceClient;
|
||||
import io.druid.common.utils.JodaUtils;
|
||||
import io.druid.metadata.MetadataSegmentManager;
|
||||
import io.druid.server.coordinator.DruidCoordinatorRuntimeParams;
|
||||
import org.joda.time.Duration;
|
||||
|
@ -100,7 +102,8 @@ public class DruidCoordinatorSegmentKiller implements DruidCoordinatorHelper
|
|||
return params;
|
||||
}
|
||||
|
||||
private Interval findIntervalForKillTask(String dataSource, int limit)
|
||||
@VisibleForTesting
|
||||
Interval findIntervalForKillTask(String dataSource, int limit)
|
||||
{
|
||||
List<Interval> unusedSegmentIntervals = segmentManager.getUnusedSegmentIntervals(
|
||||
dataSource,
|
||||
|
@ -113,20 +116,7 @@ public class DruidCoordinatorSegmentKiller implements DruidCoordinatorHelper
|
|||
);
|
||||
|
||||
if (unusedSegmentIntervals != null && unusedSegmentIntervals.size() > 0) {
|
||||
long start = Long.MIN_VALUE;
|
||||
long end = Long.MAX_VALUE;
|
||||
|
||||
for (Interval interval : unusedSegmentIntervals) {
|
||||
if (start < interval.getStartMillis()) {
|
||||
start = interval.getStartMillis();
|
||||
}
|
||||
|
||||
if (end > interval.getEndMillis()) {
|
||||
end = interval.getEndMillis();
|
||||
}
|
||||
}
|
||||
|
||||
return new Interval(start, end);
|
||||
return JodaUtils.umbrellaInterval(unusedSegmentIntervals);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,113 @@
|
|||
/*
|
||||
* Licensed to Metamarkets Group Inc. (Metamarkets) under one
|
||||
* or more contributor license agreements. See the NOTICE file
|
||||
* distributed with this work for additional information
|
||||
* regarding copyright ownership. Metamarkets licenses this file
|
||||
* to you under the Apache License, Version 2.0 (the
|
||||
* "License"); you may not use this file except in compliance
|
||||
* with the License. You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing,
|
||||
* software distributed under the License is distributed on an
|
||||
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||
* KIND, either express or implied. See the License for the
|
||||
* specific language governing permissions and limitations
|
||||
* under the License.
|
||||
*/
|
||||
|
||||
package io.druid.server.coordinator.helper;
|
||||
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import io.druid.client.indexing.IndexingServiceClient;
|
||||
import io.druid.metadata.MetadataSegmentManager;
|
||||
import org.easymock.EasyMock;
|
||||
import org.joda.time.Duration;
|
||||
import org.joda.time.Interval;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*/
|
||||
public class DruidCoordinatorSegmentKillerTest
|
||||
{
|
||||
@Test
|
||||
public void testFindIntervalForKillTask()
|
||||
{
|
||||
testFindIntervalForKillTask(null, null);
|
||||
testFindIntervalForKillTask(ImmutableList.<Interval>of(), null);
|
||||
|
||||
testFindIntervalForKillTask(ImmutableList.<Interval>of(Interval.parse("2014/2015")), Interval.parse("2014/2015"));
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(Interval.parse("2014/2015"), Interval.parse("2016/2017")),
|
||||
Interval.parse("2014/2017")
|
||||
);
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(Interval.parse("2014/2015"), Interval.parse("2015/2016")),
|
||||
Interval.parse("2014/2016")
|
||||
);
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(Interval.parse("2015/2016"), Interval.parse("2014/2015")),
|
||||
Interval.parse("2014/2016")
|
||||
);
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(Interval.parse("2015/2017"), Interval.parse("2014/2016")),
|
||||
Interval.parse("2014/2017")
|
||||
);
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(
|
||||
Interval.parse("2015/2019"),
|
||||
Interval.parse("2014/2016"),
|
||||
Interval.parse("2018/2020")
|
||||
),
|
||||
Interval.parse("2014/2020")
|
||||
);
|
||||
|
||||
testFindIntervalForKillTask(
|
||||
ImmutableList.<Interval>of(
|
||||
Interval.parse("2015/2019"),
|
||||
Interval.parse("2014/2016"),
|
||||
Interval.parse("2018/2020"),
|
||||
Interval.parse("2021/2022")
|
||||
),
|
||||
Interval.parse("2014/2022")
|
||||
);
|
||||
}
|
||||
|
||||
private void testFindIntervalForKillTask(List<Interval> segmentManagerResult, Interval expected)
|
||||
{
|
||||
MetadataSegmentManager segmentManager = EasyMock.createMock(MetadataSegmentManager.class);
|
||||
EasyMock.expect(
|
||||
segmentManager.getUnusedSegmentIntervals(
|
||||
EasyMock.anyString(),
|
||||
EasyMock.anyObject(Interval.class),
|
||||
EasyMock.anyInt()
|
||||
)
|
||||
).andReturn(
|
||||
segmentManagerResult
|
||||
);
|
||||
EasyMock.replay(segmentManager);
|
||||
IndexingServiceClient indexingServiceClient = EasyMock.createMock(IndexingServiceClient.class);
|
||||
|
||||
DruidCoordinatorSegmentKiller coordinatorSegmentKiller = new DruidCoordinatorSegmentKiller(
|
||||
segmentManager,
|
||||
indexingServiceClient,
|
||||
Duration.parse("PT86400S"),
|
||||
Duration.parse("PT86400S"),
|
||||
1000
|
||||
);
|
||||
|
||||
Assert.assertEquals(
|
||||
expected,
|
||||
coordinatorSegmentKiller.findIntervalForKillTask("test", 10000)
|
||||
);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue