diff options
author | Gordon Sim <gsim@apache.org> | 2014-08-06 17:11:56 +0000 |
---|---|---|
committer | Gordon Sim <gsim@apache.org> | 2014-08-06 17:11:56 +0000 |
commit | 66f0df692fe7efa0a64393096d3a03bf450e6750 (patch) | |
tree | a0b84afaf9f08c2e32e3aa511ec84ba09a470ff1 | |
parent | ff3b6e45bf6d8f5651691cc824b0df22b6259fe3 (diff) | |
download | qpid-python-66f0df692fe7efa0a64393096d3a03bf450e6750.tar.gz |
QPID-5948: prevent creation of durable topic backed by non-durable exchange; add exception handling to object recovery.
(Based on patch from Kim van der Riet).
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1616287 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r-- | qpid/cpp/src/qpid/broker/ObjectFactory.cpp | 7 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/broker/amqp/Topic.cpp | 1 |
2 files changed, 7 insertions, 1 deletions
diff --git a/qpid/cpp/src/qpid/broker/ObjectFactory.cpp b/qpid/cpp/src/qpid/broker/ObjectFactory.cpp index 2dd182c428..39edaa9fab 100644 --- a/qpid/cpp/src/qpid/broker/ObjectFactory.cpp +++ b/qpid/cpp/src/qpid/broker/ObjectFactory.cpp @@ -20,6 +20,7 @@ */ #include "ObjectFactory.h" #include "Broker.h" +#include "qpid/log/Statement.h" namespace qpid { namespace broker { @@ -49,7 +50,11 @@ bool ObjectFactoryRegistry::recoverObject(Broker& broker, const std::string& typ { for (Factories::iterator i = factories.begin(); i != factories.end(); ++i) { - if ((*i)->recoverObject(broker, type, name, properties, persistenceId)) return true; + try { + if ((*i)->recoverObject(broker, type, name, properties, persistenceId)) return true; + } catch (const std::exception& e) { + QPID_LOG(warning, "Error while recovering object " << name << " of type " << type << ": " << e.what()); + } } return false; } diff --git a/qpid/cpp/src/qpid/broker/amqp/Topic.cpp b/qpid/cpp/src/qpid/broker/amqp/Topic.cpp index ec0fc617b6..93f4b83f08 100644 --- a/qpid/cpp/src/qpid/broker/amqp/Topic.cpp +++ b/qpid/cpp/src/qpid/broker/amqp/Topic.cpp @@ -63,6 +63,7 @@ Topic::Topic(Broker& broker, const std::string& n, boost::shared_ptr<Exchange> e alternateExchange(getProperty(ALTERNATE_EXCHANGE, properties)) { if (exchange->getName().empty()) throw qpid::Exception("Exchange must be specified."); + if (durable && !exchange->isDurable()) throw qpid::Exception("Durable topic must be backed by durable exchange"); qpid::types::Variant::Map unused; qpid::types::Variant::Map filtered = filter(properties, true); |