Syed Abdul Wadood created CXF-5213:
--------------------------------------

             Summary: Question on ConcurrentModificationException in WSS4J when 
running CXF WS-Security stress test
                 Key: CXF-5213
                 URL: https://issues.apache.org/jira/browse/CXF-5213
             Project: CXF
          Issue Type: Bug
          Components: WS-* Components
    Affects Versions: 2.6.2
         Environment: all supported platforms
            Reporter: Syed Abdul Wadood


When running CXF WS-Security stressful test, we saw 
ConcurrentModificationException while loading crypto,  This exception could be 
fixed by synchronizing the map, however, I can not understand why 
ConcurrentModificationException  occurs, as I would expect the handler is 
thread safe. Does anyone ever see this kind of problem? or can explain why 
concurrent exception may happen? Is there a fix in CXF layer, or have to be 
addressed in WSS4J?

Throwable class: java.util.ConcurrentModificationException
Error Message: null
.  StackTrace::Element: 
java.util.HashMap$AbstractMapIterator.checkConcurrentMod(HashMap.java:191)
.  StackTrace::Element: 
java.util.HashMap$AbstractMapIterator.makeNext(HashMap.java:196)
.  StackTrace::Element: java.util.HashMap$KeyIterator.next(HashMap.java:269)
.  StackTrace::Element: java.util.HashMap.analyzeMap(HashMap.java:798)
.  StackTrace::Element: java.util.HashMap.rehash(HashMap.java:784)
.  StackTrace::Element: java.util.HashMap.rehash(HashMap.java:817)
.  StackTrace::Element: java.util.HashMap.putImpl(HashMap.java:700)
.  StackTrace::Element: java.util.HashMap.put(HashMap.java:678)
.  StackTrace::Element: 
org.apache.ws.security.handler.WSHandler.loadCrypto(WSHandler.java:806)
.  StackTrace::Element: 
org.apache.ws.security.handler.WSHandler.loadDecryptionCrypto(WSHandler.java:753)
.  StackTrace::Element: 
org.apache.ws.security.handler.WSHandler.decodeDecryptionParameter(WSHandler.java:1139)
.  StackTrace::Element: 
org.apache.ws.security.handler.WSHandler.doReceiverAction(WSHandler.java:284)
.  StackTrace::Element: 
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:265)
.  StackTrace::Element: 
org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor.handleMessage(WSS4JInInterceptor.java:90)
.  StackTrace::Element: 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
.  StackTrace::Element: 
org.apache.cxf.endpoint.ClientImpl.onMessage(ClientImpl.java:801)
.  StackTrace::Element: 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponseInternal(HTTPConduit.java:1695)
.  StackTrace::Element: 
com.ibm.ws.jaxws.support.LibertyHTTPConduit$LibertyWrappedOutputStream.handleResponseInternal(LibertyHTTPConduit.java:70)
.  StackTrace::Element: 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleResponse(HTTPConduit.java:1531)
.  StackTrace::Element: 
org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1439)
.  StackTrace::Element: 
org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56)
.  StackTrace::Element: 
org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:660)
.  StackTrace::Element: 
org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62)
.  StackTrace::Element: 
org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:262)
.  StackTrace::Element: 
org.apache.cxf.endpoint.ClientImpl.doInvoke(ClientImpl.java:531)
.  StackTrace::Element: 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:464)
.  StackTrace::Element: 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:367)
.  StackTrace::Element: 
org.apache.cxf.endpoint.ClientImpl.invoke(ClientImpl.java:320)
.  StackTrace::Element: 
org.apache.cxf.frontend.ClientProxy.invokeSync(ClientProxy.java:89)
.  StackTrace::Element: 
org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:134)

    protected Crypto loadCrypto(
        String cryptoPropertyFile,
        String cryptoPropertyRefId,
        RequestData requestData
    ) throws WSSecurityException {
        Object mc = requestData.getMsgContext();
        Crypto crypto = null;
        
        //
        // Try the Property Ref Id first
        //
        String refId = getString(cryptoPropertyRefId, mc);
        if (refId != null) {
            crypto = cryptos.get(refId);
            if (crypto == null) {
                Object obj = getProperty(mc, refId);
                if (obj instanceof Properties) {
                    crypto = CryptoFactory.getInstance((Properties)obj);
                    cryptos.put(refId, crypto);
                } else if (obj instanceof Crypto) {
                    crypto = (Crypto)obj;
                    cryptos.put(refId, crypto);
                }
            }
        }



--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to