Brendon created CXF-6823:
----------------------------

             Summary: Duplicate injectedProviders in ProviderFactory impacting 
throughput by ~30%
                 Key: CXF-6823
                 URL: https://issues.apache.org/jira/browse/CXF-6823
             Project: CXF
          Issue Type: Bug
          Components: JAX-RS
    Affects Versions: 3.1.5
            Reporter: Brendon


We are using CXF to process JAX-RS requests and have noticed a large number of 
threads blocking in a synchronised block.

ClientProviderFactory and ServerProviderFactory extend ProviderFactory which 
contains a member variable 
org.apache.cxf.jaxrs.provider.ProviderFactory#injectedProviders (a LinkedList).

Due to injectProviders being a list, it supports (and contains) duplicates.

In our application, we currently have the following:
org.apache.cxf.jaxrs.client.ClientProviderFactory: 26 elements
org.apache.cxf.jaxrs.provider.ServerProviderFactory: 8504 elements

But there are only 4 unique ProviderInfo objects in these lists, namely:
org.apache.cxf.jaxrs.provider.FormEncodingProvider
org.apache.cxf.jaxrs.provider.MultipartProvider
org.apache.cxf.jaxrs.provider.SourceProvider
org.apache.cxf.jaxrs.provider.JAXBElementProvider


The issue is that injectProviders is iterated on each response to clear thread 
local proxies 
(org.apache.cxf.jaxrs.provider.ProviderFactory#clearThreadLocalProxies).

Clearing of the thread local proxies relies on a synchronized block to retrieve 
the thread local proxies from the bus 
(org.apache.cxf.jaxrs.model.AbstractResourceInfo#getProxyMap).

This means that at scale, the code blocks waiting for entry into this code. I 
have seen a huge number of threads waiting for entry into this block.

As a test, I have changed injectedProviders to a Set to remove the duplicates 
and have seen an increase in throughput (RPS) of about ~30% in our application.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to