[ https://issues.apache.org/jira/browse/RAMPART-427?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Robert Lazarski reassigned RAMPART-427: --------------------------------------- Assignee: Robert Lazarski > First requests to secured service are failing with "The CLIENT_SIDE parameter > is already locked and the value cannot be overridden" error in multi-thread > execution. > -------------------------------------------------------------------------------------------------------------------------------------------------------------------- > > Key: RAMPART-427 > URL: https://issues.apache.org/jira/browse/RAMPART-427 > Project: Rampart > Issue Type: Bug > Components: rampart-core > Reporter: Todor Mazgalov > Assignee: Robert Lazarski > Priority: Major > Labels: Patch > Fix For: 2.0.0 > > Attachments: > rampart-core-add-synchronization-for-CLIENT_SIDE-parameter.patch, > rampart-integration-test-testMultiThreadServiceCall.patch > > > First requests to the RampartMessageData in multi-thread execution are > failing with error for already locked parameter. This occurs when more than > one thread is trying to set CLIENT_SIDE param to the service, the first > thread locks the parameter during the addition and the rest cannot override > it because it's already locked. I'm providing a patch with test which proves > that when threads are more than one a race condition is available during the > execution and due to this condition the defect is hard to be reproduced every > time. In practise it is failing about 3-4 times for 100 runs (based onto my > machine). > {quote} > {{monospaced}} > org.apache.axis2.AxisFault: Error in extracting message properties > at > org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:76) > at org.apache.axis2.engine.Phase.invokeHandler(Phase.java:335) > at org.apache.axis2.engine.Phase.invoke(Phase.java:308) > at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:250) > at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:415) > at > org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:399) > at > org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225) > at > org.apache.axis2.client.OperationClient.execute(OperationClient.java:150) > at > org.apache.axis2.client.ServiceClient.sendRobust(ServiceClient.java:453) > at > org.apache.axis2.client.ServiceClient.sendRobust(ServiceClient.java:434) > at org.apache.rampart.RampartTest$1.run(RampartTest.java:347) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:744) > Caused by: org.apache.rampart.RampartException: Error in extracting message > properties > at > org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:381) > at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61) > at > org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65) > ... 13 more > Caused by: org.apache.axis2.AxisFault: The CLIENT_SIDE parameter is already > locked and the value cannot be overridden. > at > org.apache.axis2.description.AxisDescription.addParameter(AxisDescription.java:104) > at > org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:197) > ... 15 more > org.apache.axis2.AxisFault: Error in extracting message properties > at > org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:76) > at org.apache.axis2.engine.Phase.invokeHandler(Phase.java:335) > at org.apache.axis2.engine.Phase.invoke(Phase.java:308) > at org.apache.axis2.engine.AxisEngine.invoke(AxisEngine.java:250) > at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:415) > at > org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:399) > at > org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:225) > at > org.apache.axis2.client.OperationClient.execute(OperationClient.java:150) > at > org.apache.axis2.client.ServiceClient.sendRobust(ServiceClient.java:453) > at > org.apache.axis2.client.ServiceClient.sendRobust(ServiceClient.java:434) > at org.apache.rampart.RampartTest$1.run(RampartTest.java:347) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:744) > Caused by: org.apache.rampart.RampartException: Error in extracting message > properties > at > org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:381) > at org.apache.rampart.MessageBuilder.build(MessageBuilder.java:61) > at > org.apache.rampart.handler.RampartSender.invoke(RampartSender.java:65) > ... 13 more > Caused by: org.apache.axis2.AxisFault: The CLIENT_SIDE parameter is already > locked and the value cannot be overridden. > at > org.apache.axis2.description.AxisDescription.addParameter(AxisDescription.java:104) > at > org.apache.rampart.RampartMessageData.<init>(RampartMessageData.java:197) > ... 15 more > {{monospaced}} > {quote} > One possible solution is to be used some synchronization mechanism when the > parameter is being locked, I'm attaching a patch which uses "synchronized" > block by static object (I suppose that an another synchronization mechanism > also can be used). I am not sure whether this parameter really should be set > per service and if it is not then a synchronization will not be need because > the parameter will not be created for every call but this can be answered in > the best way by the Rampart developers. > rampart-core > org.apache.rampart.RampartMessageData.java > {code} > ... > if (axisService != null && axisService.getParameter(PARAM_CLIENT_SIDE) != > null) { > this.isInitiator = true; //<---- After the addition of the parameter > the rest of the threads enter here > } else { > this.isInitiator = !msgCtx.isServerSide(); > // TODO if Axis Service is null at this point, do we have to > // create a dummy one ?? > if (this.isInitiator && axisService != null) { > Parameter clientSideParam = new Parameter(); //<---- Two or > more threads enter here because the parameter is still not set > clientSideParam.setName(PARAM_CLIENT_SIDE); > clientSideParam.setLocked(true); //<---- Parameter is being > locked > msgCtx.getAxisService().addParameter(clientSideParam); //<---- > Threads are trying to add the parameter more than once and an exception is > generated > } > } > ... > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: java-dev-unsubscr...@axis.apache.org For additional commands, e-mail: java-dev-h...@axis.apache.org