Author: gsim
Date: Wed Mar  2 13:19:04 2011
New Revision: 1076207

URL: http://svn.apache.org/viewvc?rev=1076207&view=rev
Log:
QPID-529: Added aliases for arguments that are more uniform with others in c++ 
broker

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.h
    qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/priority.py

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.cpp?rev=1076207&r1=1076206&r2=1076207&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.cpp Wed Mar  2 13:19:04 2011
@@ -24,6 +24,7 @@
 #include "qpid/log/Statement.h"
 #include <boost/format.hpp>
 #include <boost/lexical_cast.hpp>
+#include <boost/assign/list_of.hpp>
 
 namespace qpid {
 namespace broker {
@@ -104,51 +105,80 @@ bool Fairshare::setState(Messages& m, ui
     return fairshare && fairshare->setState(priority, count);
 }
 
-int getIntegerSetting(const qpid::framing::FieldTable& settings, const 
std::string& key)
+int getIntegerSetting(const qpid::framing::FieldTable& settings, const 
std::vector<std::string>& keys)
 {
-    qpid::framing::FieldTable::ValuePtr v = settings.get(key);
+    qpid::framing::FieldTable::ValuePtr v;
+    std::vector<std::string>::const_iterator i = keys.begin(); 
+    while (!v && i != keys.end()) {
+        v = settings.get(*i++);
+    }
+
     if (!v) {
         return 0;
     } else if (v->convertsTo<int>()) {
         return v->get<int>();
     } else if (v->convertsTo<std::string>()){
         std::string s = v->get<std::string>();
-        try { 
-            return boost::lexical_cast<int>(s); 
+        try {
+            return boost::lexical_cast<int>(s);
         } catch(const boost::bad_lexical_cast&) {
-            QPID_LOG(warning, "Ignoring invalid integer value for " << key << 
": " << s);
+            QPID_LOG(warning, "Ignoring invalid integer value for " << *i << 
": " << s);
             return 0;
         }
     } else {
-        QPID_LOG(warning, "Ignoring invalid integer value for " << key << ": " 
<< *v);
+        QPID_LOG(warning, "Ignoring invalid integer value for " << *i << ": " 
<< *v);
         return 0;
     }
 }
 
-int getSetting(const qpid::framing::FieldTable& settings, const std::string& 
key, int minvalue, int maxvalue)
+int getIntegerSettingForKey(const qpid::framing::FieldTable& settings, const 
std::string& key)
+{
+    return getIntegerSetting(settings, 
boost::assign::list_of<std::string>(key));
+}
+
+int getSetting(const qpid::framing::FieldTable& settings, const 
std::vector<std::string>& keys, int minvalue, int maxvalue)
 {
-    return std::max(minvalue,std::min(getIntegerSetting(settings, key), 
maxvalue));
+    return std::max(minvalue,std::min(getIntegerSetting(settings, keys), 
maxvalue));
+}
+
+std::auto_ptr<Fairshare> getFairshareForKey(const qpid::framing::FieldTable& 
settings, uint levels, const std::string& key)
+{
+    uint defaultLimit = getIntegerSettingForKey(settings, key);
+    std::auto_ptr<Fairshare> fairshare(new Fairshare(levels, defaultLimit));
+    for (uint i = 0; i < levels; i++) {
+        std::string levelKey = (boost::format("%1%-%2%") % key % i).str();
+        if(settings.isSet(levelKey)) {
+            fairshare->setLimit(i, getIntegerSettingForKey(settings, 
levelKey));
+        }
+    }
+    if (!fairshare->isNull()) {
+        return fairshare;
+    } else {
+        return std::auto_ptr<Fairshare>();
+    }
+}
+
+std::auto_ptr<Fairshare> getFairshare(const qpid::framing::FieldTable& 
settings,
+                                      uint levels,
+                                      const std::vector<std::string>& keys)
+{
+    std::auto_ptr<Fairshare> fairshare;
+    for (std::vector<std::string>::const_iterator i = keys.begin(); i != 
keys.end() && !fairshare.get(); ++i) {
+        fairshare = getFairshareForKey(settings, levels, *i);
+    }
+    return fairshare;
 }
 
 std::auto_ptr<Messages> Fairshare::create(const qpid::framing::FieldTable& 
settings)
 {
+    using boost::assign::list_of;
     std::auto_ptr<Messages> result;
-    size_t levels = getSetting(settings, "x-qpid-priorities", 1, 100);
+    size_t levels = getSetting(settings, 
list_of<std::string>("qpid.priorities")("x-qpid-priorities"), 1, 100);
     if (levels) {
-        uint defaultLimit = getIntegerSetting(settings, "x-qpid-fairshare");
-        std::auto_ptr<Fairshare> fairshare(new Fairshare(levels, 
defaultLimit));
-        for (uint i = 0; i < levels; i++) {
-            std::string key = (boost::format("x-qpid-fairshare-%1%") % 
i).str();
-            if(settings.isSet(key)) {
-                fairshare->setLimit(i, getIntegerSetting(settings, key));
-            }
-        }
-        
-        if (fairshare->isNull()) {
-            result = std::auto_ptr<Messages>(new PriorityQueue(levels));
-        } else {
-            result = fairshare;
-        }
+        std::auto_ptr<Fairshare> fairshare =
+            getFairshare(settings, levels, 
list_of<std::string>("qpid.fairshare")("x-qpid-fairshare"));
+        if (fairshare.get()) result = fairshare;
+        else result = std::auto_ptr<Messages>(new PriorityQueue(levels));
     }
     return result;
 }

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.h?rev=1076207&r1=1076206&r2=1076207&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Fairshare.h Wed Mar  2 13:19:04 2011
@@ -41,18 +41,18 @@ class Fairshare : public PriorityQueue
     bool getState(uint& priority, uint& count) const;
     bool setState(uint priority, uint count);
     void setLimit(size_t level, uint limit);
+    bool isNull();
     static std::auto_ptr<Messages> create(const qpid::framing::FieldTable& 
settings);
     static bool getState(const Messages&, uint& priority, uint& count);
     static bool setState(Messages&, uint priority, uint count);
   private:
     std::vector<uint> limits;
-    
+
     uint priority;
     uint count;
-    
+
     uint currentLevel();
     uint nextLevel();
-    bool isNull();
     bool limitReached();
     bool findFrontLevel(uint& p, PriorityLevels&);
 };

Modified: qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/priority.py
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/priority.py?rev=1076207&r1=1076206&r2=1076207&view=diff
==============================================================================
--- qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/priority.py (original)
+++ qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/priority.py Wed Mar  2 
13:19:04 2011
@@ -33,13 +33,13 @@ class PriorityTests (Base):
     def setup_session(self):
         return self.conn.session()
 
-    def prioritised_delivery(self, priorities, levels=10):
+    def prioritised_delivery(self, priorities, levels=10, 
key="x-qpid-priorities"):
         """
         Test that message on a queue are delivered in priority order.
         """
         msgs = [Message(content=str(uuid4()), priority = p) for p in 
priorities]
 
-        snd = self.ssn.sender("priority-queue; {create: sender, delete: 
receiver, node: {x-declare:{arguments:{x-qpid-priorities:%s}}}}" % levels,
+        snd = self.ssn.sender("priority-queue; {create: sender, delete: 
receiver, node: {x-declare:{arguments:{'%s':%s}}}}" % (key, levels),
                               durable=self.durable())
         for m in msgs: snd.send(m)
 
@@ -50,16 +50,16 @@ class PriorityTests (Base):
             assert msg.content == expected.content
             self.ssn.acknowledge(msg)
 
-    def fairshare_delivery(self, priorities, default_limit=5, limits=None, 
levels=10):
+    def fairshare_delivery(self, priorities, default_limit=5, limits=None, 
levels=10, level_key="x-qpid-priorities", fairshare_key="x-qpid-fairshare"):
         msgs = [Message(content=str(uuid4()), priority = p) for p in 
priorities]
 
-        limit_policy = "x-qpid-fairshare:%s" % default_limit
+        limit_policy = "'%s':%s" % (fairshare_key, default_limit)
         if limits:
             for k, v in limits.items():
-                limit_policy += ", x-qpid-fairshare-%s:%s" % (k, v)
+                limit_policy += ", '%s-%s':%s" % (fairshare_key, k, v)
 
-        snd = self.ssn.sender("priority-queue; {create: sender, delete: 
receiver, node: {x-declare:{arguments:{x-qpid-priorities:%s, %s}}}}"
-                              % (levels, limit_policy),
+        snd = self.ssn.sender("priority-queue; {create: sender, delete: 
receiver, node: {x-declare:{arguments:{'%s':%s, %s}}}}"
+                              % (level_key, levels, limit_policy),
                               durable=self.durable())
         for m in msgs: snd.send(m)
 
