[haizea-commit] r570 - in trunk/src/haizea/resourcemanager: . scheduler scheduler/preparation_schedulers
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Sun Feb 15 16:31:40 CST 2009
Author: borja
Date: 2009-02-15 16:31:33 -0600 (Sun, 15 Feb 2009)
New Revision: 570
Modified:
trunk/src/haizea/resourcemanager/leases.py
trunk/src/haizea/resourcemanager/rm.py
trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py
trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/imagetransfer.py
trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/unmanaged.py
trunk/src/haizea/resourcemanager/scheduler/slottable.py
trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py
Log:
Lots of small fixes to issues uncovered during pre-release testing for TP1.3
Modified: trunk/src/haizea/resourcemanager/leases.py
===================================================================
--- trunk/src/haizea/resourcemanager/leases.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/leases.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -218,6 +218,7 @@
(Lease.STATE_REJECTED, "")],
Lease.STATE_SCHEDULED: [(Lease.STATE_PREPARING, ""),
+ (Lease.STATE_QUEUED, ""),
(Lease.STATE_READY, ""),
(Lease.STATE_CANCELLED, "")],
@@ -229,10 +230,12 @@
(Lease.STATE_FAIL, "")],
Lease.STATE_READY: [(Lease.STATE_ACTIVE, ""),
+ (Lease.STATE_QUEUED, ""),
(Lease.STATE_CANCELLED, ""),
(Lease.STATE_FAIL, "")],
Lease.STATE_ACTIVE: [(Lease.STATE_SUSPENDING, ""),
+ (Lease.STATE_QUEUED, ""),
(Lease.STATE_DONE, ""),
(Lease.STATE_CANCELLED, ""),
(Lease.STATE_FAIL, "")],
@@ -246,12 +249,12 @@
(Lease.STATE_CANCELLED, ""),
(Lease.STATE_FAIL, "")],
- Lease.STATE_SUSPENDED_QUEUED: [(Lease.STATE_SUSPENDED_QUEUED, ""),
- (Lease.STATE_SUSPENDED_SCHEDULED, ""),
+ Lease.STATE_SUSPENDED_QUEUED: [(Lease.STATE_SUSPENDED_SCHEDULED, ""),
(Lease.STATE_CANCELLED, ""),
(Lease.STATE_FAIL, "")],
- Lease.STATE_SUSPENDED_SCHEDULED: [(Lease.STATE_MIGRATING, ""),
+ Lease.STATE_SUSPENDED_SCHEDULED: [(Lease.STATE_SUSPENDED_QUEUED, ""),
+ (Lease.STATE_MIGRATING, ""),
(Lease.STATE_RESUMING, ""),
(Lease.STATE_CANCELLED, ""),
(Lease.STATE_FAIL, "")],
Modified: trunk/src/haizea/resourcemanager/rm.py
===================================================================
--- trunk/src/haizea/resourcemanager/rm.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/rm.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -296,7 +296,12 @@
self.rpc_server.start()
# Start the clock
- self.clock.run()
+ try:
+ self.clock.run()
+ except UnrecoverableError, exc:
+ self.__unrecoverable_error(exc)
+ except Exception, exc:
+ self.__unexpected_exception(exc)
def stop(self):
"""Stops the resource manager by stopping the clock"""
@@ -479,10 +484,10 @@
# Exit
treatment = self.config.get("lease-failure-handling")
- if treatment == constants.ONFAILURE_EXIT:
+ if treatment == constants.ONFAILURE_EXIT_RAISE:
+ raise
+ else:
exit(1)
- elif treatment == constants.ONFAILURE_EXIT_RAISE:
- raise
class Clock(object):
Modified: trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/scheduler/lease_scheduler.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -464,7 +464,8 @@
elif lease_state == Lease.STATE_SUSPENDED_QUEUED:
# No need to transfer images from repository
# (only intra-node transfer)
- earliest = dict([(node+1, [nexttime, constants.REQTRANSFER_NO, None]) for node in range(lease.numnodes)])
+ migr_time = self.vm_scheduler.estimate_migration_time(lease)
+ earliest = dict([(node+1, [nexttime + migr_time, constants.REQTRANSFER_NO, None]) for node in range(lease.numnodes)])
else:
raise InconsistentLeaseStateError(lease, doing = "scheduling a best-effort lease")
@@ -565,9 +566,12 @@
self.vm_scheduler.cancel_vm(vmrr)
lease.remove_vmrr(vmrr)
self.preparation_scheduler.cancel_preparation(lease)
- lease.set_state(Lease.STATE_QUEUED)
+ # TODO: Take into account other states
+ if lease.get_state() == Lease.STATE_SUSPENDED_SCHEDULED:
+ lease.set_state(Lease.STATE_SUSPENDED_QUEUED)
+ else:
+ lease.set_state(Lease.STATE_QUEUED)
self.__enqueue_in_order(lease)
- get_accounting().incr_counter(constants.COUNTER_QUEUESIZE, lease.id)
else:
self.logger.info("... lease #%i will be suspended at %s." % (lease.id, preemption_time))
self.vm_scheduler.preempt_vm(vmrr, preemption_time)
Modified: trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/imagetransfer.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/imagetransfer.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/imagetransfer.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -20,10 +20,9 @@
from haizea.resourcemanager.scheduler.preparation_schedulers import PreparationScheduler
from haizea.resourcemanager.scheduler.slottable import ResourceReservation
from haizea.resourcemanager.leases import Lease, ARLease, BestEffortLease
-from haizea.resourcemanager.scheduler import ReservationEventHandler
+from haizea.resourcemanager.scheduler import ReservationEventHandler, NotSchedulableException
from haizea.common.utils import estimate_transfer_time, get_config
from haizea.resourcemanager.scheduler.slottable import ResourceTuple
-from haizea.resourcemanager.scheduler import ReservationEventHandler
import copy
Modified: trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/unmanaged.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/unmanaged.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/scheduler/preparation_schedulers/unmanaged.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -36,8 +36,9 @@
earliest = dict([(node, [nexttime, constants.REQTRANSFER_NO, None]) for node in nod_ids])
return earliest
- def cancel_deployment(self, lease):
- pass
+ def cancel_preparation(self, lease):
+ self.cleanup(lease)
+ lease.diskimagemap = {}
def cleanup(self, lease):
for vnode, pnode in lease.diskimagemap.items():
Modified: trunk/src/haizea/resourcemanager/scheduler/slottable.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/slottable.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/scheduler/slottable.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -230,10 +230,10 @@
if resreq != None:
newnodes = {}
for n, node in nodes.items():
- if not resreq.fits_in(node.capacity) or (canpreempt and not resreq.fits_in(node.capacitywithpreemption)):
+ if (not canpreempt and resreq.fits_in(node.capacity)) or (canpreempt and resreq.fits_in(node.capacitywithpreemption)):
+ newnodes[n]=node
+ else:
pass
- else:
- newnodes[n]=node
nodes = newnodes
return nodes
Modified: trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py
===================================================================
--- trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py 2009-02-13 23:50:43 UTC (rev 569)
+++ trunk/src/haizea/resourcemanager/scheduler/vm_scheduler.py 2009-02-15 22:31:33 UTC (rev 570)
@@ -30,6 +30,8 @@
class VMScheduler(object):
"""The Haizea VM Scheduler
+ TODO: This class needs to be documented. It will also change quite a bit in TP2.0, when all
+ policy decisions are factored out into a separate module.
"""
def __init__(self, slottable, resourcepool):
@@ -408,7 +410,9 @@
return vmrr, []
- # TODO: This has to be tied in with the preparation scheduler
+ def estimate_migration_time(self, lease):
+ return self.__estimate_migration_time(lease)
+
def schedule_migration(self, lease, vmrr, nexttime):
last_vmrr = lease.get_last_vmrr()
vnode_migrations = dict([(vnode, (last_vmrr.nodes[vnode], vmrr.nodes[vnode])) for vnode in vmrr.nodes])
@@ -439,7 +443,7 @@
migrations.append(migration)
# Create migration RRs
- start = last_vmrr.post_rrs[-1].end
+ start = max(last_vmrr.post_rrs[-1].end, nexttime)
migr_time = self.__estimate_migration_time(lease)
bandwidth = self.resourcepool.info.get_migration_bandwidth()
migr_rrs = []
@@ -861,13 +865,16 @@
else:
return self.__estimate_suspend_resume_time(lease, rate)
-
def __estimate_migration_time(self, lease):
whattomigrate = get_config().get("what-to-migrate")
- bandwidth = self.resourcepool.info.get_migration_bandwidth()
if whattomigrate == constants.MIGRATE_NONE:
- return TimeDelta(seconds=0)
+ # TODO: At this point, giving an RR a duration of 0 seconds
+ # will produce unexpected results. So, we need to give
+ # migrations a symbolic duration of one second,
+ # even when we are assuming that migrations are instantaneous
+ return TimeDelta(seconds=1)
else:
+ bandwidth = self.resourcepool.info.get_migration_bandwidth()
if whattomigrate == constants.MIGRATE_MEM:
mbtotransfer = lease.requested_resources.get_by_type(constants.RES_MEM)
elif whattomigrate == constants.MIGRATE_MEMDISK:
@@ -1178,7 +1185,7 @@
rr.state = ResourceReservation.STATE_DONE
l.print_contents()
self.logger.debug("LEASE-%i End of handleEndShutdown" % l.id)
- self.logger.info("Lease %i shutdown." % (l.id))
+ self.logger.info("Lease %i's VMs have shutdown." % (l.id))
raise NormalEndLeaseException
@@ -1320,6 +1327,12 @@
rrdur = self.end - self.start
if remdur < rrdur:
self.prematureend = self.start + remdur
+ # Kludgy, but this corner case actually does happen
+ # (because of preemptions, it may turn out that
+ # the premature end time coincides with the
+ # starting time of the VMRR)
+ if self.prematureend == self.start:
+ self.prematureend += 1
else:
self.prematureend = None
else:
More information about the Haizea-commit
mailing list