summaryrefslogtreecommitdiff
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
commit520f7a07a51455b67be6852546cc9f006706a104 (patch)
treee4b9a84f70b6d43637c509722618b9617056801d
parent0319629d9bbd6d3b27329832512dd7690ff4af9c (diff)
downloadqpid-python-520f7a07a51455b67be6852546cc9f006706a104.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@1540138 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--qpid/cpp/src/qpid/broker/PagedQueue.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/qpid/cpp/src/qpid/broker/PagedQueue.cpp b/qpid/cpp/src/qpid/broker/PagedQueue.cpp
index 58996bd200..9701617b01 100644
--- a/qpid/cpp/src/qpid/broker/PagedQueue.cpp
+++ b/qpid/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();
}