From 7027a0267fc4666757a73abfd18ee82344923804 Mon Sep 17 00:00:00 2001 From: Gordon Sim Date: Wed, 2 Mar 2011 13:19:04 +0000 Subject: QPID-529: Added aliases for arguments that are more uniform with others in c++ broker git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1076207 13f79535-47bb-0310-9956-ffa450edef68 --- cpp/src/qpid/broker/Fairshare.cpp | 76 +++++++++++++++++++++++++++------------ cpp/src/qpid/broker/Fairshare.h | 6 ++-- 2 files changed, 56 insertions(+), 26 deletions(-) (limited to 'cpp') diff --git a/cpp/src/qpid/broker/Fairshare.cpp b/cpp/src/qpid/broker/Fairshare.cpp index e6bbf86691..17270ffd8d 100644 --- a/cpp/src/qpid/broker/Fairshare.cpp +++ b/cpp/src/qpid/broker/Fairshare.cpp @@ -24,6 +24,7 @@ #include "qpid/log/Statement.h" #include #include +#include namespace qpid { namespace broker { @@ -104,51 +105,80 @@ bool Fairshare::setState(Messages& m, uint priority, uint count) 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& keys) { - qpid::framing::FieldTable::ValuePtr v = settings.get(key); + qpid::framing::FieldTable::ValuePtr v; + std::vector::const_iterator i = keys.begin(); + while (!v && i != keys.end()) { + v = settings.get(*i++); + } + if (!v) { return 0; } else if (v->convertsTo()) { return v->get(); } else if (v->convertsTo()){ std::string s = v->get(); - try { - return boost::lexical_cast(s); + try { + return boost::lexical_cast(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(key)); +} + +int getSetting(const qpid::framing::FieldTable& settings, const std::vector& keys, int minvalue, int maxvalue) +{ + return std::max(minvalue,std::min(getIntegerSetting(settings, keys), maxvalue)); +} + +std::auto_ptr getFairshareForKey(const qpid::framing::FieldTable& settings, uint levels, const std::string& key) +{ + uint defaultLimit = getIntegerSettingForKey(settings, key); + std::auto_ptr 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(); + } +} + +std::auto_ptr getFairshare(const qpid::framing::FieldTable& settings, + uint levels, + const std::vector& keys) { - return std::max(minvalue,std::min(getIntegerSetting(settings, key), maxvalue)); + std::auto_ptr fairshare; + for (std::vector::const_iterator i = keys.begin(); i != keys.end() && !fairshare.get(); ++i) { + fairshare = getFairshareForKey(settings, levels, *i); + } + return fairshare; } std::auto_ptr Fairshare::create(const qpid::framing::FieldTable& settings) { + using boost::assign::list_of; std::auto_ptr result; - size_t levels = getSetting(settings, "x-qpid-priorities", 1, 100); + size_t levels = getSetting(settings, list_of("qpid.priorities")("x-qpid-priorities"), 1, 100); if (levels) { - uint defaultLimit = getIntegerSetting(settings, "x-qpid-fairshare"); - std::auto_ptr 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(new PriorityQueue(levels)); - } else { - result = fairshare; - } + std::auto_ptr fairshare = + getFairshare(settings, levels, list_of("qpid.fairshare")("x-qpid-fairshare")); + if (fairshare.get()) result = fairshare; + else result = std::auto_ptr(new PriorityQueue(levels)); } return result; } diff --git a/cpp/src/qpid/broker/Fairshare.h b/cpp/src/qpid/broker/Fairshare.h index 6c4b87f857..1b25721e0c 100644 --- a/cpp/src/qpid/broker/Fairshare.h +++ b/cpp/src/qpid/broker/Fairshare.h @@ -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 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 limits; - + uint priority; uint count; - + uint currentLevel(); uint nextLevel(); - bool isNull(); bool limitReached(); bool findFrontLevel(uint& p, PriorityLevels&); }; -- cgit v1.2.1