summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2014-08-06 17:11:56 +0000
committerGordon Sim <gsim@apache.org>2014-08-06 17:11:56 +0000
commit66f0df692fe7efa0a64393096d3a03bf450e6750 (patch)
treea0b84afaf9f08c2e32e3aa511ec84ba09a470ff1
parentff3b6e45bf6d8f5651691cc824b0df22b6259fe3 (diff)
downloadqpid-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.cpp7
-rw-r--r--qpid/cpp/src/qpid/broker/amqp/Topic.cpp1
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);