D'oh - no idea what happened there.

Re-attached with an actual diff this time (I hope :) )

https://issues.apache.org/jira/secure/attachment/12941192/QPID-8242.patch

-- Rob

On Wed, 19 Sep 2018 at 01:23, Rob Godfrey <rob.j.godf...@gmail.com> wrote:

> As an alternative approach, how about the (totally untested) patch I've
> attached to QPID-8242 [1]
>
> Rather than trying to consolidate the commits to delete the queue entry
> and the message content it instead attempts to delete the message content
> asynchronously and batch up all message contents awaiting deletion.  From a
> performance point of view, on the broker it takes the message content
> deletion off the connection thread, and if the database is being the
> bottleneck it should start batching up the deletions of content.
>
> -- Rob
>
> [1]
> https://issues.apache.org/jira/secure/attachment/12940318/QPID-8242.patch
>
> On Mon, 17 Sep 2018 at 15:22, Rob Godfrey <rob.j.godf...@gmail.com> wrote:
>
>> The reference counting is done in AbstractServerMessageImpl.java.  In
>> general instances of ServerMessage should not be passed around, rather a
>> MessageReference (obtained by calling newReference(..) on the message
>> object.  Then if the message is no longer required in that context,
>> release() can be called on the reference.  Within the context of a queue
>> this is normally encapsulated by the notion of the QueueEntry (which holds
>> the relevant MessageReference).  When delete() is called on the QueueEntry
>> (delete being defined in the MessageInstance interface), this releases the
>> reference, which decrements the reference count, and if the count has gone
>> to zero the message calls the store to delete itself.
>>
>> I think trying to change this logic would be a bit of a nightmare
>> (understatement).  I think a better alternative in terms of reducing the
>> number of commits in the JDBC store might instead be for the remove()
>> method on StoredJDBCMessage to (rather than immediately commit the message
>> delete) schedule the message removal to be picked up by the next commit
>> that the store is asked to perform.  This would make the behaviour more
>> like the BDB store (where we schedule the commit but don't actually force
>> the sync to disk on message deletion).
>>
>> -- Rob
>>
>> On Mon, 17 Sep 2018 at 14:55, VERMEULEN Olivier <
>> olivier.vermeu...@murex.com> wrote:
>>
>>> Ok then I missed something.
>>> Whan/Where is the reference-counting you were talking about in your
>>> first mail happening?
>>>
>>> Olivier
>>>
>>> -----Original Message-----
>>> From: Rob Godfrey <rob.j.godf...@gmail.com>
>>> Sent: lundi 17 septembre 2018 14:05
>>> To: users@qpid.apache.org
>>> Subject: Re: [Broker-J] JDBC message store performance
>>>
>>> Hi Olivier,
>>>
>>> the approach you are attempting will not work for the reasons I
>>> described previously.  If the message has (for instance) been placed in two
>>> durable subscription queues (because there are two durable subscriptions)
>>> then as soon as the message is consumed from the first queue it would be
>>> removed from the store, leading to problems when the second consumer tries
>>> to read the message.
>>>
>>> -- Rob
>>>
>>> On Mon, 17 Sep 2018 at 11:39, VERMEULEN Olivier <
>>> olivier.vermeu...@murex.com>
>>> wrote:
>>>
>>> > Hello Rob,
>>> >
>>> > Thanks for the answer.
>>> > I started looking at the code to see if there is something I can do
>>> > about these 2 commits.
>>> > But before going any further I'd like your input on the below, to see
>>> > if what I'm trying to do could work or if I'm missing something (which
>>> > I'm surely are)
>>> >
>>> > https://github.com/apache/qpid-broker-j/compare/master...overmeulen:fe
>>> > ature/jdbc-message-store-commits
>>> >
>>> > Regards,
>>> > Olivier
>>> >
>>> > -----Original Message-----
>>> > From: Rob Godfrey <rob.j.godf...@gmail.com>
>>> > Sent: vendredi 14 septembre 2018 16:06
>>> > To: users@qpid.apache.org
>>> > Cc: AYOUBI Ali <ali.ayo...@murex.com>
>>> > Subject: Re: [Broker-J] JDBC message store performance
>>> >
>>> > On Fri, 14 Sep 2018 at 15:30, VERMEULEN Olivier <
>>> > olivier.vermeu...@murex.com>
>>> > wrote:
>>> >
>>> > > Hello,
>>> > >
>>> > > We ran a performance test with a bunch of brokers and an Oracle
>>> > > database to store the messages.
>>> > > We noticed that the database was a bit overloaded with commits.
>>> > > Looking at the logs we saw that sending a message was triggering 1
>>> > > commit for 3 operations (QPID_QUEUE_ENTRIES, QPID_MESSAGE_METADATA,
>>> > > QPID_MESSAGE_CONTENT) which is what we were expecting but receiving
>>> > > a message was triggering 2 commits (1 for QPID_QUEUE_ENTRIES and 1
>>> > > for QPID_MESSAGE_METADATA and QPID_MESSAGE_CONTENT).
>>> > > I debugged a bit the code and saw that in
>>> > > AbstractVirtualHost.executeTransaction the delete on
>>> > > QPID_MESSAGE_METADATA and QPID_MESSAGE_CONTENT was defined as a
>>> > > "post commit" operation, explaining why we have 2 commits.
>>> > > Is it something expected? Do you think we could reduce this to 1
>>> > > commit when receiving a message?
>>> > >
>>> >
>>> > It's not unexpected - basically the issue is that the broker needs to
>>> > cope with the possibility that the same message is being stored on
>>> > multiple queues.  The first commit is deleting the referencing of the
>>> > message from the given queue.  The second commit is occuring after the
>>> > message has been definitively removed from the queue, and the store
>>> > has determined that there are no more references, so it is ok to
>>> > remove the message.  This is driven by reference-counting of the
>>> > message, and has historically been a place of many potential race
>>> > conditions.  I'm sure it is possible to optimise the code in some way,
>>> > but it may not be "easy".  For the BDB store this doesn't matter as
>>> > much as the actual synchronisation to disk of these operations is
>>> > coalesced, obviously this is more of an issue for the JDBC store.
>>> >
>>> > -- Rob
>>> >
>>> >
>>> > >
>>> > > Thanks,
>>> > > Olivier
>>> > > *******************************
>>> > >
>>> > > This e-mail contains information for the intended recipient only. It
>>> > > may contain proprietary material or confidential information. If you
>>> > > are not the intended recipient you are not authorised to distribute,
>>> > > copy or use this e-mail or any attachment to it. Murex cannot
>>> > > guarantee that it is virus free and accepts no responsibility for
>>> > > any loss or damage arising from its use. If you have received this
>>> > > e-mail in error please notify immediately the sender and delete the
>>> > > original email received, any attachments and all copies from your
>>> system.
>>> > >
>>> > *******************************
>>> >
>>> > This e-mail contains information for the intended recipient only. It
>>> > may contain proprietary material or confidential information. If you
>>> > are not the intended recipient you are not authorised to distribute,
>>> > copy or use this e-mail or any attachment to it. Murex cannot
>>> > guarantee that it is virus free and accepts no responsibility for any
>>> > loss or damage arising from its use. If you have received this e-mail
>>> > in error please notify immediately the sender and delete the original
>>> > email received, any attachments and all copies from your system.
>>> >
>>> *******************************
>>>
>>> This e-mail contains information for the intended recipient only. It may
>>> contain proprietary material or confidential information. If you are not
>>> the intended recipient you are not authorised to distribute, copy or use
>>> this e-mail or any attachment to it. Murex cannot guarantee that it is
>>> virus free and accepts no responsibility for any loss or damage arising
>>> from its use. If you have received this e-mail in error please notify
>>> immediately the sender and delete the original email received, any
>>> attachments and all copies from your system.
>>>
>>

Reply via email to