summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/broker
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/src/qpid/broker')
-rw-r--r--cpp/src/qpid/broker/Bridge.cpp13
-rw-r--r--cpp/src/qpid/broker/DirectExchange.cpp13
-rw-r--r--cpp/src/qpid/broker/Exchange.cpp18
-rw-r--r--cpp/src/qpid/broker/Exchange.h26
-rw-r--r--cpp/src/qpid/broker/FanOutExchange.cpp13
-rw-r--r--cpp/src/qpid/broker/HeadersExchange.cpp3
-rw-r--r--cpp/src/qpid/broker/TopicExchange.cpp14
7 files changed, 39 insertions, 61 deletions
diff --git a/cpp/src/qpid/broker/Bridge.cpp b/cpp/src/qpid/broker/Bridge.cpp
index 9381f00268..5911d916ad 100644
--- a/cpp/src/qpid/broker/Bridge.cpp
+++ b/cpp/src/qpid/broker/Bridge.cpp
@@ -19,6 +19,7 @@
*
*/
#include "qpid/broker/Bridge.h"
+#include "qpid/broker/FedOps.h"
#include "qpid/broker/ConnectionState.h"
#include "qpid/broker/Connection.h"
#include "qpid/broker/Link.h"
@@ -37,18 +38,6 @@ using qpid::management::ManagementAgent;
using std::string;
namespace _qmf = qmf::org::apache::qpid::broker;
-namespace
-{
-const std::string qpidFedOp("qpid.fed.op");
-const std::string qpidFedTags("qpid.fed.tags");
-const std::string qpidFedOrigin("qpid.fed.origin");
-
-const std::string fedOpBind("B");
-const std::string fedOpUnbind("U");
-const std::string fedOpReorigin("R");
-const std::string fedOpHello("H");
-}
-
namespace qpid {
namespace broker {
diff --git a/cpp/src/qpid/broker/DirectExchange.cpp b/cpp/src/qpid/broker/DirectExchange.cpp
index 0db941f93b..fc52ab3711 100644
--- a/cpp/src/qpid/broker/DirectExchange.cpp
+++ b/cpp/src/qpid/broker/DirectExchange.cpp
@@ -20,6 +20,7 @@
*/
#include "qpid/log/Statement.h"
+#include "qpid/broker/FedOps.h"
#include "qpid/broker/Queue.h"
#include "qpid/broker/DirectExchange.h"
#include <iostream>
@@ -32,15 +33,7 @@ namespace _qmf = qmf::org::apache::qpid::broker;
namespace
{
-const std::string qpidFedOp("qpid.fed.op");
-const std::string qpidFedTags("qpid.fed.tags");
-const std::string qpidFedOrigin("qpid.fed.origin");
-const std::string qpidExclusiveBinding("qpid.exclusive-binding");
-
-const std::string fedOpBind("B");
-const std::string fedOpUnbind("U");
-const std::string fedOpReorigin("R");
-const std::string fedOpHello("H");
+ const std::string qpidExclusiveBinding("qpid.exclusive-binding");
}
DirectExchange::DirectExchange(const string& _name, Manageable* _parent, Broker* b) : Exchange(_name, _parent, b)
@@ -67,7 +60,7 @@ bool DirectExchange::bind(Queue::shared_ptr queue, const string& routingKey, con
fedOp = args->getAsString(qpidFedOp);
fedTags = args->getAsString(qpidFedTags);
fedOrigin = args->getAsString(qpidFedOrigin);
- exclusiveBinding = args->get(qpidExclusiveBinding);
+ exclusiveBinding = args->get(qpidExclusiveBinding); // only direct exchanges take exclusive bindings
}
bool propagate = false;
diff --git a/cpp/src/qpid/broker/Exchange.cpp b/cpp/src/qpid/broker/Exchange.cpp
index aaf0805543..b499171418 100644
--- a/cpp/src/qpid/broker/Exchange.cpp
+++ b/cpp/src/qpid/broker/Exchange.cpp
@@ -21,6 +21,7 @@
#include "qpid/broker/Exchange.h"
#include "qpid/broker/ExchangeRegistry.h"
+#include "qpid/broker/FedOps.h"
#include "qpid/broker/Broker.h"
#include "qpid/broker/Cluster.h"
#include "qpid/management/ManagementAgent.h"
@@ -43,19 +44,10 @@ namespace _qmf = qmf::org::apache::qpid::broker;
namespace
{
-const std::string qpidMsgSequence("qpid.msg_sequence");
-const std::string qpidSequenceCounter("qpid.sequence_counter");
-const std::string qpidIVE("qpid.ive");
-const std::string qpidFedOp("qpid.fed.op");
-const std::string qpidFedTags("qpid.fed.tags");
-const std::string qpidFedOrigin("qpid.fed.origin");
-
-const std::string fedOpBind("B");
-const std::string fedOpUnbind("U");
-const std::string fedOpReorigin("R");
-const std::string fedOpHello("H");
-
-const std::string QPID_MANAGEMENT("qpid.management");
+ const std::string qpidMsgSequence("qpid.msg_sequence");
+ const std::string qpidSequenceCounter("qpid.sequence_counter");
+ const std::string qpidIVE("qpid.ive");
+ const std::string QPID_MANAGEMENT("qpid.management");
}
diff --git a/cpp/src/qpid/broker/Exchange.h b/cpp/src/qpid/broker/Exchange.h
index 4b6b90026b..26d7f41015 100644
--- a/cpp/src/qpid/broker/Exchange.h
+++ b/cpp/src/qpid/broker/Exchange.h
@@ -101,6 +101,13 @@ protected:
public:
FedBinding() : localBindings(0) {}
bool hasLocal() const { return localBindings != 0; }
+
+ /**
+ * Returns 'true' if and only if this is the first local
+ * binding.
+ *
+ * The first local binding may need to be propagated.
+ */
bool addOrigin(const std::string& origin) {
if (origin.empty()) {
localBindings++;
@@ -113,6 +120,14 @@ protected:
originSet.erase(origin);
return true;
}
+
+ /**
+ * Returns 'true' if and only if the last local binding is
+ * deleted.
+ *
+ * When the last local binding is deleted, it may need to
+ * be propagated.
+ */
bool delOrigin() {
if (localBindings > 0)
localBindings--;
@@ -145,6 +160,17 @@ public:
bool inUseAsAlternate() { return alternateUsers > 0; }
virtual std::string getType() const = 0;
+
+ /**
+ * bind() is used for two distinct purposes:
+ *
+ * 1. To create a binding, in the conventional sense
+ *
+ * 2. As a vehicle for any FedOp, currently including federated
+ * binding, federated unbinding, federated reorigin.
+ *
+ */
+
virtual bool bind(boost::shared_ptr<Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args) = 0;
virtual bool unbind(boost::shared_ptr<Queue> queue, const std::string& routingKey, const qpid::framing::FieldTable* args) = 0;
virtual bool isBound(boost::shared_ptr<Queue> queue, const std::string* const routingKey, const qpid::framing::FieldTable* const args) = 0;
diff --git a/cpp/src/qpid/broker/FanOutExchange.cpp b/cpp/src/qpid/broker/FanOutExchange.cpp
index d8e55decbd..a33eba1d09 100644
--- a/cpp/src/qpid/broker/FanOutExchange.cpp
+++ b/cpp/src/qpid/broker/FanOutExchange.cpp
@@ -19,6 +19,7 @@
*
*/
#include "qpid/broker/FanOutExchange.h"
+#include "qpid/broker/FedOps.h"
#include <algorithm>
using namespace qpid::broker;
@@ -26,18 +27,6 @@ using namespace qpid::framing;
using namespace qpid::sys;
namespace _qmf = qmf::org::apache::qpid::broker;
-namespace
-{
-const std::string qpidFedOp("qpid.fed.op");
-const std::string qpidFedTags("qpid.fed.tags");
-const std::string qpidFedOrigin("qpid.fed.origin");
-
-const std::string fedOpBind("B");
-const std::string fedOpUnbind("U");
-const std::string fedOpReorigin("R");
-const std::string fedOpHello("H");
-}
-
FanOutExchange::FanOutExchange(const std::string& _name, Manageable* _parent, Broker* b) :
Exchange(_name, _parent, b)
{
diff --git a/cpp/src/qpid/broker/HeadersExchange.cpp b/cpp/src/qpid/broker/HeadersExchange.cpp
index 6a723b373e..584cd4c481 100644
--- a/cpp/src/qpid/broker/HeadersExchange.cpp
+++ b/cpp/src/qpid/broker/HeadersExchange.cpp
@@ -94,10 +94,11 @@ bool HeadersExchange::bind(Queue::shared_ptr queue, const string& bindingKey, co
fedTags = args->getAsString(qpidFedTags);
fedOrigin = args->getAsString(qpidFedOrigin);
}
+
bool propagate = false;
// The federation args get propagated directly, so we need to identify
- // the non feteration args in case a federated propagate is needed
+ // the non federation args in case a federated propagate is needed
FieldTable extra_args;
getNonFedArgs(args, extra_args);
diff --git a/cpp/src/qpid/broker/TopicExchange.cpp b/cpp/src/qpid/broker/TopicExchange.cpp
index 7372e58c4a..3f70f17ea4 100644
--- a/cpp/src/qpid/broker/TopicExchange.cpp
+++ b/cpp/src/qpid/broker/TopicExchange.cpp
@@ -19,6 +19,7 @@
*
*/
#include "qpid/broker/TopicExchange.h"
+#include "qpid/broker/FedOps.h"
#include "qpid/log/Statement.h"
#include <algorithm>
@@ -37,19 +38,6 @@ namespace _qmf = qmf::org::apache::qpid::broker;
// - excessive string copying: should be 0 copy, match from original buffer.
// - match/lookup: use descision tree or other more efficient structure.
-namespace
-{
-const std::string qpidFedOp("qpid.fed.op");
-const std::string qpidFedTags("qpid.fed.tags");
-const std::string qpidFedOrigin("qpid.fed.origin");
-
-const std::string fedOpBind("B");
-const std::string fedOpUnbind("U");
-const std::string fedOpReorigin("R");
-const std::string fedOpHello("H");
-}
-
-
namespace {
// Iterate over a string of '.'-separated tokens.
struct TokenIterator {