YARN-4525. Fix bug in RLESparseResourceAllocation.getRangeOverlapping(). (Ishai Menache and Carlo Curino via asuresh)

This commit is contained in:
Arun Suresh 2016-06-06 21:18:32 -07:00
parent 7a9b7372a1
commit 3a154f75ed
2 changed files with 27 additions and 1 deletions

View File

@ -510,7 +510,11 @@ public RLESparseResourceAllocation getRangeOverlapping(long start, long end) {
long previous = a.floorKey(start); long previous = a.floorKey(start);
a = a.tailMap(previous, true); a = a.tailMap(previous, true);
} }
a = a.headMap(end, true);
if (end < a.lastKey()) {
a = a.headMap(end, true);
}
} }
RLESparseResourceAllocation ret = RLESparseResourceAllocation ret =
new RLESparseResourceAllocation(a, resourceCalculator); new RLESparseResourceAllocation(a, resourceCalculator);

View File

@ -282,6 +282,28 @@ public void testMergeSpeed() throws PlanningException {
} }
@Test
public void testRangeOverlapping() {
ResourceCalculator resCalc = new DefaultResourceCalculator();
RLESparseResourceAllocation r =
new RLESparseResourceAllocation(resCalc);
int[] alloc = {10, 10, 10, 10, 10, 10};
int start = 100;
Set<Entry<ReservationInterval, Resource>> inputs =
generateAllocation(start, alloc, false).entrySet();
for (Entry<ReservationInterval, Resource> ip : inputs) {
r.addInterval(ip.getKey(), ip.getValue());
}
long s = r.getEarliestStartTime();
long d = r.getLatestNonNullTime();
// tries to trigger "out-of-range" bug
r = r.getRangeOverlapping(s, d);
r = r.getRangeOverlapping(s-1, d-1);
r = r.getRangeOverlapping(s+1, d+1);
}
@Test @Test
public void testBlocks() { public void testBlocks() {
ResourceCalculator resCalc = new DefaultResourceCalculator(); ResourceCalculator resCalc = new DefaultResourceCalculator();