You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@lucene.apache.org by cu...@apache.org on 2004/06/07 18:55:52 UTC

cvs commit: jakarta-lucene/src/java/org/apache/lucene/index TermInfosReader.java

cutting     2004/06/07 09:55:52

  Modified:    .        CHANGES.txt
               src/java/org/apache/lucene/index TermInfosReader.java
  Log:
  Removed synchronization from term lookup.
  
  Revision  Changes    Path
  1.92      +5 -1      jakarta-lucene/CHANGES.txt
  
  Index: CHANGES.txt
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/CHANGES.txt,v
  retrieving revision 1.91
  retrieving revision 1.92
  diff -u -r1.91 -r1.92
  --- CHANGES.txt	30 May 2004 20:24:20 -0000	1.91
  +++ CHANGES.txt	7 Jun 2004 16:55:51 -0000	1.92
  @@ -21,6 +21,10 @@
       UTF-8 and changed the build encoding to UTF-8, to make changed files
       compile. (Otis Gospodnetic)
   
  + 5. Removed synchronization from term lookup under IndexReader methods
  +    termFreq(), termDocs() or termPositions() to improve
  +    multi-threaded performance.  (cutting)
  +
   
   1.4 RC3
   
  
  
  
  1.7       +35 -23    jakarta-lucene/src/java/org/apache/lucene/index/TermInfosReader.java
  
  Index: TermInfosReader.java
  ===================================================================
  RCS file: /home/cvs/jakarta-lucene/src/java/org/apache/lucene/index/TermInfosReader.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TermInfosReader.java	20 May 2004 11:23:53 -0000	1.6
  +++ TermInfosReader.java	7 Jun 2004 16:55:52 -0000	1.7
  @@ -29,7 +29,8 @@
     private String segment;
     private FieldInfos fieldInfos;
   
  -  private SegmentTermEnum enumerator;
  +  private ThreadLocal enumerators = new ThreadLocal();
  +  private SegmentTermEnum origEnum;
     private long size;
   
     TermInfosReader(Directory dir, String seg, FieldInfos fis)
  @@ -38,19 +39,19 @@
       segment = seg;
       fieldInfos = fis;
   
  -    enumerator = new SegmentTermEnum(directory.openFile(segment + ".tis"),
  -			       fieldInfos, false);
  -    size = enumerator.size;
  +    origEnum = new SegmentTermEnum(directory.openFile(segment + ".tis"),
  +                                   fieldInfos, false);
  +    size = origEnum.size;
       readIndex();
     }
   
     public int getSkipInterval() {
  -    return enumerator.skipInterval;
  +    return origEnum.skipInterval;
     }
   
     final void close() throws IOException {
  -    if (enumerator != null)
  -      enumerator.close();
  +    if (origEnum != null)
  +      origEnum.close();
     }
   
     /** Returns the number of term/value pairs in the set. */
  @@ -58,6 +59,15 @@
       return size;
     }
   
  +  private SegmentTermEnum getEnum() {
  +    SegmentTermEnum enum = (SegmentTermEnum)enumerators.get();
  +    if (enum == null) {
  +      enum = terms();
  +      enumerators.set(enum);
  +    }
  +    return enum;
  +  }
  +
     Term[] indexTerms = null;
     TermInfo[] indexInfos;
     long[] indexPointers;
  @@ -102,16 +112,17 @@
     }
   
     private final void seekEnum(int indexOffset) throws IOException {
  -    enumerator.seek(indexPointers[indexOffset],
  -	      (indexOffset * enumerator.indexInterval) - 1,
  +    getEnum().seek(indexPointers[indexOffset],
  +	      (indexOffset * getEnum().indexInterval) - 1,
   	      indexTerms[indexOffset], indexInfos[indexOffset]);
     }
   
     /** Returns the TermInfo for a Term in the set, or null. */
  -  final synchronized TermInfo get(Term term) throws IOException {
  +  TermInfo get(Term term) throws IOException {
       if (size == 0) return null;
   
  -    // optimize sequential access: first try scanning cached enumerator w/o seeking
  +    // optimize sequential access: first try scanning cached enum w/o seeking
  +    SegmentTermEnum enumerator = getEnum();
       if (enumerator.term() != null                 // term is at or past current
   	&& ((enumerator.prev != null && term.compareTo(enumerator.prev) > 0)
   	    || term.compareTo(enumerator.term()) >= 0)) {
  @@ -128,6 +139,7 @@
   
     /** Scans within block for matching term. */
     private final TermInfo scanEnum(Term term) throws IOException {
  +    SegmentTermEnum enumerator = getEnum();
       while (term.compareTo(enumerator.term()) > 0 && enumerator.next()) {}
       if (enumerator.term() != null && term.compareTo(enumerator.term()) == 0)
         return enumerator.termInfo();
  @@ -136,10 +148,12 @@
     }
   
     /** Returns the nth term in the set. */
  -  final synchronized Term get(int position) throws IOException {
  +  final Term get(int position) throws IOException {
       if (size == 0) return null;
   
  -    if (enumerator != null && enumerator.term() != null && position >= enumerator.position &&
  +    SegmentTermEnum enumerator = getEnum();
  +    if (enumerator != null && enumerator.term() != null &&
  +        position >= enumerator.position &&
   	position < (enumerator.position + enumerator.indexInterval))
         return scanEnum(position);		  // can avoid seek
   
  @@ -148,6 +162,7 @@
     }
   
     private final Term scanEnum(int position) throws IOException {
  +    SegmentTermEnum enumerator = getEnum();
       while(enumerator.position < position)
         if (!enumerator.next())
   	return null;
  @@ -156,12 +171,13 @@
     }
   
     /** Returns the position of a Term in the set or -1. */
  -  final synchronized long getPosition(Term term) throws IOException {
  +  final long getPosition(Term term) throws IOException {
       if (size == 0) return -1;
   
       int indexOffset = getIndexOffset(term);
       seekEnum(indexOffset);
   
  +    SegmentTermEnum enumerator = getEnum();
       while(term.compareTo(enumerator.term()) > 0 && enumerator.next()) {}
   
       if (term.compareTo(enumerator.term()) == 0)
  @@ -171,17 +187,13 @@
     }
   
     /** Returns an enumeration of all the Terms and TermInfos in the set. */
  -  final synchronized SegmentTermEnum terms() throws IOException {
  -    if (enumerator.position != -1)			  // if not at start
  -      seekEnum(0);				  // reset to start
  -    return (SegmentTermEnum)enumerator.clone();
  +  public SegmentTermEnum terms() {
  +    return (SegmentTermEnum)origEnum.clone();
     }
   
     /** Returns an enumeration of terms starting at or after the named term. */
  -  final synchronized SegmentTermEnum terms(Term term) throws IOException {
  -    get(term);					  // seek enumerator to term
  -    return (SegmentTermEnum)enumerator.clone();
  +  public SegmentTermEnum terms(Term term) throws IOException {
  +    get(term);
  +    return (SegmentTermEnum)getEnum().clone();
     }
  -
  -
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: lucene-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: lucene-dev-help@jakarta.apache.org