[haizea-commit] r763 - in branches/1.1/src/haizea: core/scheduler pluggable/policies
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Wed Jan 13 22:09:27 CST 2010
Author: borja
Date: 2010-01-13 22:09:27 -0600 (Wed, 13 Jan 2010)
New Revision: 763
Modified:
branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
branches/1.1/src/haizea/pluggable/policies/preemption.py
Log:
More fixes to corner-case bugs arising when running on long workloads.
Modified: branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-14 02:14:17 UTC (rev 762)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-14 04:09:27 UTC (rev 763)
@@ -750,7 +750,7 @@
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[:])
+ orig_vmrrs_data[vmrr2] = (vmrr2.start, vmrr2.end, vmrr2.prematureend, vmrr2.pre_rrs[:], vmrr2.post_rrs[:])
self.slottable.push()
@@ -768,9 +768,9 @@
feasible = True
cancelled = []
new_state = {}
+ durs = {}
for lease_to_preempt in preempted_leases:
preempt_vmrr = lease_to_preempt.get_last_vmrr()
- dur = preempt_vmrr.end - preemption_time
susptype = get_config().get("suspension")
@@ -789,30 +789,52 @@
self.logger.debug("Suspending the lease does not meet scheduling threshold.")
cancel = True
else:
+ orig_end = preempt_vmrr.end
+ orig_prematureend = preempt_vmrr.prematureend
+
self.vm_scheduler.preempt_vm(preempt_vmrr, preemption_time)
+
+ durs[lease_to_preempt] = orig_end - preempt_vmrr.end
+
if cancel:
self.preparation_scheduler.cancel_preparation(lease_to_preempt)
+ durs[lease_to_preempt] = preempt_vmrr.end - preempt_vmrr.start
+
+ active_vmrrs = lease_to_preempt.get_active_vmrrs(preemption_time)
+
lease_to_preempt.remove_vmrr(preempt_vmrr)
self.vm_scheduler.cancel_vm(preempt_vmrr)
cancelled.append(lease_to_preempt.id)
lease_state = lease_to_preempt.get_state()
- if lease_state == Lease.STATE_SUSPENDED_SCHEDULED:
- new_state[lease_to_preempt] = Lease.STATE_SUSPENDED_READY
- elif lease_state != Lease.STATE_READY:
- new_state[lease_to_preempt] = Lease.STATE_READY
+ if preempt_vmrr in active_vmrrs:
+ # The VMRR we're preempting is the active one
+ new_state[lease_to_preempt] = Lease.STATE_READY
+ else:
+ if lease_state == Lease.STATE_ACTIVE:
+ # Don't do anything. The lease is active, but not in the VMs
+ # we're preempting.
+ new_state[lease_to_preempt] = None
+ elif lease_state in (Lease.STATE_SUSPENDING, Lease.STATE_SUSPENDED_PENDING, Lease.STATE_SUSPENDED_SCHEDULED):
+ # Don't do anything. The lease is suspending or suspended.
+ # Must stay that way.
+ new_state[lease_to_preempt] = None
+ elif lease_state != Lease.STATE_READY:
+ new_state[lease_to_preempt] = Lease.STATE_READY
+
+
for lease_to_preempt in preempted_leases:
- 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()
- dur = lease_to_preempt.duration.requested - lease_to_preempt.duration.accumulated - (preempt_vmrr.end - preempt_vmrr.start)
-
+ dur = durs[lease_to_preempt]
node_ids = self.slottable.nodes.keys()
earliest = {}
try:
+ # Kludge: so scheduler will schedule taking into account the remaining
+ # duration at the time of the preempt, not right now.
+ orig_accduration = lease.duration.accumulated
+ lease.duration.accumulated = lease.duration.requested - dur
+
if lease_to_preempt.id in cancelled:
for node in node_ids:
earliest[node] = EarliestStartingTime(nexttime, EarliestStartingTime.EARLIEST_NOPREPARATION)
@@ -821,6 +843,8 @@
for node in node_ids:
earliest[node] = EarliestStartingTime(preemption_time, EarliestStartingTime.EARLIEST_NOPREPARATION)
(new_vmrr, preemptions) = self.vm_scheduler.reschedule_deadline(lease_to_preempt, dur, nexttime, earliest, override_state = Lease.STATE_SUSPENDED_PENDING)
+
+ lease.duration.accumulated = orig_accduration
# Add VMRR to lease
lease_to_preempt.append_vmrr(new_vmrr)
@@ -848,8 +872,9 @@
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]
+ vm_rr.prematureend = orig_vmrrs_data[vm_rr][2]
+ vm_rr.pre_rrs = orig_vmrrs_data[vm_rr][3]
+ vm_rr.post_rrs = orig_vmrrs_data[vm_rr][4]
self.slottable.pop()
raise NotSchedulableException, "Unable to preempt leases to make room for lease."
else:
@@ -865,7 +890,8 @@
self.slottable.remove_reservation(rr)
for l in new_state:
- l.set_state(new_state[l])
+ if new_state[l] != None:
+ l.set_state(new_state[l])
for l in preempted_leases:
self.logger.vdebug("Lease %i after preemption:" % l.id)
Modified: branches/1.1/src/haizea/pluggable/policies/preemption.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-14 02:14:17 UTC (rev 762)
+++ branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-14 04:09:27 UTC (rev 763)
@@ -118,6 +118,12 @@
if preempt_vmrr.is_suspending():
return -1
+ # We can only preempt leases in these states
+ if not preemptee.get_state() in (Lease.STATE_SCHEDULED, Lease.STATE_READY,
+ Lease.STATE_ACTIVE, Lease.STATE_SUSPENDING, Lease.STATE_SUSPENDED_PENDING,
+ Lease.STATE_SUSPENDED_SCHEDULED):
+ return -1
+
deadline = preemptee.deadline
remaining_duration = preempt_vmrr.end - time
slack = (deadline - time) / remaining_duration
More information about the Haizea-commit
mailing list