Skip to content
This repository was archived by the owner on Mar 31, 2023. It is now read-only.

Commit 66ecaca

Browse files
authored
fix scalar resource accounting for single lease mode (#186)
1 parent b15bc32 commit 66ecaca

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

fenzo-core/src/main/java/com/netflix/fenzo/AssignableVirtualMachine.java

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -555,17 +555,25 @@ private void removeResourcesOf(TaskRequest request) {
555555
currTotalNetworkMbps -= request.getNetworkMbps();
556556
final Map<String, Double> scalarRequests = request.getScalarRequests();
557557
if(scalarRequests != null && !scalarRequests.isEmpty()) {
558-
for(Map.Entry<String, Double> entry: scalarRequests.entrySet()) {
558+
for (Map.Entry<String, Double> entry : scalarRequests.entrySet()) {
559559
Double oldVal = currTotalScalars.get(entry.getKey());
560-
if(oldVal != null) {
561-
double newVal = oldVal - entry.getValue();
562-
if(newVal < 0.0) {
563-
logger.warn(hostname + ": Scalar resource " + entry.getKey() + " is " + newVal + " after removing " +
564-
entry.getValue() + " from task " + request.getId());
565-
currTotalScalars.put(entry.getKey(), 0.0);
560+
if (singleLeaseMode) {
561+
// resources must be able to be negative in single lease mode
562+
if (oldVal == null) {
563+
oldVal = 0.0;
564+
}
565+
currTotalScalars.put(entry.getKey(), oldVal - entry.getValue());
566+
} else {
567+
if (oldVal != null) {
568+
double newVal = oldVal - entry.getValue();
569+
if (newVal < 0.0) {
570+
logger.warn(hostname + ": Scalar resource " + entry.getKey() + " is " + newVal + " after removing " +
571+
entry.getValue() + " from task " + request.getId());
572+
currTotalScalars.put(entry.getKey(), 0.0);
573+
} else {
574+
currTotalScalars.put(entry.getKey(), newVal);
575+
}
566576
}
567-
else
568-
currTotalScalars.put(entry.getKey(), newVal);
569577
}
570578
}
571579
}

fenzo-core/src/test/java/com/netflix/fenzo/ScalarResourceTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@
2525
public class ScalarResourceTests {
2626

2727
private TaskScheduler getScheduler() {
28+
return getScheduler(false);
29+
}
30+
31+
private TaskScheduler getScheduler(boolean singleLeaseMode) {
2832
return new TaskScheduler.Builder()
2933
.withLeaseOfferExpirySecs(1000000)
34+
.withSingleOfferPerVM(singleLeaseMode)
3035
.withLeaseRejectAction(new Action1<VirtualMachineLease>() {
3136
@Override
3237
public void call(VirtualMachineLease virtualMachineLease) {
@@ -131,4 +136,18 @@ public void testMultipleScalarResources() throws Exception {
131136
}
132137
Assert.assertEquals((int)(scalars2OnHost*2.0), tasksAssigned);
133138
}
139+
140+
@Test
141+
public void testInsufficientScalarResourcesWithSingleLeaseMode() {
142+
final TaskScheduler scheduler = getScheduler(true);
143+
final double scalarsOnHost=4.0;
144+
final TaskRequest task = TaskRequestProvider.getTaskRequest(null, 1, 100, 1, 1, 1, null, null, null, Collections.singletonMap("gpu", scalarsOnHost+1.0));
145+
final VirtualMachineLease host1 = LeaseProvider.getLeaseOffer("host1", 4.0, 4000.0, 100, 1024,
146+
Collections.singletonList(new VirtualMachineLease.Range(1, 10)), null, Collections.singletonMap("gpu", scalarsOnHost));
147+
final SchedulingResult result = scheduler.scheduleOnce(Collections.singletonList(task), Collections.singletonList(host1));
148+
Assert.assertEquals(1, result.getFailures().size());
149+
Assert.assertEquals(0, result.getResultMap().size());
150+
Assert.assertEquals(VMResource.Other, result.getFailures().values().iterator().next().get(0).getFailures().get(0).getResource());
151+
System.out.println(result.getFailures().values().iterator().next().get(0).getFailures().get(0));
152+
}
134153
}

0 commit comments

Comments
 (0)