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]

Reply via email to