uq-eresearch / aorra

Automated Online Reef Reporting Application (AORRA)
http://www.uq.edu.au/uqresearchers/researcher/hunterj1.html?uv_category=prj&prj=4757713
Other
2 stars 1 forks source link

super-csv does not seem to be thread-safe #157

Closed agebe closed 10 years ago

agebe commented 10 years ago

since the change 816eb68db0201193ae124ebaf79fc5edb29f7bd0 (fetch csv instead of lazy fetch) I have seen the following and similar exceptions on development.

It seems that super-csv is not thread-safe.

2014-03-04 11:11:09,103 - DEBUG - [application-akka.actor.default-dispatcher-4] - application - while fetching csv for CHLOROPHYLL_A - GBR - {} java.lang.ArrayIndexOutOfBoundsException: null
        at java.lang.System.arraycopy(Native Method) ~[na:1.7.0_25]
        at java.lang.AbstractStringBuilder.delete(AbstractStringBuilder.java:701) ~[na:1.7.0_25]
        at java.lang.StringBuilder.delete(StringBuilder.java:250) ~[na:1.7.0_25]
        at org.supercsv.encoder.DefaultCsvEncoder.encode(DefaultCsvEncoder.java:42) ~[super-csv-2.1.0.jar:na]
        at org.supercsv.io.AbstractCsvWriter.escapeString(AbstractCsvWriter.java:102) ~[super-csv-2.1.0.jar:na]
        at org.supercsv.io.AbstractCsvWriter.writeRow(AbstractCsvWriter.java:196) ~[super-csv-2.1.0.jar:na]
        at org.supercsv.io.AbstractCsvWriter.writeRow(AbstractCsvWriter.java:146) ~[super-csv-2.1.0.jar:na]
        at org.supercsv.io.CsvListWriter.write(CsvListWriter.java:71) ~[super-csv-2.1.0.jar:na]
        at charts.builder.spreadsheet.MarineBarChartBuilder.getCsv(MarineBarChartBuilder.java:86) ~[classes/:na]
        at charts.builder.spreadsheet.JFreeBuilder.fetchCsv(JFreeBuilder.java:73) ~[classes/:na]
        at charts.builder.spreadsheet.JFreeBuilder.build(JFreeBuilder.java:52) ~[classes/:na]
        at charts.builder.spreadsheet.AbstractBuilder.build(AbstractBuilder.java:134) ~[classes/:na]
        at charts.builder.spreadsheet.AbstractBuilder.build(AbstractBuilder.java:107) ~[classes/:na]
        at charts.builder.DefaultChartBuilder.getCharts(DefaultChartBuilder.java:46) ~[classes/:na]
        at charts.builder.DefaultChartBuilder.getCharts(DefaultChartBuilder.java:36) ~[classes/:na]
        at charts.builder.ChartCacheImpl.actuallyGetCharts(ChartCacheImpl.java:101) ~[classes/:na]
        at charts.builder.ChartCacheImpl.access$000(ChartCacheImpl.java:26) ~[classes/:na]
        at charts.builder.ChartCacheImpl$4.apply(ChartCacheImpl.java:118) ~[classes/:na]
        at charts.builder.ChartCacheImpl$4.apply(ChartCacheImpl.java:113) ~[classes/:na]
        at play.core.j.FPromiseHelper$$anonfun$promise$2.apply(FPromiseHelper.scala:34) ~[play_2.10.jar:2.2.1]
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.liftedTree1$1(Future.scala:24) ~[scala-library.jar:na]
        at scala.concurrent.impl.Future$PromiseCompletingRunnable.run(Future.scala:24) ~[scala-library.jar:na]
        at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42) ~[akka-actor_2.10.jar:2.2.0]
        at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386) ~[akka-actor_2.10.jar:2.2.0]
        at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260) ~[scala-library.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339) ~[scala-library.jar:na]
        at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979) ~[scala-library.jar:na]
        at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107) ~[scala-library.jar:na]
agebe commented 10 years ago

a workaround for this issue is 0a3c0501af7f006f810b6d9336730d54b403a366 because it serializes requests to new (not in cache) charts from the same spreadsheet which happens because the client seems to request the charts for different formats (csv, emf, png and svg) simultaneously.

It is not a fix though, the workaround just makes it less likely to happen.

agebe commented 10 years ago

added test case in 855edf92559b3849726e0f58222631d700f9de09