Author: gsim
Date: Mon Apr 28 21:24:31 2014
New Revision: 1590805

URL: http://svn.apache.org/r1590805
Log:
QPID-5729: handle concurrent triggering of topic policy

Modified:
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.cpp
    qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.h

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp?rev=1590805&r1=1590804&r2=1590805&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/NodePolicy.cpp Mon Apr 28 21:24:31 
2014
@@ -195,7 +195,7 @@ std::pair<boost::shared_ptr<Queue>, boos
     qpid::amqp_0_10::translate(exchangeSettings, args);
     boost::shared_ptr<Exchange> exchange = 
connection.getBroker().createExchange(name, exchangeType, isDurable(), 
autodelete, alternateExchange,
                                                                                
  args, connection.getUserId(), connection.getId()).first;
-    result.second = connection.getTopics().createTopic(connection.getBroker(), 
name, exchange, topicSettings);
+    result.second = connection.getTopics().declare(connection.getBroker(), 
name, exchange, topicSettings);
     return result;
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.cpp?rev=1590805&r1=1590804&r2=1590805&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.cpp Mon Apr 28 21:24:31 2014
@@ -115,6 +115,20 @@ boost::shared_ptr<Topic> TopicRegistry::
     return topic;
 }
 
+boost::shared_ptr<Topic> TopicRegistry::declare(Broker& broker, const 
std::string& name, boost::shared_ptr<Exchange> exchange, const 
qpid::types::Variant::Map& properties)
+{
+    qpid::sys::Mutex::ScopedLock l(lock);
+    Topics::const_iterator i = topics.find(name);
+    if (i == topics.end()) {
+        boost::shared_ptr<Topic> topic(new Topic(broker, name, exchange, 
properties));
+        topics.insert(Topics::value_type(name, topic));
+        topic->getExchange()->setDeletionListener(name, 
boost::bind(&TopicRegistry::remove, this, name));
+        return topic;
+    } else {
+        return i->second;
+    }
+}
+
 bool TopicRegistry::createObject(Broker& broker, const std::string& type, 
const std::string& name, const qpid::types::Variant::Map& props,
                                  const std::string& /*userId*/, const 
std::string& /*connectionId*/)
 {

Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.h?rev=1590805&r1=1590804&r2=1590805&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/Topic.h Mon Apr 28 21:24:31 2014
@@ -78,6 +78,7 @@ class TopicRegistry : public ObjectFacto
     boost::shared_ptr<Topic> remove(const std::string& name);
     boost::shared_ptr<Topic> get(const std::string& name);
     boost::shared_ptr<Topic> createTopic(Broker&, const std::string& name, 
boost::shared_ptr<Exchange> exchange, const qpid::types::Variant::Map& 
properties);
+    boost::shared_ptr<Topic> declare(Broker&, const std::string& name, 
boost::shared_ptr<Exchange> exchange, const qpid::types::Variant::Map& 
properties);
   private:
     typedef std::map<std::string, boost::shared_ptr<Topic> > Topics;
     qpid::sys::Mutex lock;



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to