Author: aconway Date: Fri Feb 17 14:12:24 2012 New Revision: 1245523 URL: http://svn.apache.org/viewvc?rev=1245523&view=rev Log: QPID-3603: Fix replication of unbind events.
Old clients can omit certain map values. Previously this caused an error, now a void value is treated as an empty map. Modified: qpid/branches/qpid-3603-7/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp Modified: qpid/branches/qpid-3603-7/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp URL: http://svn.apache.org/viewvc/qpid/branches/qpid-3603-7/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp?rev=1245523&r1=1245522&r2=1245523&view=diff ============================================================================== --- qpid/branches/qpid-3603-7/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp (original) +++ qpid/branches/qpid-3603-7/qpid/cpp/src/qpid/ha/BrokerReplicator.cpp Fri Feb 17 14:12:24 2012 @@ -175,9 +175,10 @@ void sendQuery(const string className, c sessionHandler.out->handle(content); } -void translate(const Variant& value, framing::FieldTable& outArgs) { - if (!value.isVoid()) - amqp_0_10::translate(value.asMap(), outArgs); +// Like Variant::asMap but treat void value as an empty map. +Variant::Map asMapVoid(const Variant& value) { + if (!value.isVoid()) return value.asMap(); + else return Variant::Map(); } } // namespace @@ -253,7 +254,7 @@ void BrokerReplicator::route(Deliverable string type = i->asMap()[SCHEMA_ID].asMap()[CLASS_NAME]; Variant::Map& values = i->asMap()[VALUES].asMap(); framing::FieldTable args; - translate(values[ARGUMENTS].asMap(), args); + amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args); if (type == QUEUE) doResponseQueue(values); else if (type == EXCHANGE) doResponseExchange(values); else if (type == BINDING) doResponseBind(values); @@ -268,10 +269,10 @@ void BrokerReplicator::route(Deliverable void BrokerReplicator::doEventQueueDeclare(Variant::Map& values) { string name = values[QNAME].asString(); - Variant::Map argsMap = values[ARGS].asMap(); + Variant::Map argsMap = asMapVoid(values[ARGS]); if (values[DISP] == CREATED && replicateLevel(argsMap)) { framing::FieldTable args; - translate(argsMap, args); + amqp_0_10::translate(argsMap, args); std::pair<boost::shared_ptr<Queue>, bool> result = broker.createQueue( name, @@ -315,11 +316,11 @@ void BrokerReplicator::doEventQueueDelet } void BrokerReplicator::doEventExchangeDeclare(Variant::Map& values) { - Variant::Map argsMap(values[ARGS].asMap()); + Variant::Map argsMap(asMapVoid(values[ARGS])); if (values[DISP] == CREATED && replicateLevel(argsMap)) { string name = values[EXNAME].asString(); framing::FieldTable args; - translate(argsMap, args); + amqp_0_10::translate(argsMap, args); if (broker.createExchange( name, values[EXTYPE].asString(), @@ -363,7 +364,7 @@ void BrokerReplicator::doEventBind(Varia queue && replicateLevel(queue->getSettings())) { framing::FieldTable args; - translate(values[ARGS].asMap(), args); + amqp_0_10::translate(asMapVoid(values[ARGS]), args); string key = values[KEY].asString(); QPID_LOG(debug, "HA: Backup replicated binding exchange=" << exchange->getName() << " queue=" << queue->getName() @@ -383,7 +384,7 @@ void BrokerReplicator::doEventUnbind(Var queue && replicateLevel(queue->getSettings())) { framing::FieldTable args; - translate(values[ARGS].asMap(), args); + amqp_0_10::translate(asMapVoid(values[ARGS]), args); string key = values[KEY].asString(); QPID_LOG(debug, "HA: Backup replicated unbinding exchange=" << exchange->getName() << " queue=" << queue->getName() @@ -394,10 +395,10 @@ void BrokerReplicator::doEventUnbind(Var void BrokerReplicator::doResponseQueue(Variant::Map& values) { // FIXME aconway 2011-11-22: more flexible ways & defaults to indicate replication - Variant::Map argsMap(values[ARGUMENTS].asMap()); + Variant::Map argsMap(asMapVoid(values[ARGUMENTS])); if (!replicateLevel(argsMap)) return; framing::FieldTable args; - translate(argsMap, args); + amqp_0_10::translate(argsMap, args); string name(values[NAME].asString()); std::pair<boost::shared_ptr<Queue>, bool> result = broker.createQueue( @@ -420,10 +421,10 @@ void BrokerReplicator::doResponseQueue(V } void BrokerReplicator::doResponseExchange(Variant::Map& values) { - Variant::Map argsMap(values[ARGUMENTS].asMap()); + Variant::Map argsMap(asMapVoid(values[ARGUMENTS])); if (!replicateLevel(argsMap)) return; framing::FieldTable args; - translate(argsMap, args); + amqp_0_10::translate(argsMap, args); if (broker.createExchange( values[NAME].asString(), values[TYPE].asString(), @@ -472,7 +473,7 @@ void BrokerReplicator::doResponseBind(Va queue && replicateLevel(queue->getSettings())) { framing::FieldTable args; - translate(values[ARGUMENTS].asMap(), args); + amqp_0_10::translate(asMapVoid(values[ARGUMENTS]), args); string key = values[KEY].asString(); exchange->bind(queue, key, &args); QPID_LOG(debug, "HA: Backup catch-up binding: exchange=" << exchange->getName() --------------------------------------------------------------------- Apache Qpid - AMQP Messaging Implementation Project: http://qpid.apache.org Use/Interact: mailto:commits-subscr...@qpid.apache.org