[ 
https://issues.apache.org/jira/browse/QPID-7728?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Rudyy closed QPID-7728.
----------------------------
    Resolution: Fixed

Fixed as part of QPID-7771

> [Java Broker] Existing implementation of fanout exchange is susceptible to 
> memory leaks
> ---------------------------------------------------------------------------------------
>
>                 Key: QPID-7728
>                 URL: https://issues.apache.org/jira/browse/QPID-7728
>             Project: Qpid
>          Issue Type: Bug
>          Components: Java Broker
>    Affects Versions: qpid-java-broker-7.0.0
>            Reporter: Alex Rudyy
>
> An implementation of fanout exchange {{FanoutExchangeImpl}} is susceptible to 
> memory leaks. The scenarios when memory leaks can occur are described below. 
> If binding does not have filter arguments, it is added into {{_queue}} and 
> {{_unfilteredQueues }} (of {{FanoutExchangeImpl$BindingSet}}) (If binding is 
> added multiple times, the counter in _queue is incremented)
> If binding has filter argument, it is added into {{_filteredQueues}} and 
> {{_filteredBindings}} (of {{FanoutExchangeImpl$BindingSet}}).
> Thus, imagine the following scenario, when queue bindings are added to a 
> fanout exchange:
> 1) add binding with filter and  routing key set to null (binding is added 
> into {{_filteredQueues}} and {{_filteredBindings}})
> 2) add binding with filter and  routing key set to 'a' (binding is added into 
> {{_filteredBindings}} ;  {{_filteredQueue}} is not modified because queue is 
> already there)
> 3) add binding without filter and  routing key set to null (binding with null 
> routing key is removed from {{_filteredBindings}} as part of 
> {{Exchange#repaceBinding}} and added into {{_queues}} and 
> {{_unfilteredQueue}} ({{_filteredQueues}} still has entry for a queue for 
> routing key 'a'))
> 4) add binding without filter and  routing key set to null again (binding 
> with null routing key is removed from {{_unfilteredQueues}} and {{_queues 
> }}as part of {{Exchange#repaceBinding}} but it is addeed into 
> {{_filteredQueues}} second time (!!!) as {{_filteredBindings}} has binding 
> for a routing key 'a'; it is re-added to {{_unfilteredQueues}} and 
> {{_queues}} as part of {{Exchange#repaceBinding}}.
> 5) Repeating step 4 in a loop multiple times would result in adding into 
> {{_filteredQueues}} a queue entry every time (line 203) which might 
> eventually result in OOM.
> Here is a second scenario when leak is possible
> 1) add binding with filter and  routing key set to 'a' (binding is added into 
> {{_filteredQueues}} and {{_filteredBindings}})
> 1) add binding without filter and  routing key set to null (added into 
> {{_queues}} and {{_unfilteredQueues}}.  The queue is present in 
> {{_filteredQueues}} and {{_filteredBindings}} due to step 1) 
> 2) add binding with filter and  routing key set to 'b' (binding is added into 
> {{_filteredQueues}} second time as it is present in {{_unfilteredQueues}}); 
> binding is added into {{_filteredBindings}}
> 3) Repeating step 2 in a loop multiple times  would result in adding into 
> {{_filteredQueues}} a queue entry every time (line 91) which might eventually 
> result in OOM.
> I think that implementation of {{FanoutExchangeImpl$BindingSet}} does not 
> really need {{_filteredQueues}} and {{_unfilteredQueues}}. These fields look  
> redundant to me.
> Map  {{_queues}} already containa unfiltered queues, thus 
> {{_unfilteredQueues.contains}} can be replaced with call to 
> {{_queues.containsKey}}.
> Map {{_filteredBindings}} contains filtered queues, thus 
> {{_filteredQueues.contains}} can be replaced with call to 
> {{_filteredBindings.containsKey}}.
> I think that {{_filteredBindings}} can be simplified and replaced with 
> {{Map<MessageDestination, FilterManager> _filteredBindings}}. Every new 
> filter can be added into {{FilterManage}}r using 
> {{FilterManager#addFilter(String name,MessageFilter filter)}} similar to 
> {{DirectExchangeImp}} where we can pass binding key as a name .



--
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