[haizea-commit] r756 - in branches/1.1: src/haizea/cli src/haizea/core/scheduler src/haizea/pluggable/accounting src/haizea/pluggable/policies tests
haizea-commit at mailman.cs.uchicago.edu
haizea-commit at mailman.cs.uchicago.edu
Tue Jan 12 18:32:28 CST 2010
Author: borja
Date: 2010-01-12 18:32:28 -0600 (Tue, 12 Jan 2010)
New Revision: 756
Modified:
branches/1.1/src/haizea/cli/annotator.py
branches/1.1/src/haizea/core/scheduler/lease_scheduler.py
branches/1.1/src/haizea/pluggable/accounting/leases.py
branches/1.1/src/haizea/pluggable/policies/__init__.py
branches/1.1/src/haizea/pluggable/policies/pricing.py
branches/1.1/tests/base_config_simulator.conf
branches/1.1/tests/price1.lwf
branches/1.1/tests/price2.lwf
branches/1.1/tests/pricedeadline.lwf
branches/1.1/tests/test_simul_pricing.py
Log:
Terminology change: "rate" instead of "fair price" and "markup"
Modified: branches/1.1/src/haizea/cli/annotator.py
===================================================================
--- branches/1.1/src/haizea/cli/annotator.py 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/cli/annotator.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -37,7 +37,7 @@
GENERAL_SEC = "general"
START_DELAY_SEC = "start-delay"
DEADLINE_STRETCH_SEC = "deadline-stretch"
- MARKUP_SEC = "user-markup"
+ RATE_SEC = "user-rate"
ATTRIBUTES_OPT = "attributes"
TYPE_OPT = "type"
@@ -73,7 +73,7 @@
...
"""))
- self.user_markups = {}
+ self.user_rates = {}
def run(self):
self.parse_options()
@@ -88,7 +88,7 @@
self.startdelay_dist = self.__get_dist(haizea_lwf_annotate.START_DELAY_SEC)
self.deadlinestretch_dist = self.__get_dist(haizea_lwf_annotate.DEADLINE_STRETCH_SEC)
- self.markup_dist = self.__get_dist(haizea_lwf_annotate.MARKUP_SEC)
+ self.rate_dist = self.__get_dist(haizea_lwf_annotate.RATE_SEC)
start_type = self.config.get(haizea_lwf_annotate.START_DELAY_SEC, haizea_lwf_annotate.TYPE_OPT)
deadline_type = self.config.get(haizea_lwf_annotate.DEADLINE_STRETCH_SEC, haizea_lwf_annotate.TYPE_OPT)
@@ -112,10 +112,10 @@
software = self.__get_software(lease)
- markup = self.__get_markup(lease)
+ rate = self.__get_rate(lease)
- if markup != None:
- extra["simul_pricemarkup"] = "%.2f" % markup
+ if rate != None:
+ extra["simul_userrate"] = "%.2f" % rate
annotation = LeaseAnnotation(lease_id, start, deadline, software, extra)
annotations[lease_id] = annotation
@@ -178,19 +178,19 @@
def __get_software(self, lease):
return None # TODO
- def __get_markup(self, lease):
- if self.markup_dist == None:
+ def __get_rate(self, lease):
+ if self.rate_dist == None:
return None
else:
if lease.user_id == -1:
- return self.markup_dist.get()
+ return self.rate_dist.get()
else:
- if self.user_markups.has_key(lease.user_id):
- return self.user_markups[lease.user_id]
+ if self.user_rates.has_key(lease.user_id):
+ return self.user_rates[lease.user_id]
else:
- markup = self.markup_dist.get()
- self.user_markups[lease.user_id] = markup
- return markup
+ rate = self.rate_dist.get()
+ self.user_rates[lease.user_id] = rate
+ return rate
def __get_dist(self, section):
if self.config.has_section(section):
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:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/core/scheduler/lease_scheduler.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -189,10 +189,6 @@
if lease.price == -1:
lease.set_state(Lease.STATE_REJECTED_BY_USER)
else:
- # We still want to record the fair price
- if get_config().get("policy.pricing") != "free":
- fair_price = get_policy().pricing.get_fair_price(lease)
- lease.extras["fair_price"] = fair_price
lease.set_state(Lease.STATE_REJECTED)
self.completed_leases.add(lease)
self.accounting.at_lease_done(lease)
@@ -593,15 +589,16 @@
# Determine whether to accept price or not (this in particular
# should happen in the lease admission step)
- if lease.extras.has_key("simul_pricemarkup"):
- markup = float(lease.extras["simul_pricemarkup"])
+ if lease.extras.has_key("simul_userrate"):
+ user_rate = float(lease.extras["simul_userrate"])
if get_config().get("policy.pricing") != "free":
- fair_price = get_policy().pricing.get_fair_price(lease)
- lease.extras["fair_price"] = fair_price
- if lease_price > fair_price * markup:
+ user_price = get_policy().pricing.get_base_price(lease, user_rate)
+ # We want to record the rate at which the lease was priced
+ lease.extras["rate"] = get_policy().pricing.rate
+ if lease_price > user_price:
lease.price = -1
lease.extras["rejected_price"] = lease_price
- raise NotSchedulableException, "Lease priced at %.2f. User is only willing to pay %.2f" % (lease_price, fair_price * markup)
+ raise NotSchedulableException, "Lease priced at %.2f. User is only willing to pay %.2f" % (lease_price, user_price)
lease.price = lease_price
## END NOT-FIT-FOR-PRODUCTION CODE
Modified: branches/1.1/src/haizea/pluggable/accounting/leases.py
===================================================================
--- branches/1.1/src/haizea/pluggable/accounting/leases.py 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/accounting/leases.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -20,6 +20,7 @@
from haizea.core.accounting import AccountingProbe, AccountingDataCollection
from haizea.core.leases import Lease
+from haizea.common.utils import get_policy
from mx.DateTime import TimeDelta
@@ -262,7 +263,7 @@
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_SURCHARGE="Surcharge"
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)"
@@ -293,7 +294,7 @@
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)
-
+
r1 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_UNDERCHARGE)
r2 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_REJECT)
r3 = self.accounting.get_last_counter_value(PriceProbe.COUNTER_MISSED_REVENUE_REJECT_BY_USER)
@@ -303,15 +304,17 @@
def at_lease_done(self, lease):
"""See AccountingProbe.at_lease_done"""
if lease.get_state() == Lease.STATE_DONE:
- self.accounting.incr_counter(PriceProbe.STAT_REVENUE, lease.id, lease.price)
+ self.accounting.incr_counter(PriceProbe.COUNTER_REVENUE, lease.id, lease.price)
self.accounting.set_lease_stat(PriceProbe.LEASE_STAT_PRICE, lease.id, lease.price)
- if lease.extras.has_key("fair_price"):
- markup = float(lease.extras["simul_pricemarkup"])
- fair_price = float(lease.extras["fair_price"])
- user_price = markup * fair_price
+ if lease.extras.has_key("rate") and lease.extras.has_key("simul_userrate"):
+ user_rate = float(lease.extras["simul_userrate"])
+ user_price = get_policy().pricing.get_base_price(lease, user_rate)
+
if lease.get_state() == Lease.STATE_DONE:
+ surcharge = lease.price - get_policy().pricing.get_base_price(lease, lease.extras["rate"])
self.accounting.incr_counter(PriceProbe.STAT_MISSED_REVENUE_UNDERCHARGE, lease.id, user_price - lease.price)
+ self.accounting.incr_counter(PriceProbe.STAT_SURCHARGE, lease.id, surcharge)
elif lease.get_state() == Lease.STATE_REJECTED:
self.accounting.incr_counter(PriceProbe.STAT_MISSED_REVENUE_REJECT, lease.id, user_price)
elif lease.get_state() == Lease.STATE_REJECTED_BY_USER:
Modified: branches/1.1/src/haizea/pluggable/policies/__init__.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/__init__.py 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/policies/__init__.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -33,7 +33,7 @@
"greedy": "haizea.pluggable.policies.host_selection.GreedyPolicy"}
pricing_mappings = {"free": "haizea.pluggable.policies.pricing.FreePolicy",
- "always-fair": "haizea.pluggable.policies.pricing.AlwaysFairPricePolicy",
- "random": "haizea.pluggable.policies.pricing.RandomMultipleOfFairPricePolicy",
- "maximum": "haizea.pluggable.policies.pricing.MaxMultipleOfFairPricePolicy",
- "adaptive": "haizea.pluggable.policies.pricing.AdaptiveFairPricePolicy"}
\ No newline at end of file
+ "constant": "haizea.pluggable.policies.pricing.ConstantRatePricePolicy",
+ "random": "haizea.pluggable.policies.pricing.RandomRatePricePolicy",
+ "maximum": "haizea.pluggable.policies.pricing.MaximumPricePolicy",
+ "adaptive": "haizea.pluggable.policies.pricing.AdaptiveRatePricePolicy"}
\ No newline at end of file
Modified: branches/1.1/src/haizea/pluggable/policies/pricing.py
===================================================================
--- branches/1.1/src/haizea/pluggable/policies/pricing.py 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/src/haizea/pluggable/policies/pricing.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -52,8 +52,8 @@
"""
return 0.0
-class FairPricePolicy(PricingPolicy):
- """Base class for policies that rely on the notion of a fair rate for computation
+class RatePricePolicy(PricingPolicy):
+ """Base class for policies that rely on the notion of a rate for computation
"""
def __init__(self, slottable):
"""Constructor
@@ -62,24 +62,26 @@
slottable -- A fully constructed SlotTable
"""
PricingPolicy.__init__(self, slottable)
- self.fair_rate = get_config().config.getfloat("pricing", "fair-rate")
+ self.rate = get_config().config.getfloat("pricing", "rate")
- def get_fair_price(self, lease):
- return (lease.duration.requested.seconds / 3600.0) * lease.numnodes * self.fair_rate
-
+ def get_base_price(self, lease, rate = None):
+ if rate == None:
+ rate = self.rate
+ return (lease.duration.requested.seconds / 3600.0) * lease.numnodes * 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
+ surcharge += ((suspend_time + resume_time).seconds / 3600.0) * l.numnodes * self.rate
return surcharge
def get_price(self, lease, preempted_leases):
- return self.get_fair_price(lease) + self.get_surcharge(preempted_leases)
+ return self.get_base_price(lease) + self.get_surcharge(preempted_leases)
-class AlwaysFairPricePolicy(FairPricePolicy):
+class ConstantRatePricePolicy(RatePricePolicy):
"""...
"""
def __init__(self, slottable):
@@ -88,7 +90,7 @@
Argument
slottable -- A fully constructed SlotTable
"""
- FairPricePolicy.__init__(self, slottable)
+ RatePricePolicy.__init__(self, slottable)
def price_lease(self, lease, preempted_leases):
"""Computes the price of a lease
@@ -103,8 +105,8 @@
"""
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
+class RandomRatePricePolicy(RatePricePolicy):
+ """...
"""
def __init__(self, slottable):
"""Constructor
@@ -112,7 +114,7 @@
Argument
slottable -- A fully constructed SlotTable
"""
- FairPricePolicy.__init__(self, slottable)
+ RatePricePolicy.__init__(self, slottable)
random.seed(get_config().config.getint("pricing", "seed"))
self.min_multiplier = get_config().config.getfloat("pricing", "min-multiplier")
self.max_multiplier = get_config().config.getfloat("pricing", "max-multiplier")
@@ -128,12 +130,11 @@
lease -- Lease that is being scheduled.
preempted_leases -- Leases that would have to be preempted to support this lease.
"""
- mult = random.uniform(self.min_multiplier, self.max_multiplier)
- fair_price = self.get_fair_price(lease)
- return mult * fair_price
+ rate = random.uniform(self.min_multiplier, self.max_multiplier)
+ return self.get_price(lease, rate)
-class MaxMultipleOfFairPricePolicy(FairPricePolicy):
- """Base class for policies that rely on the notion of a fair rate for computation
+class MaximumPricePolicy(RatePricePolicy):
+ """...
"""
def __init__(self, slottable):
"""Constructor
@@ -141,7 +142,7 @@
Argument
slottable -- A fully constructed SlotTable
"""
- FairPricePolicy.__init__(self, slottable)
+ RatePricePolicy.__init__(self, slottable)
def price_lease(self, lease, preempted_leases):
"""Computes the price of a lease
@@ -154,21 +155,20 @@
lease -- Lease that is being scheduled.
preempted_leases -- Leases that would have to be preempted to support this lease.
"""
- mult = float(lease.extras["simul_pricemarkup"])
- fair_price = self.get_fair_price(lease)
- return mult * fair_price
+ rate = float(lease.extras["simul_userrate"])
+ return self.get_base_price(lease, rate)
class UserInfo(object):
def __init__(self):
- self.min_markup_accept = None
- self.max_markup_accept = None
- self.min_markup_reject = None
- self.max_markup_reject = None
- self.markup_estimate = None
+ self.min_rate_accept = None
+ self.max_rate_accept = None
+ self.min_rate_reject = None
+ self.max_rate_reject = None
+ self.rate_estimate = None
self.found = False
-class AdaptiveFairPricePolicy(FairPricePolicy):
- """Base class for policies that rely on the notion of a fair rate for computation
+class AdaptiveRatePricePolicy(RatePricePolicy):
+ """...
"""
def __init__(self, slottable):
"""Constructor
@@ -176,8 +176,7 @@
Argument
slottable -- A fully constructed SlotTable
"""
- FairPricePolicy.__init__(self, slottable)
- self.multiplier = 1.0
+ RatePricePolicy.__init__(self, slottable)
self.users = {}
def price_lease(self, lease, preempted_leases):
@@ -191,8 +190,7 @@
lease -- Lease that is being scheduled.
preempted_leases -- Leases that would have to be preempted to support this lease.
"""
- fair_price = self.get_fair_price(lease)
- return self.multiplier * fair_price
+ return self.get_price(lease)
def feedback(self, lease):
"""Called after a lease has been accepted or rejected, to provide
@@ -203,47 +201,43 @@
"""
if lease.price == None:
return
- fair_price = lease.extras["fair_price"]
- price = lease.price
- if price == -1:
- price = lease.extras["rejected_price"]
- lease_multiplier = price / fair_price
+ rate = lease.extras["rate"]
if not self.users.has_key(lease.user_id):
self.users[lease.user_id] = UserInfo()
if lease.get_state() == Lease.STATE_REJECTED_BY_USER:
- if self.users[lease.user_id].min_markup_reject == None:
- self.users[lease.user_id].min_markup_reject = lease_multiplier
- self.users[lease.user_id].max_markup_reject = lease_multiplier
+ if self.users[lease.user_id].min_rate_reject == None:
+ self.users[lease.user_id].min_rate_reject = lease_multiplier
+ self.users[lease.user_id].max_rate_reject = lease_multiplier
else:
- self.users[lease.user_id].min_markup_reject = min(lease_multiplier, self.users[lease.user_id].min_markup_reject)
- self.users[lease.user_id].max_markup_reject = max(lease_multiplier, self.users[lease.user_id].max_markup_reject)
+ self.users[lease.user_id].min_rate_reject = min(lease_multiplier, self.users[lease.user_id].min_rate_reject)
+ self.users[lease.user_id].max_rate_reject = max(lease_multiplier, self.users[lease.user_id].max_rate_reject)
else:
- if self.users[lease.user_id].min_markup_accept == None:
- self.users[lease.user_id].min_markup_accept = lease_multiplier
- self.users[lease.user_id].max_markup_accept = lease_multiplier
+ if self.users[lease.user_id].min_rate_accept == None:
+ self.users[lease.user_id].min_rate_accept = lease_multiplier
+ self.users[lease.user_id].max_rate_accept = lease_multiplier
else:
- if self.users[lease.user_id].min_markup_reject != None:
+ if self.users[lease.user_id].min_rate_reject != None:
self.users[lease.user_id].found = True
else:
- self.users[lease.user_id].min_markup_accept = min(lease_multiplier, self.users[lease.user_id].min_markup_accept)
- self.users[lease.user_id].max_markup_accept = max(lease_multiplier, self.users[lease.user_id].max_markup_accept)
+ self.users[lease.user_id].min_rate_accept = min(lease_multiplier, self.users[lease.user_id].min_rate_accept)
+ self.users[lease.user_id].max_rate_accept = max(lease_multiplier, self.users[lease.user_id].max_rate_accept)
for user in self.users:
if not self.users[user].found:
- if self.users[user].min_markup_reject == None:
+ if self.users[user].min_rate_reject == None:
# All accepts
- estimate = self.users[user].max_markup_accept * 1.5
- elif self.users[user].min_markup_accept == None:
+ estimate = self.users[user].max_rate_accept * 1.5
+ elif self.users[user].min_rate_accept == None:
# All rejects
- estimate = self.users[user].min_markup_reject * 0.5
+ estimate = self.users[user].min_rate_reject * 0.5
else:
- estimate = (self.users[user].max_markup_accept + self.users[user].min_markup_reject) / 2
+ estimate = (self.users[user].max_rate_accept + self.users[user].min_rate_reject) / 2
- self.users[user].markup_estimate = estimate
+ self.users[user].rate_estimate = estimate
- estimates = sorted([u.markup_estimate for u in self.users.values()])
+ estimates = sorted([u.rate_estimate for u in self.users.values()])
self.multiplier = percentile(estimates, 0.5)
\ No newline at end of file
Modified: branches/1.1/tests/base_config_simulator.conf
===================================================================
--- branches/1.1/tests/base_config_simulator.conf 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/base_config_simulator.conf 2010-01-13 00:32:28 UTC (rev 756)
@@ -46,4 +46,4 @@
[accounting]
datafile: /var/tmp/haizea/results.dat
-probes: ar best-effort immediate cpu-utilization
\ No newline at end of file
+probes: ar best-effort immediate cpu-utilization deadline price
\ No newline at end of file
Modified: branches/1.1/tests/price1.lwf
===================================================================
--- branches/1.1/tests/price1.lwf 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/price1.lwf 2010-01-13 00:32:28 UTC (rev 756)
@@ -31,7 +31,7 @@
<none/>
</software>
<extra>
- <attr name="simul_pricemarkup" value="1.0"/>
+ <attr name="simul_userrate" value="1.0"/>
</extra>
</lease>
</lease-request>
Modified: branches/1.1/tests/price2.lwf
===================================================================
--- branches/1.1/tests/price2.lwf 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/price2.lwf 2010-01-13 00:32:28 UTC (rev 756)
@@ -31,7 +31,7 @@
<none/>
</software>
<extra>
- <attr name="simul_pricemarkup" value="0.5"/>
+ <attr name="simul_userrate" value="0.5"/>
</extra>
</lease>
</lease-request>
Modified: branches/1.1/tests/pricedeadline.lwf
===================================================================
--- branches/1.1/tests/pricedeadline.lwf 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/pricedeadline.lwf 2010-01-13 00:32:28 UTC (rev 756)
@@ -32,7 +32,7 @@
<disk-image id="foobar1.img" size="1024"/>
</software>
<extra>
- <attr name="simul_pricemarkup" value="10.0"/>
+ <attr name="simul_userrate" value="10.0"/>
</extra>
</lease>
</lease-request>
@@ -53,7 +53,7 @@
<disk-image id="foobar1.img" size="1024"/>
</software>
<extra>
- <attr name="simul_pricemarkup" value="10.0"/>
+ <attr name="simul_userrate" value="10.0"/>
</extra>
</lease>
</lease-request>
Modified: branches/1.1/tests/test_simul_pricing.py
===================================================================
--- branches/1.1/tests/test_simul_pricing.py 2010-01-12 23:46:21 UTC (rev 755)
+++ branches/1.1/tests/test_simul_pricing.py 2010-01-13 00:32:28 UTC (rev 756)
@@ -13,21 +13,21 @@
self._verify_done([1])
def test_pricing2(self):
- self.config.set("scheduling", "policy-pricing", "always-fair")
- self.config.set("pricing", "fair-rate", "0.10")
+ self.config.set("scheduling", "policy-pricing", "constant")
+ self.config.set("pricing", "rate", "0.10")
self._tracefile_test("price1.lwf")
self._verify_done([1])
def test_pricing3(self):
- self.config.set("scheduling", "policy-pricing", "always-fair")
- self.config.set("pricing", "fair-rate", "0.10")
+ self.config.set("scheduling", "policy-pricing", "constant")
+ self.config.set("pricing", "rate", "1.00")
self._tracefile_test("price2.lwf")
self._verify_rejected_by_user([1])
def test_pricing_surcharge(self):
self.config.set("scheduling", "policy-preemption", "deadline")
self.config.set("scheduling", "suspension", "all")
- self.config.set("scheduling", "policy-pricing", "always-fair")
- self.config.set("pricing", "fair-rate", "0.10")
+ self.config.set("scheduling", "policy-pricing", "constant")
+ self.config.set("pricing", "rate", "0.10")
self._tracefile_test("pricedeadline.lwf")
self._verify_done([1])
\ No newline at end of file
More information about the Haizea-commit
mailing list