FieldsReader Thread Safety
--------------------------
Key: LUCENE-1033
URL: https://issues.apache.org/jira/browse/LUCENE-1033
Project: Lucene - Java
Issue Type: Bug
Components: Search
Affects Versions: 2.2
Environment: Java SDK 1.5.X, Linux & FreeBSD
Reporter: Michael Klatt
Priority: Minor
>From what I've read, the IndexSearcher is supposed to be thread safe.
>However, I don't think that the FieldsReader class (used by the IndexReader,
>and in turn used by the IndexSearcher) is thread safe. I have one
>IndexSearcher that I use with all my threads, and what appears to happen in
>Lucene 2.2 is that the same FieldsReader object is shared by all threads. The
>private "fieldStream" and "indexStream" attributes both have file pointers
>which makes them not thread-safe.
For instance, in the "doc" method of FieldsReader:
fieldsStream.seek(position);
Document doc = new Document();
int numFields = fieldsStream.readVInt();
for (int i = 0; i < numFields; i++) {
int fieldNumber = fieldsStream.readVInt();
FieldInfo fi = fieldInfos.fieldInfo(fieldNumber);
FieldSelectorResult acceptField = fieldSelector == null ?
FieldSelectorResult.LOAD : fieldSelector.accept(fi.name);
Another thread can seek to another position, so the readVInt calls are reading
the wrong location in the stream. This is a race condition and only shows up
when a lot of document field data is being read. When I synchronized the doc
method, the problem went away. Another solution would be to use separate
IndexSearchers, or to clone the FIeldsReader for each thread (I have not
investigated either solution).
I encountered this on Lucene 2.2, but I think the problem is still in the
trunk. I was making a modification to the source code which caused the problem
to be exaggerated, otherwise I probably wouldn't have discovered it.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]