diff options
| author | Alan Conway <aconway@apache.org> | 2013-02-07 19:26:12 +0000 |
|---|---|---|
| committer | Alan Conway <aconway@apache.org> | 2013-02-07 19:26:12 +0000 |
| commit | 1fd7dc55fefd1b8869962d12a8347d5d7356c927 (patch) | |
| tree | e0b2356db4bbfa32e2ca82aa370590d9916ee86e /cpp/src/qpid/ha/ReplicationTest.cpp | |
| parent | 1c93515fc9c898cacedecf11d8794d541b409074 (diff) | |
| download | qpid-python-1fd7dc55fefd1b8869962d12a8347d5d7356c927.tar.gz | |
QPID-4555: HA Primary sets explicit qpid.replicate in Queue and Exchange arguments.
Previously both Primary and Backup would calculate the qpid.replicate value
independently, assuming the result would be the same. In the case of exclusive
queues, the exclusivity can change over time so its possible that primary and
backup won't agree.
Now only Primary does the calculation with exclusive, auto-delete etc. and puts
an explicity qpid.replicate in the queue or event arguments. Backup uses the
value set by primary.
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1443678 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/ha/ReplicationTest.cpp')
| -rw-r--r-- | cpp/src/qpid/ha/ReplicationTest.cpp | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/cpp/src/qpid/ha/ReplicationTest.cpp b/cpp/src/qpid/ha/ReplicationTest.cpp index 1dd32262a0..18e0681f0f 100644 --- a/cpp/src/qpid/ha/ReplicationTest.cpp +++ b/cpp/src/qpid/ha/ReplicationTest.cpp @@ -19,6 +19,7 @@ * */ #include "ReplicationTest.h" +#include "qpid/log/Statement.h" #include "qpid/broker/Queue.h" #include "qpid/broker/Exchange.h" #include "qpid/framing/FieldTable.h" @@ -28,53 +29,49 @@ namespace ha { using types::Variant; -ReplicateLevel ReplicationTest::replicateLevel(const std::string& str) { +ReplicateLevel ReplicationTest::getLevel(const std::string& str) { Enum<ReplicateLevel> rl(replicateDefault); if (!str.empty()) rl.parse(str); return rl.get(); } -ReplicateLevel ReplicationTest::replicateLevel(const framing::FieldTable& f) { +ReplicateLevel ReplicationTest::getLevel(const framing::FieldTable& f) { if (f.isSet(QPID_REPLICATE)) - return replicateLevel(f.getAsString(QPID_REPLICATE)); + return getLevel(f.getAsString(QPID_REPLICATE)); else return replicateDefault; } -ReplicateLevel ReplicationTest::replicateLevel(const Variant::Map& m) { +ReplicateLevel ReplicationTest::getLevel(const Variant::Map& m) { Variant::Map::const_iterator i = m.find(QPID_REPLICATE); if (i != m.end()) - return replicateLevel(i->second.asString()); + return getLevel(i->second.asString()); else return replicateDefault; } -namespace { -const std::string AUTO_DELETE_TIMEOUT("qpid.auto_delete_timeout"); -} - -bool ReplicationTest::isReplicated( - ReplicateLevel level, const Variant::Map& args, bool autodelete, bool exclusive) -{ - bool ignore = autodelete && exclusive && args.find(AUTO_DELETE_TIMEOUT) == args.end(); - return !ignore && replicateLevel(args) >= level; +ReplicateLevel ReplicationTest::getLevel(const broker::Queue& q) { + const Variant::Map& qmap(q.getSettings().original); + Variant::Map::const_iterator i = qmap.find(QPID_REPLICATE); + if (i != qmap.end()) + return getLevel(i->second.asString()); + else + return getLevel(q.getSettings().storeSettings); } -bool ReplicationTest::isReplicated( - ReplicateLevel level, const framing::FieldTable& args, bool autodelete, bool exclusive) -{ - bool ignore = autodelete && exclusive && !args.isSet(AUTO_DELETE_TIMEOUT); - return !ignore && replicateLevel(args) >= level; +ReplicateLevel ReplicationTest::getLevel(const broker::Exchange& ex) { + return getLevel(ex.getArgs()); } -bool ReplicationTest::isReplicated(ReplicateLevel level, const broker::Queue& q) +ReplicateLevel ReplicationTest::useLevel(const broker::Queue& q) { - return isReplicated(level, q.getSettings().storeSettings, q.isAutoDelete(), q.hasExclusiveOwner()); + bool ignore = q.isAutoDelete() && q.hasExclusiveOwner() && + !q.getSettings().autoDeleteDelay; + return ignore ? ReplicationTest(NONE).getLevel(q) : getLevel(q); } -bool ReplicationTest::isReplicated(ReplicateLevel level, const broker::Exchange& ex) -{ - return replicateLevel(ex.getArgs()) >= level; +ReplicateLevel ReplicationTest::useLevel(const broker::Exchange& ex) { + return ReplicationTest::getLevel(ex); } |
