diff options
| author | Gordon Sim <gsim@apache.org> | 2013-12-03 17:52:57 +0000 |
|---|---|---|
| committer | Gordon Sim <gsim@apache.org> | 2013-12-03 17:52:57 +0000 |
| commit | 8df81b81d429dd0607b9d14636d84913e04e5a72 (patch) | |
| tree | 015138dd302f534454aab78c9e91994d17290750 /qpid/cpp | |
| parent | bb268e3e0a84a2cd0ec306aaa2d651c34b777d65 (diff) | |
| download | qpid-python-8df81b81d429dd0607b9d14636d84913e04e5a72.tar.gz | |
QPID-5384: special asserting logic for autodelete
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1547496 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp')
| -rw-r--r-- | qpid/cpp/src/qpid/broker/Exchange.cpp | 4 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/Exchange.h | 1 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp | 19 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/amqp/NodeProperties.h | 3 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp | 17 |
5 files changed, 35 insertions, 9 deletions
diff --git a/qpid/cpp/src/qpid/broker/Exchange.cpp b/qpid/cpp/src/qpid/broker/Exchange.cpp index 304ed7cec4..feef911f21 100644 --- a/qpid/cpp/src/qpid/broker/Exchange.cpp +++ b/qpid/cpp/src/qpid/broker/Exchange.cpp @@ -485,6 +485,10 @@ bool Exchange::isDestroyed() const Mutex::ScopedLock l(usersLock); return destroyed; } +bool Exchange::isAutoDelete() const +{ + return autodelete; +} }} diff --git a/qpid/cpp/src/qpid/broker/Exchange.h b/qpid/cpp/src/qpid/broker/Exchange.h index 7d3bbcf88e..a0d0604be8 100644 --- a/qpid/cpp/src/qpid/broker/Exchange.h +++ b/qpid/cpp/src/qpid/broker/Exchange.h @@ -180,6 +180,7 @@ public: const std::string& getName() const { return name; } bool isDurable() { return durable; } + QPID_BROKER_EXTERN bool isAutoDelete() const; QPID_BROKER_EXTERN const qpid::framing::FieldTable& getArgs() const { return args; } QPID_BROKER_EXTERN void setArgs(const framing::FieldTable&); diff --git a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp index 40e970c2f6..586ff6d439 100644 --- a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.cpp @@ -110,6 +110,12 @@ void NodeProperties::read(pn_data_t* data) { DataReader reader(*this); reader.read(data); + +} + +bool NodeProperties::wasSpecified(const std::string& key) +{ + return specified.find(key) != specified.end(); } void NodeProperties::write(pn_data_t* data, boost::shared_ptr<Queue> node) @@ -120,7 +126,7 @@ void NodeProperties::write(pn_data_t* data, boost::shared_ptr<Queue> node) pn_data_put_symbol(data, convert(SUPPORTED_DIST_MODES)); pn_data_put_string(data, convert(MOVE));//TODO: should really add COPY as well, since queues can be browsed pn_bytes_t symbol; - if (autoDelete && node->isAutoDelete() && getLifetimeDescriptorSymbol(node->getSettings().lifetime, symbol)) { + if (wasSpecified(AUTO_DELETE) && node->isAutoDelete() && getLifetimeDescriptorSymbol(node->getSettings().lifetime, symbol)) { pn_data_put_symbol(data, convert(LIFETIME_POLICY)); pn_data_put_described(data); pn_data_enter(data); @@ -128,11 +134,11 @@ void NodeProperties::write(pn_data_t* data, boost::shared_ptr<Queue> node) pn_data_put_list(data); pn_data_exit(data); } - if (durable && node->isDurable()) { + if (wasSpecified(DURABLE) && node->isDurable()) { pn_data_put_symbol(data, convert(DURABLE)); pn_data_put_bool(data, true); } - if (exclusive && node->hasExclusiveOwner()) { + if (wasSpecified(EXCLUSIVE) && node->hasExclusiveOwner()) { pn_data_put_symbol(data, convert(EXCLUSIVE)); pn_data_put_bool(data, true); } @@ -170,7 +176,7 @@ void NodeProperties::write(pn_data_t* data, boost::shared_ptr<Exchange> node) pn_data_enter(data); pn_data_put_symbol(data, convert(SUPPORTED_DIST_MODES)); pn_data_put_string(data, convert(COPY)); - if (durable && node->isDurable()) { + if (wasSpecified(DURABLE) && node->isDurable()) { pn_data_put_symbol(data, convert(DURABLE)); pn_data_put_bool(data, true); } @@ -182,9 +188,9 @@ void NodeProperties::write(pn_data_t* data, boost::shared_ptr<Exchange> node) pn_data_put_symbol(data, convert(ALTERNATE_EXCHANGE)); pn_data_put_string(data, convert(node->getAlternate()->getName())); } - if (autoDelete) { + if (wasSpecified(AUTO_DELETE)) { pn_data_put_symbol(data, convert(AUTO_DELETE)); - pn_data_put_bool(data, autoDelete); + pn_data_put_bool(data, node->isAutoDelete()); } for (qpid::types::Variant::Map::const_iterator i = properties.begin(); i != properties.end(); ++i) { @@ -203,6 +209,7 @@ void NodeProperties::process(const std::string& key, const qpid::types::Variant& { received = true; QPID_LOG(debug, "Processing node property " << key << " = " << value); + specified.insert(key); if (key == SUPPORTED_DIST_MODES) { if (value == MOVE) queue = true; else if (value == COPY) queue = false; diff --git a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h index 4ac3aa8a0f..e1f0d3e792 100644 --- a/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h +++ b/qpid/cpp/src/qpid/broker/amqp/NodeProperties.h @@ -24,6 +24,7 @@ #include "qpid/amqp/MapReader.h" #include "qpid/types/Variant.h" #include "qpid/broker/QueueSettings.h" +#include <set> #include <boost/shared_ptr.hpp> struct pn_data_t; @@ -77,8 +78,10 @@ class NodeProperties : public qpid::amqp::MapReader std::string alternateExchange; qpid::types::Variant::Map properties; QueueSettings::LifetimePolicy lifetime; + std::set<std::string> specified; void process(const std::string&, const qpid::types::Variant&, const qpid::amqp::Descriptor*); + bool wasSpecified(const std::string& key); }; }}} // namespace qpid::broker::amqp diff --git a/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp b/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp index 5595d527f6..3dbacac11f 100644 --- a/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp +++ b/qpid/cpp/src/qpid/messaging/amqp/AddressHelper.cpp @@ -660,6 +660,7 @@ void AddressHelper::checkAssertion(pn_terminus_t* terminus, CheckMode mode) //set. However this can be avoided by not specifying any node //properties when asserting) if (!type.empty() || durableNode || !properties.empty()) { + bool isAutoDeleted = false; qpid::types::Variant::Map requested = properties; if (!type.empty()) requested[SUPPORTED_DIST_MODES] = type == TOPIC ? COPY : MOVE; if (durableNode) requested[DURABLE] = true; @@ -673,13 +674,23 @@ void AddressHelper::checkAssertion(pn_terminus_t* terminus, CheckMode mode) pn_data_next(data); qpid::types::Variant::Map::const_iterator j = requested.find(key); qpid::types::Variant v; - if (j != requested.end() && - ((key == LIFETIME_POLICY && checkLifetimePolicy(j->second.asString(), data)) || - (read(data, v) && v.asString() == j->second.asString()))) { + if (key == LIFETIME_POLICY) { + isAutoDeleted = true; + if (j != requested.end() && checkLifetimePolicy(j->second.asString(), data)) { + requested.erase(j->first); + } + } else if (key == AUTO_DELETE) { + read(data, v); + isAutoDeleted = v.asBool(); + } else if (j != requested.end() && (read(data, v) && v.asString() == j->second.asString())) { requested.erase(j->first); } } pn_data_exit(data); + qpid::types::Variant::Map::iterator i = requested.find(AUTO_DELETE); + if (i != requested.end() && i->second.asBool() == isAutoDeleted) { + requested.erase(i); + } if (!requested.empty()) { std::stringstream missing; missing << "Requested node properties not met: " << requested; |
