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

Commit 71a387a

Browse files
authored
Merge pull request #104 from spodila/Issue87
Fix for Issue #87
2 parents 1e6942e + 4349e1c commit 71a387a

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

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

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -353,21 +353,21 @@ void removeExpiredLeases(boolean all) {
353353
int expireLimitedLeases(AssignableVMs.VMRejectLimiter vmRejectLimiter) {
354354
if(singleLeaseMode)
355355
return 0;
356-
int rejected=0;
357-
Iterator<Map.Entry<String,VirtualMachineLease>> iterator = leasesMap.entrySet().iterator();
358356
long now = System.currentTimeMillis();
359-
while(iterator.hasNext()) {
360-
VirtualMachineLease l = iterator.next().getValue();
361-
if(l.getOfferedTime() < (now - leaseOfferExpirySecs*1000) && vmRejectLimiter.reject()) {
362-
leaseIdToHostnameMap.remove(l.getId());
363-
if(logger.isDebugEnabled())
364-
logger.debug(getHostname() + ": expiring lease offer id " + l.getId());
365-
leaseRejectAction.call(l);
366-
iterator.remove();
367-
rejected++;
357+
for (VirtualMachineLease l: leasesMap.values()) {
358+
if (l.getOfferedTime() < (now - leaseOfferExpirySecs * 1000) && vmRejectLimiter.reject()) {
359+
for (VirtualMachineLease vml: leasesMap.values()) {
360+
leaseIdToHostnameMap.remove(vml.getId());
361+
if(logger.isDebugEnabled())
362+
logger.debug(getHostname() + ": expiring lease offer id " + l.getId());
363+
leaseRejectAction.call(vml);
364+
}
365+
int size = leasesMap.values().size();
366+
leasesMap.clear();
367+
return size;
368368
}
369369
}
370-
return rejected;
370+
return 0;
371371
}
372372

373373
String getCurrVMId() {

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

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,7 @@
2121
import junit.framework.Assert;
2222
import org.junit.Test;
2323

24-
import java.util.ArrayList;
25-
import java.util.Collections;
26-
import java.util.List;
27-
import java.util.Map;
24+
import java.util.*;
2825
import java.util.concurrent.BlockingQueue;
2926
import java.util.concurrent.ConcurrentHashMap;
3027
import java.util.concurrent.ConcurrentMap;
@@ -198,7 +195,7 @@ public void call(VirtualMachineLease virtualMachineLease) {
198195
@Test
199196
public void testTimedOfferRejects() throws Exception {
200197
final AtomicInteger expireCount = new AtomicInteger();
201-
final int leaseExpirySecs=3;
198+
final int leaseExpirySecs=2;
202199
final TaskScheduler scheduler = new TaskScheduler.Builder()
203200
.withLeaseRejectAction(new Action1<VirtualMachineLease>() {
204201
@Override
@@ -216,7 +213,7 @@ public void call(VirtualMachineLease virtualMachineLease) {
216213
leases.clear();
217214
Thread.sleep(1000);
218215
}
219-
leases = LeaseProvider.getLeases(nLeases, 4, 4000, 1, 10);
216+
leases = LeaseProvider.getLeases(nLeases, nLeases, 4, 4000, 1, 10);
220217
for(int i=0; i<leaseExpirySecs-1; i++) {
221218
scheduler.scheduleOnce(Collections.<TaskRequest>emptyList(), leases);
222219
leases.clear();
@@ -230,4 +227,35 @@ public void call(VirtualMachineLease virtualMachineLease) {
230227
}
231228
Assert.assertEquals(nLeases*2, expireCount.get());
232229
}
230+
231+
// test that all offers of a VM are rejected when one of them expires
232+
@Test
233+
public void testRejectAllOffersOfVm() throws Exception {
234+
final AtomicInteger expireCount = new AtomicInteger();
235+
final int leaseExpirySecs=2;
236+
final Set<String> hostsRejectedFrom = new HashSet<>();
237+
final TaskScheduler scheduler = new TaskScheduler.Builder()
238+
.withLeaseRejectAction(new Action1<VirtualMachineLease>() {
239+
@Override
240+
public void call(VirtualMachineLease virtualMachineLease) {
241+
expireCount.incrementAndGet();
242+
hostsRejectedFrom.add(virtualMachineLease.hostname());
243+
}
244+
})
245+
.withLeaseOfferExpirySecs(leaseExpirySecs)
246+
.withMaxOffersToReject(1)
247+
.build();
248+
final int nhosts = 2;
249+
List<VirtualMachineLease> leases = LeaseProvider.getLeases(nhosts, 4, 4000, 1, 10);
250+
// add the same leases with same hostnames twice again, so there are 3 offers for each of the nHosts.
251+
leases.addAll(LeaseProvider.getLeases(nhosts, 4, 4000, 1, 10));
252+
leases.addAll(LeaseProvider.getLeases(nhosts, 4, 4000, 1, 10));
253+
for (int i=0; i<leaseExpirySecs+1; i++) {
254+
scheduler.scheduleOnce(Collections.<TaskRequest>emptyList(), leases);
255+
leases.clear();
256+
Thread.sleep(1000);
257+
}
258+
Assert.assertEquals(3, expireCount.get());
259+
Assert.assertEquals(1, hostsRejectedFrom.size());
260+
}
233261
}

0 commit comments

Comments
 (0)