Derby
  1. Derby
  2. DERBY-5801

Sub-processes should write EMMA coverage data to separate files

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Minor Minor
    • Resolution: Fixed
    • Affects Version/s: 10.10.1.1
    • Fix Version/s: 10.10.1.1
    • Component/s: Test
    • Labels:
      None

      Description

      When generating EMMA coverage reports after running suites.All, I frequently see that coverage.ec is corrupted, and no report is produced. Typical failures look like this:

      java.io.UTFDataFormatException: malformed input around byte 52
      at java.io.DataInputStream.readUTF(DataInputStream.java:656)
      at java.io.DataInputStream.readUTF(DataInputStream.java:564)
      at com.vladium.emma.data.ClassDescriptor.readExternal(ClassDescriptor.java:171)
      at com.vladium.emma.data.MetaData.readExternal(MetaData.java:228)
      at com.vladium.emma.data.DataFactory.readEntry(DataFactory.java:770)
      at com.vladium.emma.data.DataFactory.mergeload(DataFactory.java:461)
      at com.vladium.emma.data.DataFactory.load(DataFactory.java:56)
      at com.vladium.emma.report.ReportProcessor._run(ReportProcessor.java:175)
      at com.vladium.emma.Processor.run(Processor.java:54)
      at com.vladium.emma.report.reportCommand.run(reportCommand.java:130)
      at emma.main(emma.java:40)

      or

      Exception in thread "main" com.vladium.emma.EMMARuntimeException: unexpected failure:
      at com.vladium.emma.Command.exit(Command.java:237)
      at com.vladium.emma.report.reportCommand.run(reportCommand.java:145)
      at emma.main(emma.java:40)
      Caused by: java.lang.OutOfMemoryError: Requested array size exceeds VM limit
      at java.util.HashMap.<init>(HashMap.java:181)
      at java.util.HashMap.<init>(HashMap.java:193)
      at com.vladium.emma.data.MetaData.readExternal(MetaData.java:223)
      at com.vladium.emma.data.DataFactory.readEntry(DataFactory.java:770)
      at com.vladium.emma.data.DataFactory.mergeload(DataFactory.java:461)
      at com.vladium.emma.data.DataFactory.load(DataFactory.java:56)
      at com.vladium.emma.report.ReportProcessor._run(ReportProcessor.java:175)
      at com.vladium.emma.Processor.run(Processor.java:54)
      at com.vladium.emma.report.reportCommand.run(reportCommand.java:130)
      ... 1 more

      I suspect that the problem is that all sub-processes spawned by the main test process write to the same file, sometimes multiple processes running at the same time, and that the file gets corrupted because there's no coordination between the processes when they're writing to it.

      Experiments I have run also indicate that making the sub-processes write to different files helps (I haven't managed to reproduce the corruption yet with that change), so I suggest we make that change.

      1. separate.diff
        1 kB
        Knut Anders Hatlen
      2. d5801-1a.diff
        3 kB
        Knut Anders Hatlen

        Activity

        Hide
        Knut Anders Hatlen added a comment -

        Attached is the patch I used for my experiments. It makes the sub-processes write coverage data to coverage-1.ec, coverage-2.ec, ..., instead of the coverage.ec file written to by the main test process.

        I created the test reports by running EMMA manually on the generated ec files when I ran these experiments, not by using the emma-all or emma-single ant targets. The final patch will have to update those targets as well so that they pick up all the ec files and not just coverage.ec.

        Show
        Knut Anders Hatlen added a comment - Attached is the patch I used for my experiments. It makes the sub-processes write coverage data to coverage-1.ec, coverage-2.ec, ..., instead of the coverage.ec file written to by the main test process. I created the test reports by running EMMA manually on the generated ec files when I ran these experiments, not by using the emma-all or emma-single ant targets. The final patch will have to update those targets as well so that they pick up all the ec files and not just coverage.ec.
        Hide
        Kristian Waagan added a comment -

        I have been looking into adding support for JaCoCo to get code coverage for Derby, and I ended up with the same approach as you are using in your patch. Since it makes sense to run with either EMMA or JaCoCo, the same counter could be used for both tools.
        If I understand the code correctly, the files will be saved in the same directory. This makes it easier to merge or pick them up in the reporting step.

        +1

        Show
        Kristian Waagan added a comment - I have been looking into adding support for JaCoCo to get code coverage for Derby, and I ended up with the same approach as you are using in your patch. Since it makes sense to run with either EMMA or JaCoCo, the same counter could be used for both tools. If I understand the code correctly, the files will be saved in the same directory. This makes it easier to merge or pick them up in the reporting step. +1
        Hide
        Knut Anders Hatlen added a comment -

        Attaching a new patch that adds some comments to the code added in BaseTestCase, and it also updates the emma-report target so that it picks up all of the coverage files.

        Show
        Knut Anders Hatlen added a comment - Attaching a new patch that adds some comments to the code added in BaseTestCase, and it also updates the emma-report target so that it picks up all of the coverage files.
        Hide
        Knut Anders Hatlen added a comment -

        > If I understand the code correctly, the files will be saved in the same directory. This makes it easier to merge or pick them up in the reporting step.

        That's right. The value of the emma.coverage.out.file property is prefixed with the working directory of the parent process. This way we don't have to search the file system for all coverage files, in case tests start sub-processes in a different directory (only the replication tests do that currently).

        Show
        Knut Anders Hatlen added a comment - > If I understand the code correctly, the files will be saved in the same directory. This makes it easier to merge or pick them up in the reporting step. That's right. The value of the emma.coverage.out.file property is prefixed with the working directory of the parent process. This way we don't have to search the file system for all coverage files, in case tests start sub-processes in a different directory (only the replication tests do that currently).
        Hide
        Knut Anders Hatlen added a comment -

        Committed revision 1347667.

        Show
        Knut Anders Hatlen added a comment - Committed revision 1347667.

          People

          • Assignee:
            Knut Anders Hatlen
            Reporter:
            Knut Anders Hatlen
          • Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development