
[ http://jira.qos.ch/browse/LBCLASSIC-51?page=com.atlassian.jira.plugin.system... ] Joern Huxhorn commented on LBCLASSIC-51: ---------------------------------------- Please consider fixing this problem before releasing the next logback version. We had to remove the jmx configurator from our app and would really like to use it in production. Thanks, Joern.
Use of BasicStatusManager.iterator() without synchronization in ch.qos.logback.classic.jmx.Configurator -------------------------------------------------------------------------------------------------------
Key: LBCLASSIC-51 URL: http://jira.qos.ch/browse/LBCLASSIC-51 Project: logback-classic Issue Type: Bug Components: Other Affects Versions: unspecified Environment: Operating System: Windows Platform: PC Reporter: Joern Huxhorn Assignee: Logback dev list
We sometimes receive strange exceptions in our webapp: [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: Exception in thread "Thread-6" java.lang.ArrayIndexOutOfBoundsException [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at java.lang.System.arraycopy(Native Method) [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at java.util.ArrayList.ensureCapacity(ArrayList.java:170) [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at java.util.ArrayList.add(ArrayList.java:351) [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at ch.qos.logback.core.BasicStatusManager.add(BasicStatusManager.java:38) [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at ch.qos.logback.core.spi.ContextAwareBase.addStatus(ContextAwareBase.java:59) [21/Apr/2008:21:00:58] warning ( 1596): CORE3283: stderr: at ch.qos.logback.core.spi.ContextAwareBase.addInfo(ContextAwareBase.java:64) I just tried to analyze the problem and found out that ch.qos.logback.classic.jmx.Configurator is simply using the iterator of the status manager without synchronizing, as it's documented in BasicStatusManager. So instead of public List<String> getStatuses() { List<String> list = new ArrayList<String>(); Iterator<Status> it = context.getStatusManager().iterator(); while(it.hasNext()) { list.add(it.next().toString()); } return list; } it should probably be public List<String> getStatuses() { List<String> list = new ArrayList<String>(); StatusManager sm = context.getStatusManager(); Iterator<Status> it = sm.iterator(); synchronized(sm) { while(it.hasNext()) { list.add(it.next().toString()); } } return list; }
-- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://jira.qos.ch/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira