You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by ac...@apache.org on 2012/07/19 21:33:00 UTC
svn commit: r1363498 - in /qpid/trunk/qpid/cpp/src/qpid/ha: HaBroker.cpp
HaBroker.h HaPlugin.cpp
Author: aconway
Date: Thu Jul 19 19:32:59 2012
New Revision: 1363498
URL: http://svn.apache.org/viewvc?rev=1363498&view=rev
Log:
QPID-4156: HA close window for clients to connect before HA broker is initialized
A HA backup broker in a cluster rejects client connections. This was previously
done in a ConnectionObserver registered during Plugin::initialize. However that
left a window before the observer was registered when clients could
connect. This showed up as a sporadic failure of the failover test. This patch
moves the creation of the observer to Plugin::earlyInitialize, which is
guaranteed to be called before the broker starts listening for clients.
Modified:
qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.cpp
qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.h
qpid/trunk/qpid/cpp/src/qpid/ha/HaPlugin.cpp
Modified: qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.cpp?rev=1363498&r1=1363497&r2=1363498&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.cpp Thu Jul 19 19:32:59 2012
@@ -55,6 +55,7 @@ using types::Variant;
using types::Uuid;
using sys::Mutex;
+// Called in Plugin::earlyInitialize
HaBroker::HaBroker(broker::Broker& b, const Settings& s)
: logPrefix("Broker: "),
broker(b),
@@ -63,12 +64,26 @@ HaBroker::HaBroker(broker::Broker& b, co
observer(new ConnectionObserver(*this, systemId)),
mgmtObject(0),
status(STANDALONE),
- brokerInfo(broker.getSystem()->getNodeName(),
- // TODO aconway 2012-05-24: other transports?
- broker.getPort(broker::Broker::TCP_TRANSPORT), systemId),
membership(systemId),
replicationTest(s.replicateDefault.get())
{
+ // If we are joining a cluster we must start excluding clients now,
+ // otherwise there's a window for a client to connect before we get to
+ // initialize()
+ if (settings.cluster) {
+ observer->setObserver(boost::shared_ptr<broker::ConnectionObserver>(
+ new BackupConnectionExcluder));
+ broker.getConnectionObservers().add(observer);
+ }
+}
+
+// Called in Plugin::initialize
+void HaBroker::initialize() {
+
+ // FIXME aconway 2012-07-19: assumes there's a TCP transport with a meaningful port.
+ brokerInfo = BrokerInfo(
+ broker.getSystem()->getNodeName(), broker.getPort(broker::Broker::TCP_TRANSPORT), systemId);
+
// Set up the management object.
ManagementAgent* ma = broker.getManagementAgent();
if (settings.cluster && !ma)
@@ -87,10 +102,7 @@ HaBroker::HaBroker(broker::Broker& b, co
// If we are in a cluster, start as backup in joining state.
if (settings.cluster) {
status = JOINING;
- observer->setObserver(boost::shared_ptr<broker::ConnectionObserver>(
- new BackupConnectionExcluder));
- broker.getConnectionObservers().add(observer);
- backup.reset(new Backup(*this, s));
+ backup.reset(new Backup(*this, settings));
broker.getKnownBrokers = boost::bind(&HaBroker::getKnownBrokers, this);
}
Modified: qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.h?rev=1363498&r1=1363497&r2=1363498&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/ha/HaBroker.h Thu Jul 19 19:32:59 2012
@@ -63,9 +63,13 @@ class Primary;
class HaBroker : public management::Manageable
{
public:
+ /** HaBroker is constructed during earlyInitialize */
HaBroker(broker::Broker&, const Settings&);
~HaBroker();
+ /** Called during plugin initialization */
+ void initialize();
+
// Implement Manageable.
qpid::management::ManagementObject* GetManagementObject() const { return mgmtObject; }
management::Manageable::status_t ManagementMethod (
Modified: qpid/trunk/qpid/cpp/src/qpid/ha/HaPlugin.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/ha/HaPlugin.cpp?rev=1363498&r1=1363497&r2=1363498&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/ha/HaPlugin.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/ha/HaPlugin.cpp Thu Jul 19 19:32:59 2012
@@ -62,16 +62,21 @@ struct HaPlugin : public Plugin {
Options* getOptions() { return &options; }
- void earlyInitialize(Plugin::Target& ) {}
-
- void initialize(Plugin::Target& target) {
+ void earlyInitialize(Plugin::Target& target) {
broker::Broker* broker = dynamic_cast<broker::Broker*>(&target);
if (broker) {
+ // Must create the HaBroker in earlyInitialize so it can set up its
+ // connection observer before clients start conneting.
haBroker.reset(new ha::HaBroker(*broker, settings));
broker->addFinalizer(boost::bind(&HaPlugin::finalize, this));
}
}
+ void initialize(Plugin::Target& target) {
+ broker::Broker* broker = dynamic_cast<broker::Broker*>(&target);
+ if (broker) haBroker->initialize();
+ }
+
void finalize() {
haBroker.reset();
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org