[haizea-commit] r823 - branches/1.1/src/haizea/core/scheduler/preparation_schedulers

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Thu Jul 8 16:55:57 CDT 2010


Author: borja
Date: 2010-07-08 16:55:57 -0500 (Thu, 08 Jul 2010)
New Revision: 823

Modified:
   branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py
Log:
Preparation scheduling for AR leases was broken. THere were cases when it would schedule an image transfer that was actually infeasible.

Modified: branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py	2010-07-08 21:55:15 UTC (rev 822)
+++ branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py	2010-07-08 21:55:57 UTC (rev 823)
@@ -50,13 +50,13 @@
                                 on_start = ImageTransferPreparationScheduler._handle_start_migrate,
                                 on_end   = ImageTransferPreparationScheduler._handle_end_migrate)
 
-    def schedule(self, lease, vmrr, earliest):
+    def schedule(self, lease, vmrr, earliest, nexttime):
         if type(lease.software) == UnmanagedSoftwareEnvironment:
             return [], True
         if lease.get_type() == Lease.ADVANCE_RESERVATION:
-            return self.__schedule_deadline(lease, vmrr, earliest)
+            return self.__schedule_deadline(lease, vmrr, earliest, nexttime)
         elif lease.get_type() in (Lease.BEST_EFFORT, Lease.IMMEDIATE):
-            return self.__schedule_asap(lease, vmrr, earliest)
+            return self.__schedule_asap(lease, vmrr, earliest, nexttime)
 
     def schedule_migration(self, lease, vmrr, nexttime):
         if type(lease.software) == UnmanagedSoftwareEnvironment:
@@ -203,7 +203,7 @@
         self.__remove_files(lease)
   
         
-    def __schedule_deadline(self, lease, vmrr, earliest):
+    def __schedule_deadline(self, lease, vmrr, earliest, nexttime):
         config = get_config()
         reusealg = config.get("diskimage-reuse")
         avoidredundant = config.get("avoid-redundant-transfers")
@@ -234,7 +234,7 @@
             transfer_rrs = []
         else:
             try:
-                transfer_rrs = self.__schedule_imagetransfer_edf(lease, musttransfer, earliest)
+                transfer_rrs = self.__schedule_imagetransfer_edf(lease, musttransfer, earliest, nexttime)
             except NotSchedulableException, exc:
                 raise
  
@@ -248,7 +248,7 @@
         return transfer_rrs, is_ready
 
 
-    def __schedule_asap(self, lease, vmrr, earliest):
+    def __schedule_asap(self, lease, vmrr, earliest, nexttime):
         config = get_config()
         reusealg = config.get("diskimage-reuse")
         avoidredundant = config.get("avoid-redundant-transfers")
@@ -285,7 +285,7 @@
         return transfer_rrs, is_ready
 
 
-    def __schedule_imagetransfer_edf(self, lease, musttransfer, earliest):
+    def __schedule_imagetransfer_edf(self, lease, musttransfer, earliest, nexttime):
         # Estimate image transfer time 
         bandwidth = self.deployment_enact.get_bandwidth()
         config = get_config()
@@ -296,7 +296,9 @@
 
         # Determine start time
         start = self.__get_last_transfer_slot(lease.start.requested, transfer_duration)
-
+        if start < nexttime:
+            raise NotSchedulableException("Could not schedule the file transfer to complete in time.")
+        
         res = {}
         resimgnode = Capacity([constants.RES_NETOUT])
         resimgnode.set_quantity(constants.RES_NETOUT, bandwidth)
@@ -392,10 +394,21 @@
             return deadline - required_duration
         else:
             for i in xrange(len(self.transfers) - 1, 0, -1):
-                if self.transfers[i].start != self.transfers[i-1].end:
-                    hole_duration = self.transfers[i].start - self.transfers[i-1].end
-                    if hole_duration >= required_duration:
-                        return self.transfers[i].start - required_duration
+                hole_start =  self.transfers[i-1].end
+                hole_end = self.transfers[i].start
+                if deadline > hole_start and deadline <= hole_end:
+                    hole_duration = deadline - hole_start
+                else:
+                    hole_duration = hole_end - hole_start
+                if hole_duration < required_duration or hole_start >= deadline:
+                    # We're not interested in gaps after the deadline
+                    # or gaps insufficient to support the transfer
+                    pass
+                else:
+                    if deadline > hole_start and deadline <= hole_end:
+                        return deadline - required_duration
+                    else:
+                        return hole_end - required_duration                    
             return self.transfers[0].start - required_duration
 
     def __remove_transfers(self, lease):



More information about the Haizea-commit mailing list