[haizea-commit] r834 - in branches/1.1/src/haizea/core/scheduler: . preparation_schedulers

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Wed Jul 21 13:28:03 CDT 2010


Author: borja
Date: 2010-07-21 13:28:03 -0500 (Wed, 21 Jul 2010)
New Revision: 834

Modified:
   branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py
   branches/1.1/src/haizea/core/scheduler/resourcepool.py
   branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
Log:
Saner migration scheduling

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-21 18:27:32 UTC (rev 833)
+++ branches/1.1/src/haizea/core/scheduler/preparation_schedulers/imagetransfer.py	2010-07-21 18:28:03 UTC (rev 834)
@@ -64,8 +64,11 @@
         
         # This code is the same as the one in vm_scheduler
         # Should be factored out
+ 
         last_vmrr = lease.get_last_vmrr()
-        vnode_migrations = dict([(vnode, (last_vmrr.nodes[vnode], vmrr.nodes[vnode])) for vnode in vmrr.nodes])
+
+        vnode_mappings = self.resourcepool.get_disk_image_mappings(lease)
+        vnode_migrations = dict([(vnode, (vnode_mappings[vnode], vmrr.nodes[vnode])) for vnode in vmrr.nodes if vnode_mappings[vnode] != vmrr.nodes[vnode]])
         
         mustmigrate = False
         for vnode in vnode_migrations:

Modified: branches/1.1/src/haizea/core/scheduler/resourcepool.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/resourcepool.py	2010-07-21 18:27:32 UTC (rev 833)
+++ branches/1.1/src/haizea/core/scheduler/resourcepool.py	2010-07-21 18:28:03 UTC (rev 834)
@@ -64,14 +64,18 @@
             raise
 
     def verify_deploy(self, lease, rr):
+        deployed = False
         if isinstance(lease.software, UnmanagedSoftwareEnvironment):
-            return True
+            deployed = True
         elif isinstance(lease.software, DiskImageSoftwareEnvironment):
+            missing = False
             for (vnode, pnode) in rr.nodes.items():
                 img = self.get_node(pnode).get_diskimage(lease, vnode, lease.software.image_id)
                 if img == None:
-                    return False
-            return True
+                    self.logger.error("L%iV%i is not deployed in node %i" % (lease.id, vnode, pnode))
+                    missing = True
+            if not missing: deployed = True
+        return deployed
          
     def suspend_vms(self, lease, rr):
         # Add memory image files
@@ -173,7 +177,23 @@
         node.print_files()
         node.remove_ramfile(lease, vnode)
         node.print_files()
-        
+      
+    def get_disk_image_mappings(self, lease):
+        vnode_map = {}
+        for n in self.nodes.values():
+            disk_images = [img for img in n.get_diskimages() if img.lease == lease]
+            for img in disk_images:
+                vnode_map[img.vnode] = n.id
+        return vnode_map
+    
+    def get_ram_image_mappings(self, lease):
+        vnode_map = {}
+        for n in self.nodes.values():
+            disk_images = [img for img in n.get_ramimages() if img.lease == lease]
+            for img in disk_images:
+                vnode_map[img.vnode] = n.id
+        return vnode_map    
+            
     def get_max_disk_usage(self):
         return max([n.get_disk_usage() for n in self.nodes.values()])
     
@@ -228,6 +248,9 @@
 
     def get_diskimages(self):
         return [f for f in self.files if isinstance(f, DiskImageFile)]
+
+    def get_ramimages(self):
+        return [f for f in self.files if isinstance(f, RAMImageFile)]
         
     def print_files(self):
         images = ""

Modified: branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/vm_scheduler.py	2010-07-21 18:27:32 UTC (rev 833)
+++ branches/1.1/src/haizea/core/scheduler/vm_scheduler.py	2010-07-21 18:28:03 UTC (rev 834)
@@ -153,11 +153,12 @@
         nexttime -- The next time at which the scheduler can allocate resources.
         """
         
-        # Determine what migrations have to be done. We do this by looking at
-        # the mapping in the previous VM RR and in the new VM RR
+        # Determine what migrations have to be done.
         last_vmrr = lease.get_last_vmrr()
-        vnode_migrations = dict([(vnode, (last_vmrr.nodes[vnode], vmrr.nodes[vnode])) for vnode in vmrr.nodes])
         
+        vnode_mappings = self.resourcepool.get_ram_image_mappings(lease)
+        vnode_migrations = dict([(vnode, (vnode_mappings[vnode], vmrr.nodes[vnode])) for vnode in vmrr.nodes if vnode_mappings[vnode] != vmrr.nodes[vnode]])
+        
         # Determine if we actually have to migrate
         mustmigrate = False
         for vnode in vnode_migrations:
@@ -231,9 +232,9 @@
             self.future_leases.remove(vmrr.lease)
             get_persistence().persist_future_leases(self.future_leases)
 
-        # If there are any pre-RRs that are scheduled, remove them
+        # If there are any pre-RRs that are scheduled or active, remove them
         for rr in vmrr.pre_rrs:
-            if rr.state == ResourceReservation.STATE_SCHEDULED:
+            if rr.state != ResourceReservation.STATE_DONE:
                 self.slottable.remove_reservation(rr)
 
         # If there are any post RRs, remove them
@@ -1320,7 +1321,7 @@
 
         if get_config().get("lease-preparation") == "imagetransfer":
             if not self.resourcepool.verify_deploy(l, rr):
-                self.logger.error("Deployment was not complete.")
+                self.logger.error("Deployment of lease %i was not complete." % l.id)
                 raise # TODO raise something better
 
         # Kludge: Should be done by the preparations scheduler



More information about the Haizea-commit mailing list