datacleaner / DataCleaner

The premier open source Data Quality solution
GNU Lesser General Public License v3.0
598 stars 181 forks source link

ConcurrentModificationException when trying to close a job with an output data stream #1777

Closed arjansh closed 6 years ago

arjansh commented 6 years ago

When I have a job with an output data stream (but not just any job with an output data stream in it will do), and I try to close it, I can't close it and I get a ConcurrentModificationException like this:


Unexpected error!

Message:
    java.util.ConcurrentModificationException
Level:
    SEVERE
Stack Trace:
null
    java.util.ArrayList$Itr.checkForComodification(Unknown Source)
    java.util.ArrayList$Itr.next(Unknown Source)
    java.util.Collections$UnmodifiableCollection$1.next(Unknown Source)
    org.datacleaner.job.builder.AbstractComponentBuilder.updateStream(AbstractComponentBuilder.java:1048)
    org.datacleaner.job.builder.AbstractComponentBuilder.getOutputDataStreams(AbstractComponentBuilder.java:995)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.getOutputDataStreams(AnalyzerComponentBuilder.java:438)
    org.datacleaner.widgets.visualization.JobGraphNodeBuilder.addNodes(JobGraphNodeBuilder.java:323)
    org.datacleaner.widgets.visualization.JobGraphNodeBuilder.buildGraphInternal(JobGraphNodeBuilder.java:105)
    org.datacleaner.widgets.visualization.JobGraphNodeBuilder.buildGraphInternal(JobGraphNodeBuilder.java:85)
    org.datacleaner.widgets.visualization.JobGraphNodeBuilder.buildGraph(JobGraphNodeBuilder.java:78)
    org.datacleaner.widgets.visualization.JobGraph.refresh(JobGraph.java:145)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl$WindowAnalyzerChangeListener.onConfigurationChanged(AnalysisJobBuilderWindowImpl.java:175)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl$WindowAnalyzerChangeListener.onConfigurationChanged(AnalysisJobBuilderWindowImpl.java:1)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.onConfigurationChanged(AnalyzerComponentBuilder.java:416)
    org.datacleaner.job.builder.AbstractComponentBuilder.setConfiguredProperty(AbstractComponentBuilder.java:333)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.setConfiguredProperty(AnalyzerComponentBuilder.java:398)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.setConfiguredProperty(AnalyzerComponentBuilder.java:58)
    org.datacleaner.job.builder.AbstractComponentBuilder.removeInputColumn(AbstractComponentBuilder.java:696)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.removeInputColumn(AnalyzerComponentBuilder.java:262)
    org.datacleaner.job.builder.AnalyzerComponentBuilder.removeInputColumn(AnalyzerComponentBuilder.java:58)
    org.datacleaner.job.builder.ComponentBuilderTransformerChangeListener.synchronizeInputColumns(ComponentBuilderTransformerChangeListener.java:80)
    org.datacleaner.job.builder.ComponentBuilderTransformerChangeListener.onConfigurationChanged(ComponentBuilderTransformerChangeListener.java:47)
    org.datacleaner.job.builder.ComponentBuilderTransformerChangeListener.onConfigurationChanged(ComponentBuilderTransformerChangeListener.java:30)
    org.datacleaner.job.builder.TransformerComponentBuilder.onConfigurationChanged(TransformerComponentBuilder.java:279)
    org.datacleaner.job.builder.AbstractComponentBuilder.setConfiguredProperty(AbstractComponentBuilder.java:333)
    org.datacleaner.job.builder.AbstractComponentBuilder.clearInputColumns(AbstractComponentBuilder.java:537)
    org.datacleaner.job.builder.AnalysisJobBuilder.removeAllSourceColumns(AnalysisJobBuilder.java:1204)
    org.datacleaner.job.builder.AnalysisJobBuilder.reset(AnalysisJobBuilder.java:1194)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl.setDatastore(AnalysisJobBuilderWindowImpl.java:460)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl.setDatastore(AnalysisJobBuilderWindowImpl.java:433)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl.resetJob(AnalysisJobBuilderWindowImpl.java:707)
    org.datacleaner.windows.AnalysisJobBuilderWindowImpl.onWindowClosing(AnalysisJobBuilderWindowImpl.java:642)
    org.datacleaner.windows.AbstractWindow.windowClosing(AbstractWindow.java:168)
    java.awt.Window.processWindowEvent(Unknown Source)
    javax.swing.JFrame.processWindowEvent(Unknown Source)
    java.awt.Window.processEvent(Unknown Source)
    java.awt.Component.dispatchEventImpl(Unknown Source)
    java.awt.Container.dispatchEventImpl(Unknown Source)
    java.awt.Window.dispatchEventImpl(Unknown Source)
    java.awt.Component.dispatchEvent(Unknown Source)
    java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    java.awt.EventQueue.access$500(Unknown Source)
    java.awt.EventQueue$3.run(Unknown Source)
    java.awt.EventQueue$3.run(Unknown Source)
    java.security.AccessController.doPrivileged(Native Method)
    java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    java.awt.EventQueue$4.run(Unknown Source)
    java.awt.EventQueue$4.run(Unknown Source)
    java.security.AccessController.doPrivileged(Native Method)
    java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
    java.awt.EventQueue.dispatchEvent(Unknown Source)
    java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    java.awt.EventDispatchThread.run(Unknown Source)
arjansh commented 6 years ago

The attached zip contains a simple job with which you (at least I) can consistently reproduce this issue.

test.analysis.xml.zip