[haizea-commit] r754 - in branches/1.1/src/haizea: core/scheduler pluggable/accounting pluggable/policies

haizea-commit at mailman.cs.uchicago.edu haizea-commit at mailman.cs.uchicago.edu
Tue Jan 12 17:45:22 CST 2010


Author: borja
Date: 2010-01-12 17:45:22 -0600 (Tue, 12 Jan 2010)
New Revision: 754

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/accounting/leases.py
   branches/1.1/src/haizea/pluggable/policies/pricing.py
Log:
Miscellaneous fixes to deadline scheduling. Added pricing of surcharge from preempted leases.

Modified: branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/lease_scheduler.py	2010-01-12 23:44:21 UTC (rev 753)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py	2010-01-12 23:45:22 UTC (rev 754)
@@ -778,6 +778,12 @@
 
         if feasible:
             for lease_to_preempt in preempted_leases:
+                if lease.id in cancelled:
+                    dur = lease_to_preempt.duration.requested - lease_to_preempt.duration.accumulated
+                else:
+                    preempt_vmrr = lease_to_preempt.get_last_vmrr()
+                    dur = lease_to_preempt.duration.requested - lease_to_preempt.duration.accumulated - (preempt_vmrr.end - preempt_vmrr.start)
+                
                 node_ids = self.slottable.nodes.keys()
                 earliest = {}
    

Modified: branches/1.1/src/haizea/core/scheduler/vm_scheduler.py
===================================================================
--- branches/1.1/src/haizea/core/scheduler/vm_scheduler.py	2010-01-12 23:44:21 UTC (rev 753)
+++ branches/1.1/src/haizea/core/scheduler/vm_scheduler.py	2010-01-12 23:45:22 UTC (rev 754)
@@ -611,7 +611,7 @@
             res_str = " (resuming)"
         if mustsuspend:
             susp_str = " (suspending)"
-        self.logger.info("Lease #%i has been scheduled on nodes %s from %s%s to %s%s" % (lease.id, mapping.values(), start, res_str, end, susp_str))
+        self.logger.info("Lease #%i can be scheduled on nodes %s from %s%s to %s%s" % (lease.id, mapping.values(), start, res_str, end, susp_str))
 
         return vmrr, preemptions
 
@@ -624,13 +624,11 @@
         slack = (lease.deadline - lease.start.requested) / lease.duration.requested
         if slack <= 2.0:
             try:
+                self.logger.debug("Trying to schedule lease #%i as an advance reservation..." % lease.id)
                 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:
+                self.logger.debug("Lease #%i cannot be scheduled as an advance reservation, trying as best-effort..." % lease.id)
                 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)

Modified: branches/1.1/src/haizea/pluggable/accounting/leases.py
===================================================================
--- branches/1.1/src/haizea/pluggable/accounting/leases.py	2010-01-12 23:44:21 UTC (rev 753)
+++ branches/1.1/src/haizea/pluggable/accounting/leases.py	2010-01-12 23:45:22 UTC (rev 754)
@@ -257,10 +257,12 @@
     
     """
     COUNTER_REVENUE="Revenue"
+    COUNTER_SURCHARGE="Surcharge"
     COUNTER_MISSED_REVENUE_UNDERCHARGE="Missed revenue (undercharging)"
     COUNTER_MISSED_REVENUE_REJECT="Missed revenue (reject)"
     COUNTER_MISSED_REVENUE_REJECT_BY_USER="Missed revenue (reject by user)"
     STAT_REVENUE="Revenue"
+    STAT_SURCHARGE="Revenue"
     STAT_MISSED_REVENUE_UNDERCHARGE="Missed revenue (undercharging)"
     STAT_MISSED_REVENUE_REJECT="Missed revenue (reject)"
     STAT_MISSED_REVENUE_REJECT_BY_USER="Missed revenue (reject by user)"
@@ -271,10 +273,12 @@
         """See AccountingProbe.__init__"""        
         AccountingProbe.__init__(self, accounting)
         self.accounting.create_counter(PriceProbe.COUNTER_REVENUE, AccountingDataCollection.AVERAGE_NONE)
+        self.accounting.create_counter(PriceProbe.COUNTER_SURCHARGE, AccountingDataCollection.AVERAGE_NONE)
         self.accounting.create_counter(PriceProbe.COUNTER_MISSED_REVENUE_UNDERCHARGE, AccountingDataCollection.AVERAGE_NONE)
         self.accounting.create_counter(PriceProbe.COUNTER_MISSED_REVENUE_REJECT, AccountingDataCollection.AVERAGE_NONE)
         self.accounting.create_counter(PriceProbe.COUNTER_MISSED_REVENUE_REJECT_BY_USER, AccountingDataCollection.AVERAGE_NONE)
         self.accounting.create_stat(PriceProbe.STAT_REVENUE)
+        self.accounting.create_stat(PriceProbe.STAT_SURCHARGE)
         self.accounting.create_stat(PriceProbe.STAT_MISSED_REVENUE_UNDERCHARGE)
         self.accounting.create_stat(PriceProbe.STAT_MISSED_REVENUE_REJECT)
         self.accounting.create_stat(PriceProbe.STAT_MISSED_REVENUE_REJECT_BY_USER)
@@ -285,6 +289,7 @@
     def finalize_accounting(self):
         """See AccountingProbe.finalize_accounting"""        
         self._set_stat_from_counter(PriceProbe.STAT_REVENUE, PriceProbe.COUNTER_REVENUE)
+        self._set_stat_from_counter(PriceProbe.STAT_SURCHARGE, PriceProbe.COUNTER_SURCHARGE)
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_UNDERCHARGE, PriceProbe.COUNTER_MISSED_REVENUE_UNDERCHARGE)
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT, PriceProbe.COUNTER_MISSED_REVENUE_REJECT)
         self._set_stat_from_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT_BY_USER, PriceProbe.COUNTER_MISSED_REVENUE_REJECT_BY_USER)

Modified: branches/1.1/src/haizea/pluggable/policies/pricing.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/pricing.py	2010-01-12 23:44:21 UTC (rev 753)
+++ branches/1.1/src/haizea/pluggable/policies/pricing.py	2010-01-12 23:45:22 UTC (rev 754)
@@ -65,10 +65,20 @@
         self.fair_rate = get_config().config.getfloat("pricing", "fair-rate")
     
     def get_fair_price(self, lease):
-        fair_price = (lease.duration.requested.seconds / 3600) * lease.numnodes * self.fair_rate
-        return fair_price
+        return (lease.duration.requested.seconds / 3600.0) * lease.numnodes * self.fair_rate 
     
+    def get_surcharge(self, preempted_leases):
+        surcharge = 0
+        for l in preempted_leases:
+            suspend_time = l.estimate_suspend_time()
+            resume_time = l.estimate_resume_time()
+            surcharge += ((suspend_time + resume_time).seconds / 3600.0) * l.numnodes * self.fair_rate 
+
+        return surcharge    
     
+    def get_price(self, lease, preempted_leases):
+        return self.get_fair_price(lease) + self.get_surcharge(preempted_leases)
+    
 class AlwaysFairPricePolicy(FairPricePolicy):
     """...
     """    
@@ -91,7 +101,7 @@
         lease -- Lease that is being scheduled.
         preempted_leases -- Leases that would have to be preempted to support this lease.
         """
-        return self.get_fair_price(lease)
+        return self.get_price(lease, preempted_leases)
     
 class RandomMultipleOfFairPricePolicy(FairPricePolicy):
     """Base class for policies that rely on the notion of a fair rate for computation



More information about the Haizea-commit mailing list