diff options
author | Alan Conway <aconway@apache.org> | 2012-07-18 16:53:52 +0000 |
---|---|---|
committer | Alan Conway <aconway@apache.org> | 2012-07-18 16:53:52 +0000 |
commit | e4403022647c3df03a9216a8ab8a6ae7a8d121cd (patch) | |
tree | a753536452192cae3956e972093c636e80dafcce /qpid/cpp/src/qpid/ha/Primary.cpp | |
parent | 8b6e924b6d11be40f693d59f306eba495de7b959 (diff) | |
download | qpid-python-e4403022647c3df03a9216a8ab8a6ae7a8d121cd.tar.gz |
QPID-4148: HA Not setting initial queues for new RemoteBackups
Fix bug introduced by r1362584:
"QPID-4144 HA broker deadlocks on broker::QueueRegistry lock and ha::Primary lock"
Stopped setting initial queues on new (i.e. not expected) RemoteBackups.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1363014 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/cpp/src/qpid/ha/Primary.cpp')
-rw-r--r-- | qpid/cpp/src/qpid/ha/Primary.cpp | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/qpid/cpp/src/qpid/ha/Primary.cpp b/qpid/cpp/src/qpid/ha/Primary.cpp index f3df5b2263..2a3eb86b64 100644 --- a/qpid/cpp/src/qpid/ha/Primary.cpp +++ b/qpid/cpp/src/qpid/ha/Primary.cpp @@ -93,7 +93,7 @@ Primary::Primary(HaBroker& hb, const BrokerInfo::Set& expect) : new RemoteBackup(*i, haBroker.getReplicationTest(), false)); backups[i->getSystemId()] = backup; if (!backup->isReady()) expectedBackups.insert(backup); - backup->createGuards(hb.getBroker().getQueues()); + backup->setInitialQueues(hb.getBroker().getQueues(), true); // Create guards } // Set timeout for expected brokers to connect and become ready. sys::Duration timeout(int64_t(hb.getSettings().backupTimeout*sys::TIME_SEC)); @@ -187,13 +187,18 @@ void Primary::queueDestroy(const QueuePtr& q) { } void Primary::opened(broker::Connection& connection) { - Mutex::ScopedLock l(lock); BrokerInfo info; - boost::shared_ptr<RemoteBackup> backup; if (ha::ConnectionObserver::getBrokerInfo(connection, info)) { + Mutex::ScopedLock l(lock); BackupMap::iterator i = backups.find(info.getSystemId()); if (i == backups.end()) { - backup.reset(new RemoteBackup(info, haBroker.getReplicationTest(), true)); + boost::shared_ptr<RemoteBackup> backup( + new RemoteBackup(info, haBroker.getReplicationTest(), true)); + { + // Avoid deadlock with queue registry lock. + Mutex::ScopedUnlock u(lock); + backup->setInitialQueues(haBroker.getBroker().getQueues(), false); + } backups[info.getSystemId()] = backup; QPID_LOG(debug, logPrefix << "New backup connected: " << info); } @@ -207,7 +212,7 @@ void Primary::opened(broker::Connection& connection) { } else QPID_LOG(debug, logPrefix << "Accepted client connection " - << connection.getMgmtId()) + << connection.getMgmtId()); } void Primary::closed(broker::Connection& connection) { |