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-subscr...@qpid.apache.org

Reply via email to