[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