Author: gsim
Date: Wed May 14 16:25:12 2014
New Revision: 1594633
URL: http://svn.apache.org/r1594633
Log:
QPID-5765: don't invoke on dangling pointer
Strictly speaking comparing anything against the old pointer isn't correct
either,
but this is harder to change and the only negative effect is that in the event
that
a new connection has the same pointer value, it would be incorrectly interpreted
as 'local'.
Modified:
qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.h
qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/Connection.h
qpid/trunk/qpid/cpp/src/tests/failing-amqp1.0-python-tests
qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Connection.h Wed May 14 16:25:12 2014
@@ -21,6 +21,7 @@
* under the License.
*
*/
+#include "OwnershipToken.h"
#include <map>
#include <string>
@@ -34,15 +35,12 @@ class Variant;
namespace broker {
-class OwnershipToken;
-
/**
* Protocol independent connection abstraction.
*/
-class Connection {
+class Connection : public OwnershipToken {
public:
virtual ~Connection() {}
- virtual const OwnershipToken* getOwnership() const = 0;
virtual const management::ObjectId getObjectId() const = 0;
virtual const std::string& getUserId() const = 0;
virtual const std::string& getMgmtId() const = 0;
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp Wed May 14 16:25:12 2014
@@ -203,7 +203,7 @@ void Message::setIsManagementMessage(boo
const Connection* Message::getPublisher() const { return publisher; }
void Message::setPublisher(const Connection& p) { publisher = &p; }
-bool Message::isLocalTo(const OwnershipToken* token) const { return token &&
publisher && token->isLocal(publisher->getOwnership()); }
+bool Message::isLocalTo(const OwnershipToken* token) const { return token &&
publisher && token->isLocal(publisher); }
qpid::framing::SequenceNumber Message::getSequence() const
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.cpp
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.cpp?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.cpp Wed May 14
16:25:12 2014
@@ -148,10 +148,6 @@ qpid::management::ManagementObject::shar
std::string ManagedConnection::getId() const { return id; }
-const OwnershipToken* ManagedConnection::getOwnership() const
-{
- return this;
-}
const management::ObjectId ManagedConnection::getObjectId() const
{
return GetManagementObject()->getObjectId();
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.h?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp/ManagedConnection.h Wed May 14
16:25:12 2014
@@ -23,7 +23,6 @@
*/
#include "qpid/management/Manageable.h"
#include "qpid/broker/Connection.h"
-#include "qpid/broker/OwnershipToken.h"
#include "qpid/types/Variant.h"
#include "qmf/org/apache/qpid/broker/Connection.h"
@@ -36,7 +35,7 @@ namespace broker {
class Broker;
namespace amqp {
-class ManagedConnection : public qpid::management::Manageable, public
OwnershipToken, public qpid::broker::Connection
+class ManagedConnection : public qpid::management::Manageable, public
qpid::broker::Connection
{
public:
ManagedConnection(Broker& broker, const std::string id, bool
brokerInitiated);
@@ -56,7 +55,6 @@ class ManagedConnection : public qpid::m
void outgoingMessageSent();
//ConnectionIdentity
- const OwnershipToken* getOwnership() const;
const management::ObjectId getObjectId() const;
const std::string& getUserId() const;
const std::string& getMgmtId() const;
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/Connection.h
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/Connection.h?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/Connection.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/amqp_0_10/Connection.h Wed May 14
16:25:12 2014
@@ -68,7 +68,7 @@ namespace amqp_0_10 {
struct ConnectionTimeoutTask;
class Connection : public sys::ConnectionInputHandler, public
qpid::broker::Connection,
- public OwnershipToken, public management::Manageable,
+ public management::Manageable,
public RefCounted
{
public:
@@ -81,7 +81,6 @@ class Connection : public sys::Connectio
void setHeartbeatMax(uint16_t hbm) { heartbeatmax = hbm; }
- const OwnershipToken* getOwnership() const { return this; };
const management::ObjectId getObjectId() const { return
GetManagementObject()->getObjectId(); };
const std::string& getUserId() const { return userId; }
Modified: qpid/trunk/qpid/cpp/src/tests/failing-amqp1.0-python-tests
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/failing-amqp1.0-python-tests?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/failing-amqp1.0-python-tests (original)
+++ qpid/trunk/qpid/cpp/src/tests/failing-amqp1.0-python-tests Wed May 14
16:25:12 2014
@@ -19,3 +19,4 @@
qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange_2_consumers
qpid_tests.broker_0_10.new_api.GeneralTests.test_qpid_3481_acquired_to_alt_exchange
+qpid_tests.broker_0_10.new_api.GeneralTests.test_nolocal_rerouted
Modified: qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py
URL:
http://svn.apache.org/viewvc/qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py?rev=1594633&r1=1594632&r2=1594633&view=diff
==============================================================================
--- qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py (original)
+++ qpid/trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py Wed May 14
16:25:12 2014
@@ -149,6 +149,35 @@ class GeneralTests(Base):
expected.remove(c)
self.ssn.acknowledge()
+ def test_nolocal_rerouted(self):
+ conn2 = Connection.establish(self.broker, **self.connection_options())
+ ssn2 = conn2.session()
+
+ s1 = self.ssn.sender("holding_q; {create:always, delete:always,
node:{x-declare:{alternate-exchange:'amq.fanout'}}}");
+ s2 = ssn2.sender("holding_q");
+
+ s2.send(Message("a"));
+ s1.send(Message("b"));
+ s2.send(Message("c"));
+
+ r = self.ssn.receiver("amq.fanout;
{link:{x-declare:{arguments:{'no-local':True}}}}")
+
+ # close connection of one of the publishers
+ conn2.close()
+
+ # close sender which should cause the orphaned messages on
+ # holding_q to be rerouted through alternate exchange onto the
+ # subscription queue of the receiver above
+ s1.close()
+
+ received = []
+ try:
+ while True:
+ received.append(r.fetch(0).content)
+ except Empty: pass
+ self.assertEqual(received, ["a", "c"])
+
+
class SequenceNumberTests(Base):
"""
Tests of ring queue sequence number
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]