[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