@@ -79,12 +79,18 @@ class PriorityTests (Base):
     def test_prioritised_delivery_1(self):
         self.prioritised_delivery(priorities = 
[8,9,5,1,2,2,3,4,15,7,8,10,10,2], levels = 10)
 
+    def test_prioritised_delivery_with_alias(self):
+        self.prioritised_delivery(priorities = 
[8,9,5,1,2,2,3,4,15,7,8,10,10,2], levels = 10, key="qpid.priorities")
+
     def test_prioritised_delivery_2(self):
         self.prioritised_delivery(priorities = 
[8,9,5,1,2,2,3,4,15,7,8,10,10,2], levels = 5)
 
     def test_fairshare_1(self):
         self.fairshare_delivery(priorities = 
[4,5,3,6,10,10,2,10,2,10,10,1,10,10,10,3,3,3,10,10,3,10,3,10,10,10,10,10,10,2,3])
 
+    def test_fairshare_with_alias(self):
+        self.fairshare_delivery(priorities = 
[4,5,3,6,10,10,2,10,2,10,10,1,10,10,10,3,3,3,10,10,2,3], 
level_key="qpid.priorities", fairshare_key="qpid.fairshare")
+
     def test_fairshare_2(self):
         self.fairshare_delivery(priorities = [10 for i in range(30)])
 



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:[email protected]

Reply via email to