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

Commit 8c82038

Browse files
authored
Allow a new lease on single offer mode if there aren't any leases (#187)
1 parent 66ecaca commit 8c82038

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -397,8 +397,14 @@ String getCurrVMId() {
397397
boolean addLease(VirtualMachineLease lease) {
398398
if (logger.isDebugEnabled())
399399
logger.debug("{}: adding lease id {}", hostname, lease.getId());
400-
if(singleLeaseMode && firstLeaseAdded)
401-
return false;
400+
if(singleLeaseMode && firstLeaseAdded) {
401+
if (leasesMap.isEmpty()) {
402+
leasesMap.put(lease.getId(), lease);
403+
return true;
404+
} else {
405+
return false;
406+
}
407+
}
402408
if(!Objects.equals(currVMId, lease.getVMID())) {
403409
currVMId = lease.getVMID();
404410
vmIdToHostnameMap.put(lease.getVMID(), hostname);

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.netflix.fenzo;
1818

1919
import com.netflix.fenzo.functions.Action1;
20+
import org.apache.mesos.Protos;
2021
import org.junit.Assert;
2122
import org.junit.Test;
2223

@@ -150,4 +151,37 @@ public void testInsufficientScalarResourcesWithSingleLeaseMode() {
150151
Assert.assertEquals(VMResource.Other, result.getFailures().values().iterator().next().get(0).getFailures().get(0).getResource());
151152
System.out.println(result.getFailures().values().iterator().next().get(0).getFailures().get(0));
152153
}
154+
155+
@Test
156+
public void testRemovingLeaseAndAddingBackSameLeaseWithSingleLeaseMode() {
157+
final TaskScheduler scheduler = getScheduler(true);
158+
159+
final TaskRequest task = TaskRequestProvider.getTaskRequest(null, 1, 1, 1,
160+
1, 1, null, null, null, Collections.emptyMap());
161+
162+
final VirtualMachineLease lease1 = LeaseProvider.getLeaseOffer("host1", 1.0, 1.0, 1, 1,
163+
Collections.singletonList(new VirtualMachineLease.Range(1, 10)), null, Collections.emptyMap());
164+
165+
final SchedulingResult result1 = scheduler.scheduleOnce(Collections.singletonList(task), Collections.singletonList(lease1));
166+
Assert.assertEquals(0, result1.getFailures().size());
167+
Assert.assertEquals(1, result1.getResultMap().size());
168+
169+
// Expire the leases and run a scheduling loop to make sure they are gone
170+
scheduler.expireAllLeases();
171+
scheduler.scheduleOnce(Collections.emptyList(), Collections.emptyList());
172+
173+
List<VirtualMachineCurrentState> vmCurrentStates1 = scheduler.getVmCurrentStates();
174+
Collection<Protos.Offer> offers1 = vmCurrentStates1.get(0).getAllCurrentOffers();
175+
Assert.assertEquals(0, offers1.size());
176+
177+
// Run another scheduling iteration with the same lease and make sure it can be added back as an offer
178+
final SchedulingResult result2 = scheduler.scheduleOnce(Collections.singletonList(task), Collections.singletonList(lease1));
179+
Assert.assertEquals(0, result2.getFailures().size());
180+
Assert.assertEquals(1, result2.getResultMap().size());
181+
182+
List<VirtualMachineCurrentState> vmCurrentStates2 = scheduler.getVmCurrentStates();
183+
Collection<Protos.Offer> offers2 = vmCurrentStates2.get(0).getAllCurrentOffers();
184+
Assert.assertEquals(1, offers2.size());
185+
System.out.println(vmCurrentStates2.get(0).getAllCurrentOffers());
186+
}
153187
}

0 commit comments

Comments
 (0)