[tor-bugs] #20335 [Metrics/CollecTor]: ReferenceChecker causes OOM

Tor Bug Tracker & Wiki blackhole at torproject.org
Tue Oct 18 18:09:39 UTC 2016


#20335: ReferenceChecker causes OOM
-------------------------------+---------------------
 Reporter:  iwakeh             |          Owner:
     Type:  defect             |         Status:  new
 Priority:  High               |      Milestone:
Component:  Metrics/CollecTor  |        Version:
 Severity:  Normal             |     Resolution:
 Keywords:                     |  Actual Points:
Parent ID:                     |         Points:
 Reviewer:                     |        Sponsor:
-------------------------------+---------------------

Comment (by karsten):

 Yes, metrics-lib is to blame.  Here's a small class I wrote to show that:

 {{{
 package oom;

 import org.torproject.descriptor.DescriptorReader;
 import org.torproject.descriptor.DescriptorSourceFactory;

 import java.io.File;

 public class Main {
   public static void main(String[] args) {
     DescriptorReader descriptorReader =
         DescriptorSourceFactory.createDescriptorReader();
     descriptorReader.addDirectory(new File("in"));
     descriptorReader.readDescriptors();
   }
 }
 }}}

 And here's the output, once with the default heap size and once with 8G:

 {{{
 $ javac -d bin/ -cp lib/descriptor-1.4.0.jar src/oom/Main.java && java -cp
 bin/:lib/descriptor-1.4.0.jar:lib/slf4j-api-1.7.7.jar:lib/logback-
 classic-1.1.2.jar:lib/logback-core-1.1.2.jar:lib/commons-compress-1.9.jar
 oom.Main
 19:53:31.906 [Thread-0] ERROR o.t.d.impl.DescriptorReaderImpl - Bug:
 uncaught exception or error while reading descriptors: Java heap space
 java.lang.OutOfMemoryError: Java heap space
         at java.util.Arrays.copyOf(Arrays.java:3236) ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:118)
 ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
 ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
 ~[na:1.8.0_102]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.readFile(DescriptorReaderImpl.java:378)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.readDescriptors(DescriptorReaderImpl.java:284)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.run(DescriptorReaderImpl.java:188)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]
 $ javac -d bin/ -cp lib/descriptor-1.4.0.jar src/oom/Main.java && java
 -Xmx8g -cp bin/:lib/descriptor-1.4.0.jar:lib/slf4j-api-1.7.7.jar:lib
 /logback-classic-1.1.2.jar:lib/logback-core-1.1.2.jar:lib/commons-
 compress-1.9.jar oom.Main
 19:54:02.620 [Thread-0] ERROR o.t.d.impl.DescriptorReaderImpl - Bug:
 uncaught exception or error while reading descriptors: null
 java.lang.OutOfMemoryError: null
         at
 java.io.ByteArrayOutputStream.hugeCapacity(ByteArrayOutputStream.java:123)
 ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:117)
 ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93)
 ~[na:1.8.0_102]
         at
 java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:153)
 ~[na:1.8.0_102]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.readFile(DescriptorReaderImpl.java:378)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.readDescriptors(DescriptorReaderImpl.java:284)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at
 org.torproject.descriptor.impl.DescriptorReaderImpl$DescriptorReaderRunnable.run(DescriptorReaderImpl.java:188)
 ~[descriptor-1.4.0.jar:1.4.0-adf4a67]
         at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]
 }}}

 I can't think of a clean way to avoid this problem other than keeping
 votes in the `recent/` folder in separate files.  Seriously, I didn't
 think of this error case at all.  Wow.

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/20335#comment:12>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list