[
https://issues.apache.org/jira/browse/LOG4J2-1990?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16102837#comment-16102837
]
Remko Popma commented on LOG4J2-1990:
-------------------------------------
Users should not need to do anything special. They should be able to log Maps
and Collections without seeing a ConcurrentModificationException.
However, if an application has a bug, and one application thread is modifying
the map while a different thread is iterating over it, then you will see this
exception. You may see it while logging, or elsewhere when iterating over it.
(Wrapping it will not help. Even synchronizing on it will not help if the other
thread doesn't also synchronize on it before modifying the map.)
TLDR: Log4j2 cannot defend your application against concurrency bugs.
LOG4J2-1988 (while appearing similar because of the exception) is a different
issue where asynchronous logging somehow failed to take a snapshot of the map
before handing it off to the background thread. That one smells like a Log4j2
bug to me.
This ticket seems to point to a concurrency bug in the application, not in
Log4j2.
> ConcurrentModificationException logging a parameter of type Map
> ----------------------------------------------------------------
>
> Key: LOG4J2-1990
> URL: https://issues.apache.org/jira/browse/LOG4J2-1990
> Project: Log4j 2
> Issue Type: Bug
> Components: Core
> Affects Versions: 2.8.2
> Reporter: Philippe Mouawad
> Attachments: LOG4J2-1990.patch
>
>
> Hello,
> Working with current JMeter trunk and:
> * attached test plan
> * org.apache.jmeter.protocol.http.control.CacheManager level set to debug in
> log4j2.xml in bin folder
> I get:
> {code:none}
> java.util.concurrent.ExecutionException:
> java.util.ConcurrentModificationException
> at java.util.concurrent.FutureTask.report(FutureTask.java:122)
> ~[?:1.8.0_121]
> at java.util.concurrent.FutureTask.get(FutureTask.java:192)
> ~[?:1.8.0_121]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.downloadPageResources(HTTPSamplerBase.java:1349)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.resultProcessing(HTTPSamplerBase.java:1657)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPAbstractImpl.resultProcessing(HTTPAbstractImpl.java:519)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:534)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1189)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1178)
> [ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.threads.JMeterThread.executeSamplePackage(JMeterThread.java:500)
> [ApacheJMeter_core.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.threads.JMeterThread.processSampler(JMeterThread.java:425)
> [ApacheJMeter_core.jar:3.3-SNAPSHOT.20170724]
> at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:254)
> [ApacheJMeter_core.jar:3.3-SNAPSHOT.20170724]
> at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
> Caused by: java.util.ConcurrentModificationException
> at
> org.apache.commons.collections.map.AbstractLinkedMap$LinkIterator.nextEntry(AbstractLinkedMap.java:560)
> ~[commons-collections-3.2.2.jar:3.2.2]
> at
> org.apache.commons.collections.map.AbstractLinkedMap$EntrySetIterator.next(AbstractLinkedMap.java:428)
> ~[commons-collections-3.2.2.jar:3.2.2]
> at
> org.apache.logging.log4j.message.ParameterFormatter.appendMap(ParameterFormatter.java:569)
> ~[log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.message.ParameterFormatter.appendPotentiallyRecursiveValue(ParameterFormatter.java:505)
> ~[log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToString(ParameterFormatter.java:432)
> ~[log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.message.ParameterFormatter.formatMessage2(ParameterFormatter.java:189)
> ~[log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.message.ReusableParameterizedMessage.formatTo(ReusableParameterizedMessage.java:313)
> ~[log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.core.impl.MutableLogEvent.setMessage(MutableLogEvent.java:214)
> ~[log4j-core-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.core.impl.ReusableLogEventFactory.createEvent(ReusableLogEventFactory.java:81)
> ~[log4j-core-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.core.config.LoggerConfig.log(LoggerConfig.java:401)
> [log4j-core-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.core.config.AwaitCompletionReliabilityStrategy.log(AwaitCompletionReliabilityStrategy.java:63)
> [log4j-core-2.8.2.jar:2.8.2]
> at org.apache.logging.log4j.core.Logger.logMessage(Logger.java:146)
> [log4j-core-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(AbstractLogger.java:2091)
> [log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger.java:2005)
> [log4j-api-2.8.2.jar:2.8.2]
> at
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogger.java:1876)
> [log4j-api-2.8.2.jar:2.8.2]
> at org.apache.logging.slf4j.Log4jLogger.debug(Log4jLogger.java:124)
> [log4j-slf4j-impl-2.8.2.jar:2.8.2]
> at
> org.apache.jmeter.protocol.http.control.CacheManager.getEntry(CacheManager.java:501)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.control.CacheManager.inCache(CacheManager.java:431)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:443)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:74)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase$ASyncSample.call(HTTPSamplerBase.java:2031)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at
> org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase$ASyncSample.call(HTTPSamplerBase.java:1)
> ~[ApacheJMeter_http.jar:3.3-SNAPSHOT.20170724]
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> ~[?:1.8.0_121]
> at
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
> ~[?:1.8.0_121]
> at java.util.concurrent.FutureTask.run(FutureTask.java:266)
> ~[?:1.8.0_121]
> at
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
> ~[?:1.8.0_121]
> at
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
> ~[?:1.8.0_121]
> ... 1 more
> {code}
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)