[ 
https://issues.apache.org/jira/browse/QPID-7815?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16070375#comment-16070375
 ] 

Keith Wall commented on QPID-7815:
----------------------------------

In reply to Lorenz's point on the 21st, one possibility is to have the overflow 
policy handlers consulted *before* the enqueue occurs.  I am imagining a method 
like {{OverflowPolicyHandler#preEnqueue(ServerMessage)}}.  The method would 
allow the routing to the queue(s) to be vetoed if necessary.

For the {{RejectOverflowPolicyHandler}}, its {{preEnqueue}} method would work 
out if the message would be acceptable to the queue or not.  It will do this by 
maintaining {{pendingMessages}} and {{pendingBytes}} atomic counters.  To 
decide whether the message is acceptable or not, it would sum the pending 
counters these with the queue's actual message/bytes statistics.    The reject 
policy's {{checkOverflow}} method would merely be tasked with reducing the 
pending counters.  It would not be able to veto the message's enqueue.   To 
ensure that the pending counters are decremented on rollback case, the reject 
policy would need to register a on-delete listener with the message itself 
(proposed: {{ServerMessage#addDeleteAction}}).

For the existing overview policies, the {{preEnqueue}} would simply accept the 
message.

{{ServerMessage#isResourceAcceptable}} would be given the responsibility to 
consult {{OverflowPolicyHandler#preEnqueue(ServerMessage)}}, if the queue has 
an overflow policy.

I can see a disadvantage with this approach   There is a race which would 
manifest when a queue is approaching its limits:  a newly arrive message could 
be spuriously rejected if it's enqueue races 'unlucky' with another thread's 
maintenance of the pending counters.  I can't see how to avoid this without 
single threading the some parts of the enqueue path (which I think would be 
unacceptable).   My hope is that this would not present problem in practice.

I also want to highlight another aspect of the proposal's behaviour.  If a 
message is routed to am exchange that is bound to many queues, if any queue 
rejects, the message will be rejected globally and will go to none (see 
RoutingResult.java:103).   I don't see this is a problem, but wanted to call it 
out for discussion.


  



> Reject policy type
> ------------------
>
>                 Key: QPID-7815
>                 URL: https://issues.apache.org/jira/browse/QPID-7815
>             Project: Qpid
>          Issue Type: New Feature
>          Components: Java Broker
>    Affects Versions: qpid-java-broker-7.0.0
>            Reporter: Tomas Vavricka
>            Assignee: Lorenz Quack
>              Labels: policy-type, queue, reject
>             Fix For: qpid-java-broker-7.0.0
>
>         Attachments: 
> 0001-QPID-7815-Java-Broker-Enable-QueuePolicyTests-on-all.patch, 
> 0001-QPID-7815-Reject-policy-type.patch
>
>
> It would be good if Java Broker will support reject policy.
> Reject policy - reject incoming message(s) when queue capacity is reached
> Queue capacity can be defined by maximum count of message and maximum size of 
> messages (including header).



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to