summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/qpid/ha/Primary.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2012-07-18 16:53:52 +0000
committerAlan Conway <aconway@apache.org>2012-07-18 16:53:52 +0000
commite4403022647c3df03a9216a8ab8a6ae7a8d121cd (patch)
treea753536452192cae3956e972093c636e80dafcce /qpid/cpp/src/qpid/ha/Primary.cpp
parent8b6e924b6d11be40f693d59f306eba495de7b959 (diff)
downloadqpid-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.cpp15
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) {