You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by gs...@apache.org on 2011/04/26 15:42:25 UTC

svn commit: r1096751 - in /qpid/trunk/qpid/cpp: include/qpid/messaging/Duration.h src/qpid/broker/Message.cpp src/qpid/messaging/Duration.cpp src/tests/MessagingSessionTests.cpp

Author: gsim
Date: Tue Apr 26 13:42:24 2011
New Revision: 1096751

URL: http://svn.apache.org/viewvc?rev=1096751&view=rev
Log:
QPID-3222: Prevent ttl overflow; also adds equality operators for qpid::messaging::Duration.

Modified:
    qpid/trunk/qpid/cpp/include/qpid/messaging/Duration.h
    qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/Duration.cpp
    qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp

Modified: qpid/trunk/qpid/cpp/include/qpid/messaging/Duration.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/include/qpid/messaging/Duration.h?rev=1096751&r1=1096750&r2=1096751&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/include/qpid/messaging/Duration.h (original)
+++ qpid/trunk/qpid/cpp/include/qpid/messaging/Duration.h Tue Apr 26 13:42:24 2011
@@ -49,6 +49,8 @@ QPID_MESSAGING_EXTERN Duration operator*
                                       uint64_t multiplier);
 QPID_MESSAGING_EXTERN Duration operator*(uint64_t multiplier,
                                       const Duration& duration);
+QPID_MESSAGING_EXTERN bool operator==(const Duration& a, const Duration& b);
+QPID_MESSAGING_EXTERN bool operator!=(const Duration& a, const Duration& b);
 
 }} // namespace qpid::messaging
 

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=1096751&r1=1096750&r2=1096751&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Message.cpp Tue Apr 26 13:42:24 2011
@@ -374,7 +374,8 @@ void Message::setTimestamp(const boost::
             props->setExpiration(now + (props->getTtl()/1000));
         }
         // Use higher resolution time for the internal expiry calculation.
-        expiration = AbsTime(AbsTime::now(), Duration(props->getTtl() * TIME_MSEC));
+        Duration ttl(std::min(props->getTtl() * TIME_MSEC, (uint64_t) std::numeric_limits<int64_t>::max()));//Prevent overflow
+        expiration = AbsTime(AbsTime::now(), ttl);
         setExpiryPolicy(e);
     }
 }
@@ -384,8 +385,10 @@ void Message::adjustTtl()
     DeliveryProperties* props = getProperties<DeliveryProperties>();
     if (props->getTtl()) {
         sys::Mutex::ScopedLock l(lock);
-        sys::Duration d(sys::AbsTime::now(), getExpiration());
-        props->setTtl(int64_t(d) > 0 ? int64_t(d)/1000000 : 1); // convert from ns to ms; set to 1 if expired
+        if (expiration < FAR_FUTURE) {
+            sys::Duration d(sys::AbsTime::now(), getExpiration());
+            props->setTtl(int64_t(d) > 0 ? int64_t(d)/1000000 : 1); // convert from ns to ms; set to 1 if expired
+        }
     }
 }
 

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/Duration.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/Duration.cpp?rev=1096751&r1=1096750&r2=1096751&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/Duration.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/Duration.cpp Tue Apr 26 13:42:24 2011
@@ -37,6 +37,16 @@ Duration operator*(uint64_t multiplier, 
     return Duration(duration.getMilliseconds() * multiplier);
 }
 
+bool operator==(const Duration& a, const Duration& b)
+{
+    return a.getMilliseconds() == b.getMilliseconds();
+}
+
+bool operator!=(const Duration& a, const Duration& b)
+{
+    return a.getMilliseconds() != b.getMilliseconds();
+}
+
 const Duration Duration::FOREVER(std::numeric_limits<uint64_t>::max());
 const Duration Duration::IMMEDIATE(0);
 const Duration Duration::SECOND(1000);

Modified: qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp?rev=1096751&r1=1096750&r2=1096751&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/MessagingSessionTests.cpp Tue Apr 26 13:42:24 2011
@@ -978,6 +978,20 @@ QPID_AUTO_TEST_CASE(testRejectAndCredit)
     sender.close();
 }
 
+QPID_AUTO_TEST_CASE(testTtlForever)
+{
+    QueueFixture fix;
+    Sender sender = fix.session.createSender(fix.queue);
+    Message out("I want to live forever!");
+    out.setTtl(Duration::FOREVER);
+    sender.send(out, true);
+    Receiver receiver = fix.session.createReceiver(fix.queue);
+    Message in = receiver.fetch(Duration::IMMEDIATE);
+    fix.session.acknowledge();
+    BOOST_CHECK_EQUAL(in.getContent(), out.getContent());
+    BOOST_CHECK(in.getTtl() == Duration::FOREVER);
+}
+
 QPID_AUTO_TEST_SUITE_END()
 
 }} // namespace qpid::tests



---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project:      http://qpid.apache.org
Use/Interact: mailto:commits-subscribe@qpid.apache.org