Changes to MessageStore interface to support new cluster design.
----------------------------------------------------------------
Key: QPID-2893
URL: https://issues.apache.org/jira/browse/QPID-2893
Project: Qpid
Issue Type: Improvement
Components: C++ Broker
Reporter: Alan Conway
Assignee: Alan Conway
The new cluster design outlined at https://svn.apache.org/repos/asf/qpid/trunk/qpid/cpp/src/qpid/cluster/new-cluster-design.txt
proposes to use the MessageStore interface to drive the cluster. This would require some modifications
as outlined below. This JIRA is for discussion/refinement of the changes by anyone interested
in MessageStore implementations.
*** Add acquire() and release() to MessageStore
Add two new functions to MessageStore, called when messages are
acquired/released. Existing store implementations can implement these
functions as no-ops.
virtual void acquire(TransactionContext* ctxt, const
boost::intrusive_ptr<PersistableMessage>&
msg, const PersistableQueue& queue) = 0;
virtual void release(TransactionContext* ctxt, const
boost::intrusive_ptr<PersistableMessage>&
msg, const PersistableQueue& queue) = 0;
Why: the store needs to know about the acquired status of messages to
ensure that acquired messages are not dequeued on another member.
*** Call MessageStore functions for durable *and* non-durable queues/exchanges/messages.
The broker should call MessageStore functions for all messages,
exchanges, queues & bindings. Existing store implementations must
check the durable/persistent flag and ignore calls for non-durable
objects.
Why: the cluster replicates both durable and transient objects so
needs to be called for both.
*** Support async completion of accept when dequeue completes.
Interface is already there on broker::Message, just need to ensure
that store implementations call it appropriately.
Why: this is a bug currently, we complete accepts immediately on
issuing the AIO commands without waiting for completion.
*** Support async completion for declare, bind, delete
class MessageStore { typedef boost::function<void ()>
CompletionCallback;
virtual void create(PersistableQueue& queue, const
framing::FieldTable& args, CompletionCallback
onCompletion, ) = 0;
Existing stores that synchronously complete wiring changes would call
onCompletion() directly in the create/bind/destroy function.
Why: The cluster can't safely block till a create, destroy or bind
call has been replicated, it would risk deadlock.
*** Chaining MessageStores and multiple async completers.
Allow multiple MessageStore implementations to be attached to a
broker, e.g. journal + cluster. Implement MessageStoreChain, a
MessageStore implementations that delegates to multiple MessageStores.
MessageStoreChain must arrange for async completion to work correctly:
i.e. the action is considered complete when *all* of the registered
stores have indicated their completion.
This shouldn't have any impact on the MessageStore interface or
existing implementations.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
Apache Qpid - AMQP Messaging Implementation
Project: http://qpid.apache.org
Use/Interact: mailto:dev-subscribe@qpid.apache.org
|