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