[haizea-commit] r752 - in branches/1.1/src/haizea: core/scheduler pluggable/policies
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Sun Jan 10 16:50:25 CST 2010
Author: borja
Date: 2010-01-10 16:50:24 -0600 (Sun, 10 Jan 2010)
New Revision: 752
Modified:
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:
Corrections to deadline scheduling with preemption.
Modified: branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-10 00:32:28 UTC (rev 751)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-10 22:50:24 UTC (rev 752)
@@ -754,10 +754,8 @@
for rr in vmrr.post_rrs:
self.slottable.add_reservation(rr)
- for preempt_vmrr in [l.get_last_vmrr() for l in preempted_leases]:
- self.vm_scheduler.cancel_vm(preempt_vmrr)
-
feasible = True
+ cancelled = []
for lease_to_preempt in preempted_leases:
preempt_vmrr = lease_to_preempt.get_last_vmrr()
dur = preempt_vmrr.end - preemption_time
@@ -765,12 +763,9 @@
if preempt_vmrr.state == ResourceReservation.STATE_SCHEDULED and preempt_vmrr.start >= preemption_time:
self.logger.debug("Lease was set to start in the middle of the preempting lease.")
self.preparation_scheduler.cancel_preparation(lease_to_preempt)
- lease.remove_vmrr(preempt_vmrr)
- try:
- (vmrr, preemptions) = self.vm_scheduler.schedule(lease, nexttime, earliest)
- except:
- feasible = False
- break
+ lease_to_preempt.remove_vmrr(preempt_vmrr)
+ self.vm_scheduler.cancel_vm(preempt_vmrr)
+ cancelled.append(lease_to_preempt.id)
else:
can_suspend = self.vm_scheduler.can_suspend_at(lease_to_preempt, preemption_time)
@@ -781,14 +776,21 @@
self.vm_scheduler.preempt_vm(preempt_vmrr, preemption_time)
+ if feasible:
+ for lease_to_preempt in preempted_leases:
node_ids = self.slottable.nodes.keys()
earliest = {}
- for node in node_ids:
- earliest[node] = EarliestStartingTime(preemption_time, EarliestStartingTime.EARLIEST_NOPREPARATION)
-
+
try:
- (new_vmrr, preemptions) = self.vm_scheduler.schedule(lease_to_preempt, dur, nexttime, earliest, override_state = Lease.STATE_SUSPENDED_PENDING)
-
+ if lease_to_preempt.id in cancelled:
+ for node in node_ids:
+ earliest[node] = EarliestStartingTime(nexttime, EarliestStartingTime.EARLIEST_NOPREPARATION)
+ (new_vmrr, preemptions) = self.vm_scheduler.reschedule_deadline(lease_to_preempt, dur, nexttime, earliest)
+ else:
+ 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)
+
# Add VMRR to lease
lease_to_preempt.append_vmrr(new_vmrr)
@@ -806,12 +808,9 @@
for rr in new_vmrr.post_rrs:
self.slottable.add_reservation(rr)
except:
- exit()
feasible = False
break
-
-
-
+
if not feasible:
for l in preempted_leases:
l.vm_rrs = orig_vmrrs[l.id]
Modified: branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/vm_scheduler.py 2010-01-10 00:32:28 UTC (rev 751)
+++ branches/1.1/src/haizea/core/scheduler/vm_scheduler.py 2010-01-10 22:50:24 UTC (rev 752)
@@ -281,7 +281,7 @@
self.__schedule_suspension(vmrr, t)
# Update the VMRR in the slot table
- #self.slottable.update_reservation(vmrr, old_start, old_end)
+ self.slottable.update_reservation(vmrr, old_start, old_end)
# Add the suspension RRs to the VM's post-RRs
for susprr in vmrr.post_rrs:
@@ -621,14 +621,31 @@
for n in earliest:
earliest[n].time = max(lease.start.requested, earliest[n].time)
- vmrr, preemptions = self.__schedule_asap(lease, duration, nexttime, earliest, allow_in_future = True, override_state=override_state)
+ slack = (lease.deadline - lease.start.requested) / lease.duration.requested
+ if slack <= 2.0:
+ try:
+ vmrr, preemptions = self.__schedule_exact(lease, duration, nexttime, earliest)
+ if lease.duration.known != None:
+ print "LEASE %i - %.2f - %i" % (lease.id, slack, lease.duration.known.seconds * lease.numnodes)
+ else:
+ print "LEASE %i - %.2f - %i" % (lease.id, slack, lease.duration.requested.seconds * lease.numnodes)
+ return vmrr, preemptions
+ except:
+ vmrr, preemptions = self.__schedule_asap(lease, duration, nexttime, earliest, allow_in_future = True, override_state=override_state)
+ if vmrr.end - vmrr.start != duration or vmrr.end > lease.deadline or len(preemptions)>0:
+ self.logger.debug("Lease #%i cannot be scheduled before deadline using best-effort." % lease.id)
+ raise NotSchedulableException, "Could not schedule before deadline without making other leases miss deadline"
+ else:
+ return vmrr, preemptions
+ else:
+ vmrr, preemptions = self.__schedule_asap(lease, duration, nexttime, earliest, allow_in_future = True, override_state=override_state)
- if vmrr.end - vmrr.start != duration or vmrr.end > lease.deadline or len(preemptions)>0:
+ if vmrr == None or vmrr.end - vmrr.start != duration or vmrr.end > lease.deadline or len(preemptions)>0:
self.logger.debug("Lease #%i cannot be scheduled before deadline using best-effort." % lease.id)
self.slottable.push()
-
- future_vmrrs = self.slottable.get_reservations_on_or_after(lease.start.requested)
+ 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]
for vmrr in future_vmrrs:
@@ -658,17 +675,6 @@
self.logger.debug("Lease %s could not be rescheduled, undoing changes." % lease2.id)
self.slottable.pop()
- slack = (lease.deadline - lease.start.requested) / lease.duration.requested
- if slack <= 2.0:
- try:
- vmrr, preemptions = self.__schedule_exact(lease, duration, nexttime, earliest)
- if lease.duration.known != None:
- print "LEASE %i - %.2f - %i" % (lease.id, slack, lease.duration.known.seconds * lease.numnodes)
- else:
- print "LEASE %i - %.2f - %i" % (lease.id, slack, lease.duration.requested.seconds * lease.numnodes)
- return vmrr, preemptions
- except:
- raise NotSchedulableException, "Could not schedule before deadline without making other leases miss deadline"
raise NotSchedulableException, "Could not schedule before deadline without making other leases miss deadline"
for rr in vmrr.pre_rrs:
@@ -697,6 +703,17 @@
else:
return vmrr, preemptions
+ def reschedule_deadline(self, lease, duration, nexttime, earliest, override_state = None):
+ for n in earliest:
+ earliest[n].time = max(lease.start.requested, earliest[n].time)
+ vmrr, preemptions = self.__schedule_asap(lease, duration, nexttime, earliest, allow_in_future = True, override_state=override_state)
+ if vmrr == None or vmrr.end - vmrr.start != duration or vmrr.end > lease.deadline or len(preemptions)>0:
+ self.logger.debug("Lease #%i cannot be scheduled before deadline using best-effort." % lease.id)
+ raise NotSchedulableException, "Could not schedule before deadline without making other leases miss deadline"
+ else:
+ return vmrr, preemptions
+
+
def __find_fit_at_points(self, lease, requested_resources, changepoints, duration, min_duration):
""" Tries to map a lease in a given list of points in time
@@ -977,8 +994,8 @@
vmrr.update_end(susp_start)
# If there are any post RRs, remove them
- #for rr in vmrr.post_rrs:
- # self.slottable.remove_reservation(rr)
+ for rr in vmrr.post_rrs:
+ self.slottable.remove_reservation(rr)
vmrr.post_rrs = []
# Add the suspension RRs to the VM RR
Modified: branches/1.1/src/haizea/pluggable/policies/preemption.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-10 00:32:28 UTC (rev 751)
+++ branches/1.1/src/haizea/pluggable/policies/preemption.py 2010-01-10 22:50:24 UTC (rev 752)
@@ -111,7 +111,7 @@
remaining_duration = 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:
+ if time + delay + remaining_duration < deadline and not vmrr.is_suspending():
return slack
else:
return -1
More information about the Haizea-commit
mailing list