diff options
Diffstat (limited to 'cpp/src/qpid/broker')
| -rw-r--r-- | cpp/src/qpid/broker/Bridge.cpp | 13 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/DirectExchange.cpp | 13 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/Exchange.cpp | 18 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/Exchange.h | 26 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/FanOutExchange.cpp | 13 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/HeadersExchange.cpp | 3 | ||||
| -rw-r--r-- | cpp/src/qpid/broker/TopicExchange.cpp | 14 |
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 { |
