summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorGordon Sim <gsim@apache.org>2013-11-08 17:41:31 +0000
committerGordon Sim <gsim@apache.org>2013-11-08 17:41:31 +0000
commitd6c187e8b25ff0e9c9749a9b49462b81025da588 (patch)
treebf6a935ac21e076219ed6c48b5dbfdee3ae7b020 /cpp
parentff7fe0ff536089dfe3fe0a3edc5c96b3af8687be (diff)
downloadqpid-python-d6c187e8b25ff0e9c9749a9b49462b81025da588.tar.gz
QPID-5315: record persistence ids in paging file so they can be restored after paging out
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@1540138 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/qpid/broker/PagedQueue.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/cpp/src/qpid/broker/PagedQueue.cpp b/cpp/src/qpid/broker/PagedQueue.cpp
index 58996bd200..9701617b01 100644
--- a/cpp/src/qpid/broker/PagedQueue.cpp
+++ b/cpp/src/qpid/broker/PagedQueue.cpp
@@ -30,20 +30,22 @@ namespace qpid {
namespace broker {
namespace {
using qpid::sys::MemoryMappedFile;
+const uint32_t OVERHEAD(4/*content-size*/ + 4/*sequence-number*/ + 8/*persistence-id*/);
size_t encodedSize(const Message& msg)
{
- return msg.getPersistentContext()->encodedSize() + 4/*content-size*/ + 4/*sequence-number*/;
+ return msg.getPersistentContext()->encodedSize() + OVERHEAD;
}
size_t encode(const Message& msg, char* data, size_t size)
{
uint32_t encoded = msg.getPersistentContext()->encodedSize();
- uint32_t required = encoded + 4/*content-size*/ + 4/*sequence-number*/;
+ uint32_t required = encoded + OVERHEAD;
if (required > size) return 0;
qpid::framing::Buffer buffer(data, required);
buffer.putLong(encoded);
buffer.putLong(msg.getSequence());
+ buffer.putLongLong(msg.getPersistentContext()->getPersistenceId());
msg.getPersistentContext()->encode(buffer);
assert(buffer.getPosition() == required);
return required;
@@ -54,11 +56,13 @@ size_t decode(ProtocolRegistry& protocols, Message& msg, const char* data, size_
qpid::framing::Buffer metadata(const_cast<char*>(data), size);
uint32_t encoded = metadata.getLong();
uint32_t sequence = metadata.getLong();
+ uint64_t persistenceId = metadata.getLongLong();
assert(metadata.available() >= encoded);
qpid::framing::Buffer buffer(const_cast<char*>(data) + metadata.getPosition(), encoded);
msg = protocols.decode(buffer);
assert(buffer.getPosition() == encoded);
msg.setSequence(qpid::framing::SequenceNumber(sequence));
+ msg.getPersistentContext()->setPersistenceId(persistenceId);
return encoded + metadata.getPosition();
}