Hi Jennifer, Could you reproduce it on your side by doing the same kind of systems tests again? If you could then I'd be very happy if you could try a patched version that we have been working on and see if that fixes the issue.
Cheers, Tobias On Tue, May 17, 2011 at 2:49 AM, Jennifer Hickey <[email protected]> wrote: > Hi Tobias, > Unfortunately I don't have an isolated test case, as I was doing a fairly > involved system test at the time. I may be able to have a colleague work on > reproducing it at a later date (I've been diverted to something else for the > moment). > > I was remote debugging with Eclipse, so I toggled a method breakpoint on > Thread.interrupt() and then inspected the stack once the breakpoint was hit. > > Sorry I don't have more information at the moment. I agree that > eliminating the interrupts sounds like the best approach, if possible. > > Thanks, > Jennifer > ________________________________________ > From: [email protected] [[email protected]] On > Behalf Of Tobias Ivarsson [[email protected]] > Sent: Thursday, April 28, 2011 6:23 AM > To: Neo4j user discussions > Subject: Re: [Neo4j] ClosedChannelExceptions in highly concurrent > environment > > Hi Jennifer, > > I'd first like to thank you for the testing and analysis you've done. Very > useful stuff. Do you think you could send some test code our way that > reproduces this issue? > > This is actually the first time this issue has been reported, so I wouldn't > say it is a common issue. My guess is that your thread volume triggered a > rare condition that wouldn't be encountered otherwise. > > I'm also curious to know how you found the source of the interruptions. > When > I debug thread interruptions I've never been able to find out where the > thread got interrupted from without doing tedious procedures of breakpoint > + > logging + trying to match thread ids. If you have a better method for doing > that I'd very much like to know. > > I think we should focus the effort on fixing the interruption issue if we > can. And I believe we would be able to do that if the interruptions do in > fact originate from where you say they do. But the suggestion of being able > to switch the lucene directory implementation is still interesting, but as > you point out since it has issues on some platforms it would be better if > we > could be rid of the interruption issue. > > Cheers, > Tobias > > On Thu, Apr 28, 2011 at 12:41 AM, Jennifer Hickey <[email protected] > >wrote: > > > Hello, > > I've been running some tests w/approx 400 threads reading various indexed > > property values. I'm running on 64 bit Linux. I was frequently seeing > the > > ClosedChannelException below. The javadoc on Lucene's NIOFSDirectory > states > > that "Accessing this class either directly or indirectly from a thread > while > > it's interrupted can close the underlying file descriptor immediately if > at > > the same time the thread is blocked on IO. The file descriptor will > remain > > closed and subsequent access to {@link NIOFSDirectory} will throw a > {@link > > ClosedChannelException}. If your application uses either {@link > > Thread#interrupt()} or {@link Future#cancel(boolean)} you should use > {@link > > SimpleFSDirectory} in favor of {@link NIOFSDirectory}." > > > > A bit of debugging revealed that the Thread.interrupts were coming from > > Neo4j, specifically in RWLock and MappedPersistenceWindow. So it seems > like > > this would be a common problem, though perhaps I am missing something? > > > > SimpleFSDirectory seems a bit of a performance bottleneck, so I switched > to > > MMapDirectory and the problem did go away. I didn't see a way to switch > > implementations w/out modifying neo4j code, so I changed LuceneDataSource > as > > follows: > > > > static Directory getDirectory( String storeDir, > > IndexIdentifier identifier ) throws IOException > > { > > MMapDirectory dir=new MMapDirectory(getFileDirectory( storeDir, > > identifier), null); > > if(MMapDirectory.UNMAP_SUPPORTED) { > > dir.setUseUnmap(true); > > } > > return dir; > > } > > > > So I'm wondering if others have seen this problem and/or if there is a > > recommended solution? Our product runs on quite a few different > operating > > systems, so I have some reservations about using MMapDirectory as well > > (javadoc speaks of a few caveats on Windows, 64 vs 32, etc). Also, I'd > > rather not maintain a patched version of the neo4j code if avoidable. > > > > Thanks! > > Jennifer > > > > Exception: > > Caused by: java.nio.channels.ClosedChannelException > > at sun.nio.ch.FileChannelImpl.ensureOpen(FileChannelImpl.java:88) > > at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:613) > > at > > > org.apache.lucene.store.NIOFSDirectory$NIOFSIndexInput.readInternal(NIOFSDirectory.java:161) > > at > > > org.apache.lucene.store.BufferedIndexInput.readBytes(BufferedIndexInput.java:139) > > at > > > org.apache.lucene.index.CompoundFileReader$CSIndexInput.readInternal(CompoundFileReader.java:285) > > at > > > org.apache.lucene.store.BufferedIndexInput.refill(BufferedIndexInput.java:160) > > at > > > org.apache.lucene.store.BufferedIndexInput.readByte(BufferedIndexInput.java:39) > > at org.apache.lucene.store.DataInput.readVInt(DataInput.java:86) > > at > > > org.apache.lucene.index.codecs.DeltaBytesReader.read(DeltaBytesReader.java:40) > > at > > > org.apache.lucene.index.codecs.PrefixCodedTermsReader$FieldReader$SegmentTermsEnum.next(PrefixCodedTermsReader.java:469) > > at > > > org.apache.lucene.index.codecs.PrefixCodedTermsReader$FieldReader$SegmentTermsEnum.seek(PrefixCodedTermsReader.java:385) > > at org.apache.lucene.index.TermsEnum.seek(TermsEnum.java:68) > > at org.apache.lucene.index.Terms.docFreq(Terms.java:53) > > at org.apache.lucene.index.SegmentReader.docFreq(SegmentReader.java:898) > > at org.apache.lucene.index.IndexReader.docFreq(IndexReader.java:882) > > at > > org.apache.lucene.index.DirectoryReader.docFreq(DirectoryReader.java:687) > > > > > > _______________________________________________ > > Neo4j mailing list > > [email protected] > > https://lists.neo4j.org/mailman/listinfo/user > > > > > > -- > Tobias Ivarsson <[email protected]> > Hacker, Neo Technology > www.neotechnology.com > Cellphone: +46 706 534857 > _______________________________________________ > Neo4j mailing list > [email protected] > https://lists.neo4j.org/mailman/listinfo/user > _______________________________________________ > Neo4j mailing list > [email protected] > https://lists.neo4j.org/mailman/listinfo/user > -- Tobias Ivarsson <[email protected]> Hacker, Neo Technology www.neotechnology.com Cellphone: +46 706 534857 _______________________________________________ Neo4j mailing list [email protected] https://lists.neo4j.org/mailman/listinfo/user

