[haizea-commit] r762 - in branches/1.1/src/haizea: core core/scheduler pluggable/policies
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Wed Jan 13 20:14:18 CST 2010
Author: borja
Date: 2010-01-13 20:14:17 -0600 (Wed, 13 Jan 2010)
New Revision: 762
Modified:
branches/1.1/src/haizea/core/leases.py
branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
branches/1.1/src/haizea/pluggable/policies/preemption.py
Log:
Fixes to several bugs that showed up when running Haizea with larger workloads.
Modified: branches/1.1/src/haizea/core/leases.py
===================================================================
--- branches/1.1/src/haizea/core/leases.py 2010-01-13 02:00:16 UTC (rev 761)
+++ branches/1.1/src/haizea/core/leases.py 2010-01-14 02:14:17 UTC (rev 762)
@@ -475,6 +475,27 @@
"""
return self.vm_rrs[-1]
+
+ def get_vmrr_at(self, time):
+ """...
+
+ """
+ vmrr_at = None
+ for vmrr in self.vm_rrs:
+ if time >= vmrr.start and time < vmrr.end:
+ vmrr_at = vmrr
+ break
+ return vmrr_at
+
+ def get_vmrr_after(self, time):
+ """...
+
+ """
+ vmrr_after = []
+ for vmrr in self.vm_rrs:
+ if vmrr.start > time:
+ vmrr_after.append(vmrr)
+ return vmrr_after
def get_endtime(self):
"""Returns the time at which the last VM reservation
Modified: branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-13 02:00:16 UTC (rev 761)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-14 02:14:17 UTC (rev 762)
@@ -418,7 +418,17 @@
"""
time = get_clock().get_time()
if event == constants.EVENT_END_VM:
- vmrr = lease.get_last_vmrr()
+ vmrr = lease.get_vmrr_at(time)
+ vmrrs_after = lease.get_vmrr_after(time)
+
+ for vmrr_after in vmrrs_after:
+ for rr in vmrr_after.pre_rrs:
+ self.slottable.remove_reservation(rr)
+ for rr in vmrr_after.post_rrs:
+ self.slottable.remove_reservation(rr)
+ self.slottable.remove_reservation(vmrr_after)
+ lease.remove_vmrr(vmrr_after)
+
self._handle_end_rr(vmrr)
# TODO: Exception handling
self.vm_scheduler._handle_unscheduled_end_vm(lease, vmrr)
@@ -737,6 +747,10 @@
def __preempt_leases_deadline(self, lease, vmrr, preempted_leases, preemption_time, nexttime):
orig_vmrrs = dict([(l.id,l.vm_rrs[:]) for l in preempted_leases])
+ orig_vmrrs_data = {}
+ for orig_vmrr in orig_vmrrs.values():
+ for vmrr2 in orig_vmrr:
+ orig_vmrrs_data[vmrr2] = (vmrr2.start, vmrr2.end, vmrr2.pre_rrs[:], vmrr2.post_rrs[:])
self.slottable.push()
@@ -753,6 +767,7 @@
feasible = True
cancelled = []
+ new_state = {}
for lease_to_preempt in preempted_leases:
preempt_vmrr = lease_to_preempt.get_last_vmrr()
dur = preempt_vmrr.end - preemption_time
@@ -783,12 +798,12 @@
lease_state = lease_to_preempt.get_state()
if lease_state == Lease.STATE_SUSPENDED_SCHEDULED:
- lease.set_state(Lease.STATE_SUSPENDED_READY)
+ new_state[lease_to_preempt] = Lease.STATE_SUSPENDED_READY
elif lease_state != Lease.STATE_READY:
- lease.set_state(Lease.STATE_READY)
+ new_state[lease_to_preempt] = Lease.STATE_READY
for lease_to_preempt in preempted_leases:
- if lease.id in cancelled:
+ if lease_to_preempt.id in cancelled:
dur = lease_to_preempt.duration.requested - lease_to_preempt.duration.accumulated
else:
preempt_vmrr = lease_to_preempt.get_last_vmrr()
@@ -830,7 +845,13 @@
if not feasible:
for l in preempted_leases:
l.vm_rrs = orig_vmrrs[l.id]
- self.slottable.pop()
+ for vm_rr in l.vm_rrs:
+ vm_rr.start = orig_vmrrs_data[vm_rr][0]
+ vm_rr.end = orig_vmrrs_data[vm_rr][1]
+ vm_rr.pre_rrs = orig_vmrrs_data[vm_rr][2]
+ vm_rr.post_rrs = orig_vmrrs_data[vm_rr][3]
+ self.slottable.pop()
+ raise NotSchedulableException, "Unable to preempt leases to make room for lease."
else:
# Pre-VM RRs (if any)
for rr in vmrr.pre_rrs:
@@ -843,7 +864,12 @@
for rr in vmrr.post_rrs:
self.slottable.remove_reservation(rr)
- # commit to slottable
+ for l in new_state:
+ l.set_state(new_state[l])
+
+ for l in preempted_leases:
+ self.logger.vdebug("Lease %i after preemption:" % l.id)
+ l.print_contents()
def __enqueue(self, lease):
Modified: branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/vm_scheduler.py 2010-01-13 02:00:16 UTC (rev 761)
+++ branches/1.1/src/haizea/core/scheduler/vm_scheduler.py 2010-01-14 02:14:17 UTC (rev 762)
@@ -642,9 +642,12 @@
self.logger.debug("Lease #%i cannot be scheduled before deadline using best-effort." % lease.id)
self.slottable.push()
- print min([e.time for e in earliest.values()])
future_vmrrs = self.slottable.get_reservations_on_or_after(min([e.time for e in earliest.values()]))
- future_vmrrs = [rr for rr in future_vmrrs if isinstance(rr, VMResourceReservation) and rr.state==ResourceReservation.STATE_SCHEDULED]
+ future_vmrrs = [rr for rr in future_vmrrs
+ if isinstance(rr, VMResourceReservation)
+ and rr.state==ResourceReservation.STATE_SCHEDULED
+ and not rr.is_resuming()
+ and not rr.is_suspending()]
for vmrr in future_vmrrs:
for rr in vmrr.pre_rrs:
@@ -1193,7 +1196,7 @@
Arguments:
l -- Lease the VMResourceReservation belongs to
rr -- THe VMResourceReservation
- """
+ """
self.logger.info("LEASE-%i The VM has ended prematurely." % l.id)
for rr in vmrr.post_rrs:
@@ -1437,6 +1440,9 @@
else:
return self.post_rrs[-1].end
+ def is_resuming(self):
+ return len(self.pre_rrs) > 0 and isinstance(self.pre_rrs[0], ResumptionResourceReservation)
+
def is_suspending(self):
return len(self.post_rrs) > 0 and isinstance(self.post_rrs[0], SuspensionResourceReservation)
Modified: branches/1.1/src/haizea/pluggable/policies/preemption.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-13 02:00:16 UTC (rev 761)
+++ branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-14 02:14:17 UTC (rev 762)
@@ -106,12 +106,23 @@
time -- Time at which preemption would take place
"""
if preemptee.get_type() == Lease.DEADLINE:
+ for vmrr in preemptee.vm_rrs:
+ if time >= vmrr.start and time < vmrr.end:
+ preempt_vmrr = vmrr
+ break
+ last_vmrr = preemptee.get_last_vmrr()
+
+ if preempt_vmrr != last_vmrr:
+ return -1
+
+ if preempt_vmrr.is_suspending():
+ return -1
+
deadline = preemptee.deadline
- vmrr = preemptee.get_last_vmrr()
- remaining_duration = vmrr.end - time
+ remaining_duration = preempt_vmrr.end - time
slack = (deadline - time) / remaining_duration
delay = preemptee.estimate_suspend_time() + preemptor.duration.requested + preemptee.estimate_resume_time()
- if time + delay + remaining_duration < deadline and not vmrr.is_suspending():
+ if time + delay + remaining_duration < deadline:
return slack
else:
return -1
More information about the Haizea-commit
mailing list