diff options
Diffstat (limited to 'qpid/cpp/src')
-rw-r--r-- | qpid/cpp/src/qpid/ha/HaBroker.cpp | 28 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/ha/HaBroker.h | 4 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/ha/HaPlugin.cpp | 2 | ||||
-rw-r--r-- | qpid/cpp/src/qpid/ha/Settings.h | 2 | ||||
-rwxr-xr-x | qpid/cpp/src/tests/ha_test.py | 12 | ||||
-rwxr-xr-x | qpid/cpp/src/tests/ha_tests.py | 38 |
6 files changed, 59 insertions, 27 deletions
diff --git a/qpid/cpp/src/qpid/ha/HaBroker.cpp b/qpid/cpp/src/qpid/ha/HaBroker.cpp index 1358baf0e1..8c16a5ea38 100644 --- a/qpid/cpp/src/qpid/ha/HaBroker.cpp +++ b/qpid/cpp/src/qpid/ha/HaBroker.cpp @@ -79,6 +79,11 @@ HaBroker::HaBroker(broker::Broker& b, const Settings& s) } } +namespace { +const std::string NONE("none"); +bool isNone(const std::string& x) { return x.empty() || x == NONE; } +} + // Called in Plugin::initialize void HaBroker::initialize() { @@ -110,11 +115,10 @@ void HaBroker::initialize() { backup.reset(new Backup(*this, settings)); broker.getKnownBrokers = boost::bind(&HaBroker::getKnownBrokers, this); statusCheck.reset(new StatusCheck(logPrefix, broker.getLinkHearbeatInterval(), brokerInfo)); + if (!isNone(settings.publicUrl)) setPublicUrl(Url(settings.publicUrl)); + if (!isNone(settings.brokerUrl)) setBrokerUrl(Url(settings.brokerUrl)); } - if (!settings.clientUrl.empty()) setClientUrl(Url(settings.clientUrl)); - if (!settings.brokerUrl.empty()) setBrokerUrl(Url(settings.brokerUrl)); - // NOTE: lock is not needed in a constructor, but create one // to pass to functions that have a ScopedLock parameter. @@ -182,7 +186,7 @@ Manageable::status_t HaBroker::ManagementMethod (uint32_t methodId, Args& args, break; } case _qmf::HaBroker::METHOD_SETPUBLICURL: { - setClientUrl(Url(dynamic_cast<_qmf::ArgsHaBrokerSetPublicUrl&>(args).i_url)); + setPublicUrl(Url(dynamic_cast<_qmf::ArgsHaBrokerSetPublicUrl&>(args).i_url)); break; } case _qmf::HaBroker::METHOD_REPLICATE: { @@ -217,19 +221,13 @@ Manageable::status_t HaBroker::ManagementMethod (uint32_t methodId, Args& args, return Manageable::STATUS_OK; } -void HaBroker::setClientUrl(const Url& url) { +void HaBroker::setPublicUrl(const Url& url) { Mutex::ScopedLock l(lock); - if (url.empty()) throw Exception("Invalid empty URL for HA client failover"); - clientUrl = url; - updateClientUrl(l); -} - -void HaBroker::updateClientUrl(Mutex::ScopedLock&) { - Url url = clientUrl.empty() ? brokerUrl : clientUrl; + publicUrl = url; mgmtObject->set_publicUrl(url.str()); knownBrokers.clear(); knownBrokers.push_back(url); - QPID_LOG(debug, logPrefix << "Setting client URL to: " << url); + QPID_LOG(debug, logPrefix << "Setting public URL to: " << url); } void HaBroker::setBrokerUrl(const Url& url) { @@ -238,10 +236,8 @@ void HaBroker::setBrokerUrl(const Url& url) { Mutex::ScopedLock l(lock); brokerUrl = url; mgmtObject->set_brokersUrl(brokerUrl.str()); - QPID_LOG(info, logPrefix << "Broker URL set to: " << url); + QPID_LOG(info, logPrefix << "Brokers URL set to: " << url); if (status == JOINING && statusCheck.get()) statusCheck->setUrl(url); - // Updating broker URL also updates defaulted client URL: - if (clientUrl.empty()) updateClientUrl(l); b = backup; } if (b) b->setBrokerUrl(url); // Oustside lock, avoid deadlock diff --git a/qpid/cpp/src/qpid/ha/HaBroker.h b/qpid/cpp/src/qpid/ha/HaBroker.h index 530211ced4..76dbf57a0c 100644 --- a/qpid/cpp/src/qpid/ha/HaBroker.h +++ b/qpid/cpp/src/qpid/ha/HaBroker.h @@ -100,7 +100,7 @@ class HaBroker : public management::Manageable types::Uuid getSystemId() const { return systemId; } private: - void setClientUrl(const Url&); + void setPublicUrl(const Url&); void setBrokerUrl(const Url&); void updateClientUrl(sys::Mutex::ScopedLock&); @@ -125,7 +125,7 @@ class HaBroker : public management::Manageable boost::shared_ptr<Backup> backup; boost::shared_ptr<Primary> primary; qmf::org::apache::qpid::ha::HaBroker::shared_ptr mgmtObject; - Url clientUrl, brokerUrl; + Url publicUrl, brokerUrl; std::vector<Url> knownBrokers; BrokerStatus status; BrokerInfo brokerInfo; diff --git a/qpid/cpp/src/qpid/ha/HaPlugin.cpp b/qpid/cpp/src/qpid/ha/HaPlugin.cpp index cba9c0bb26..5edb98c135 100644 --- a/qpid/cpp/src/qpid/ha/HaPlugin.cpp +++ b/qpid/cpp/src/qpid/ha/HaPlugin.cpp @@ -37,7 +37,7 @@ struct Options : public qpid::Options { "Enable replication of specific queues without joining a cluster") ("ha-brokers-url", optValue(settings.brokerUrl,"URL"), "URL with address of each broker in the cluster.") - ("ha-public-url", optValue(settings.clientUrl,"URL"), + ("ha-public-url", optValue(settings.publicUrl,"URL"), "URL advertized to clients to connect to the cluster.") ("ha-replicate", optValue(settings.replicateDefault, "LEVEL"), diff --git a/qpid/cpp/src/qpid/ha/Settings.h b/qpid/cpp/src/qpid/ha/Settings.h index d3dcb96dad..53b61415cf 100644 --- a/qpid/cpp/src/qpid/ha/Settings.h +++ b/qpid/cpp/src/qpid/ha/Settings.h @@ -42,7 +42,7 @@ class Settings bool cluster; // True if we are a cluster member. bool queueReplication; // True if enabled. - std::string clientUrl; + std::string publicUrl; std::string brokerUrl; Enum<ReplicateLevel> replicateDefault; std::string username, password, mechanism; diff --git a/qpid/cpp/src/tests/ha_test.py b/qpid/cpp/src/tests/ha_test.py index d7885d9622..4efbfdba3d 100755 --- a/qpid/cpp/src/tests/ha_test.py +++ b/qpid/cpp/src/tests/ha_test.py @@ -100,7 +100,7 @@ class HaBroker(Broker): self.qpid_ha_script.main_except(["", "-b", url]+args) def promote(self): self.ready(); self.qpid_ha(["promote"]) - def set_client_url(self, url): self.qpid_ha(["set", "--public-url", url]) + def set_public_url(self, url): self.qpid_ha(["set", "--public-url", url]) def set_brokers_url(self, url): self.qpid_ha(["set", "--brokers-url", url]) def replicate(self, from_broker, queue): self.qpid_ha(["replicate", from_broker, queue]) @@ -113,10 +113,12 @@ class HaBroker(Broker): self._agent = QmfAgent(self.host_port()) return self._agent - def ha_status(self): + def qmf(self): hb = self.agent().getHaBroker() hb.update() - return hb.status + return hb + + def ha_status(self): return self.qmf().status def wait_status(self, status): def try_get_status(): @@ -234,7 +236,9 @@ class HaCluster(object): def update_urls(self): self.url = ",".join([b.host_port() for b in self]) if len(self) > 1: # No failover addresses on a 1 cluster. - for b in self: b.set_brokers_url(self.url) + for b in self: + b.set_brokers_url(self.url) + b.set_public_url(self.url) def connect(self, i): """Connect with reconnect_urls""" diff --git a/qpid/cpp/src/tests/ha_tests.py b/qpid/cpp/src/tests/ha_tests.py index ccb75d9cfd..b29ff42627 100755 --- a/qpid/cpp/src/tests/ha_tests.py +++ b/qpid/cpp/src/tests/ha_tests.py @@ -782,9 +782,9 @@ acl deny all all cluster[1].wait_queue("q0") cluster[1].wait_queue("q1") cluster[0].kill() - cluster[1].wait_queue("q1") # Not timed out yet - cluster[1].wait_no_queue("q1", timeout=2) # Wait for timeout - cluster[1].wait_no_queue("q0", timeout=2) + cluster[1].wait_queue("q1") # Not timed out yet + cluster[1].wait_no_queue("q1") # Wait for timeout + cluster[1].wait_no_queue("q0") def test_alt_exchange_dup(self): """QPID-4349: if a queue has an alterante exchange and is deleted the @@ -1135,6 +1135,38 @@ class RecoveryTests(HaBrokerTest): cluster.bounce(0, promote_next=False) cluster[0].promote() + +class ConfigurationTests(HaBrokerTest): + """Tests for configuration settings.""" + + def test_client_broker_url(self): + """Check that setting of broker and public URLs obeys correct defaulting + and precedence""" + + def check(broker, brokers, public): + qmf = broker.qmf() + self.assertEqual(brokers, qmf.brokersUrl) + self.assertEqual(public, qmf.publicUrl) + + def start(brokers, public, known=None): + args=[] + if brokers: args.append("--ha-brokers-url="+brokers) + if public: args.append("--ha-public-url="+public) + if known: args.append("--known-hosts-url="+known) + return HaBroker(self, args=args) + + # Both set explictily, no defaulting + b = start("foo:123", "bar:456") + check(b, "amqp:tcp:foo:123", "amqp:tcp:bar:456") + b.set_brokers_url("foo:999") + check(b, "amqp:tcp:foo:999", "amqp:tcp:bar:456") + b.set_public_url("bar:999") + check(b, "amqp:tcp:foo:999", "amqp:tcp:bar:999") + + # Allow "none" to mean "not set" + b = start("none", "none") + check(b, "", "") + if __name__ == "__main__": shutil.rmtree("brokertest.tmp", True) qpid_ha = os.getenv("QPID_HA_EXEC") |