-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviews.apache.org/r/11009/
-----------------------------------------------------------

(Updated May 9, 2013, 5:40 p.m.)


Review request for qpid, Alan Conway, Gordon Sim, and Justin Ross.


Changes
-------

This patch is based on an updated trunk.

The annotation key under which sequence numbers are stored is now specified in 
the settings.
In other words, to enable queue sequencing, declare the queue with 
    arguments: {'qpid.queue_msg_sequence':'user_key_name'...}
The user_key_name can be any client supplied non-empty string.

Also included are the python tests for creating the queue and retrieving the 
sequence numbers.


Description
-------

The primary purpose of this is to detect when a ring queue overwrites messages. 
The client can examine the sequence number and look for gaps which indicate 
that messages have been dropped. 

To enable, create the queue with the qpid.queue_msg_sequence arg: 
         std::string addr("my-queue;"
                 " {create:sender, delete:always,"
                 " node: {type: queue, x-declare: {arguments:"
                 " {qpid.queue_msg_sequence:1, qpid.policy_type:ring, 
qpid.max_count:4}}}}");

         Sender sender = session.createSender(addr);
This enables sequencing when a message is enqueued. Sequence numbers start at 1 
and are unsigned 64 bit numbers.
The exchange level sequencing uses "qpid.msg_sequence" as the key.

*** Question *** Should queues use the same key to enable sequencing as 
exchanges? "qpid.msg_sequence" The page 
https://cwiki.apache.org/qpid/qpid-extensions-to-amqp.html indicates that 
qpid.msg_sequence is supported when declaring a queue, but that key was never 
supported for queues. 


To get the sequence number:
         uint64_t seqNo;
         seqNo = response.getProperties()["qpid.queue_msg_sequence"];

*** Note ***
I added a uint64 to the queue class. There is an existing message sequence 
number for queues. It is a SequenceNumber class.
 However, this is a 32 bit number. I was leery of changing that to a 64 bit 
number since it is used throughout the broker and not just as a msg counter.
I'm assuming a 32 bit number is not sufficient in this case since "wrapping 
around" to zero would complicate the logic of detecting overwritten messages.

There is a public class variable in Queue.h named std::string seqNoKey; It is 
unused. My guess is that it was intended for use with the SequenceNumber class. 
Can it be removed?

This does not address the issue of persisting the message sequence after a 
broker restart. This will be a future issue.

Before committing this, C++ and python tests would need to be added.


This addresses bug QPID-4591.
    https://issues.apache.org/jira/browse/QPID-4591


Diffs (updated)
-----

  /trunk/qpid/cpp/src/qpid/broker/Queue.cpp 1480722 
  /trunk/qpid/cpp/src/qpid/broker/QueueSettings.h 1480722 
  /trunk/qpid/cpp/src/qpid/broker/QueueSettings.cpp 1480722 
  /trunk/qpid/tests/src/py/qpid_tests/broker_0_10/new_api.py 1480722 

Diff: https://reviews.apache.org/r/11009/diff/


Testing
-------

See attached testring.cpp and mm (make script)
They create a ring queue that holds 4 messages with qpid.queue_msg_sequence, 
sends enough messages to overflow the queue, and then retrieves the messages. 
It outputs the message sequence numbers.


Thanks,

Ernie Allen

Reply via email to