You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by jp...@apache.org on 2016/10/11 06:34:09 UTC

lucene-solr:master: LUCENE-7487: Remove unnecessary synchronization from Lucene70NormsProducer.

Repository: lucene-solr
Updated Branches:
  refs/heads/master d69412bc6 -> 63ef45902


LUCENE-7487: Remove unnecessary synchronization from Lucene70NormsProducer.


Project: http://git-wip-us.apache.org/repos/asf/lucene-solr/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucene-solr/commit/63ef4590
Tree: http://git-wip-us.apache.org/repos/asf/lucene-solr/tree/63ef4590
Diff: http://git-wip-us.apache.org/repos/asf/lucene-solr/diff/63ef4590

Branch: refs/heads/master
Commit: 63ef459022fd91d609a85c990421d85b7b956197
Parents: d69412b
Author: Adrien Grand <jp...@gmail.com>
Authored: Tue Oct 11 08:30:54 2016 +0200
Committer: Adrien Grand <jp...@gmail.com>
Committed: Tue Oct 11 08:31:29 2016 +0200

----------------------------------------------------------------------
 .../codecs/lucene70/Lucene70NormsProducer.java  |  10 +-
 .../lucene/index/BaseNormsFormatTestCase.java   | 114 ++++++++++++++++---
 2 files changed, 98 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63ef4590/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
----------------------------------------------------------------------
diff --git a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
index ee96c15..79c185c 100644
--- a/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
+++ b/lucene/core/src/java/org/apache/lucene/codecs/lucene70/Lucene70NormsProducer.java
@@ -166,10 +166,7 @@ final class Lucene70NormsProducer extends NormsProducer {
     } else {
       // sparse
       final LongValues normValues = getNormValues(entry);
-      final SparseDISI disi;
-      synchronized (data) {
-        disi = new SparseDISI(maxDoc, data, entry.docsWithFieldOffset, entry.numDocsWithField);
-      }
+      final SparseDISI disi = new SparseDISI(maxDoc, data, entry.docsWithFieldOffset, entry.numDocsWithField);
       return new NumericDocValues() {
 
         @Override
@@ -209,10 +206,7 @@ final class Lucene70NormsProducer extends NormsProducer {
         }
       };
     } else {
-      RandomAccessInput slice;
-      synchronized (data) {
-        slice = data.randomAccessSlice(entry.normsOffset, entry.numDocsWithField * (long) entry.bytesPerNorm);
-      }
+      final RandomAccessInput slice = data.randomAccessSlice(entry.normsOffset, entry.numDocsWithField * (long) entry.bytesPerNorm);
       switch (entry.bytesPerNorm) {
         case 1:
           return new LongValues() {

http://git-wip-us.apache.org/repos/asf/lucene-solr/blob/63ef4590/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
----------------------------------------------------------------------
diff --git a/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java b/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
index 9ca13dd..64e99da 100644
--- a/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
+++ b/lucene/test-framework/src/java/org/apache/lucene/index/BaseNormsFormatTestCase.java
@@ -20,6 +20,7 @@ import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
+import java.util.concurrent.CountDownLatch;
 
 import org.apache.lucene.analysis.Analyzer;
 import org.apache.lucene.analysis.MockAnalyzer;
@@ -488,25 +489,21 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
     
     // compare
     DirectoryReader ir = DirectoryReader.open(dir);
-    for (LeafReaderContext context : ir.leaves()) {
-      LeafReader r = context.reader();
-      NumericDocValues expected = r.getNumericDocValues("dv");
-      NumericDocValues actual = r.getNormValues("indexed");
-      assertEquals(expected == null, actual == null);
-      if (expected != null) {
-        for (int d = expected.nextDoc(); d != DocIdSetIterator.NO_MORE_DOCS; d = expected.nextDoc()) {
-          assertEquals(d, actual.nextDoc());
-          assertEquals("doc " + d, expected.longValue(), actual.longValue());
-        }
-        assertEquals(NO_MORE_DOCS, actual.nextDoc());
-      }
-    }
+    checkNormsVsDocValues(ir);
     ir.close();
     
     writer.forceMerge(1);
     
     // compare again
     ir = DirectoryReader.open(dir);
+    checkNormsVsDocValues(ir);
+    
+    writer.close();
+    ir.close();
+    dir.close();
+  }
+
+  private void checkNormsVsDocValues(IndexReader ir) throws IOException {
     for (LeafReaderContext context : ir.leaves()) {
       LeafReader r = context.reader();
       NumericDocValues expected = r.getNumericDocValues("dv");
@@ -520,13 +517,8 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
         assertEquals(NO_MORE_DOCS, actual.nextDoc());
       }
     }
-    
-    writer.close();
-    ir.close();
-    dir.close();
   }
   
-  
   static abstract class LongProducer {
     abstract long next();
   }
@@ -633,4 +625,90 @@ public abstract class BaseNormsFormatTestCase extends BaseIndexFileFormatTestCas
     w.close();
     dir.close();
   }
+
+  public void testThreads() throws Exception {
+    float density = codecSupportsSparsity() == false || random().nextBoolean() ? 1f : random().nextFloat();
+    int numDocs = atLeast(500);
+    final FixedBitSet docsWithField = new FixedBitSet(numDocs);
+    final int numDocsWithField = Math.max(1, (int) (density * numDocs));
+    if (numDocsWithField == numDocs) {
+      docsWithField.set(0, numDocs);
+    } else {
+      int i = 0;
+      while (i < numDocsWithField) {
+        int doc = random().nextInt(numDocs);
+        if (docsWithField.get(doc) == false) {
+          docsWithField.set(doc);
+          ++i;
+        }
+      }
+    }
+
+    long norms[] = new long[numDocsWithField];
+    for (int i = 0; i < numDocsWithField; i++) {
+      norms[i] = random().nextLong();
+    }
+
+    Directory dir = newDirectory();
+    Analyzer analyzer = new MockAnalyzer(random(), MockTokenizer.KEYWORD, false);
+    IndexWriterConfig conf = newIndexWriterConfig(analyzer);conf.setMergePolicy(NoMergePolicy.INSTANCE);
+    conf.setSimilarity(new CannedNormSimilarity(norms));
+    RandomIndexWriter writer = new RandomIndexWriter(random(), dir, conf);
+    Document doc = new Document();
+    Field idField = new StringField("id", "", Field.Store.NO);
+    Field indexedField = new TextField("indexed", "", Field.Store.NO);
+    Field dvField = new NumericDocValuesField("dv", 0);
+    doc.add(idField);
+    doc.add(indexedField);
+    doc.add(dvField);
+    
+    for (int i = 0, j = 0; i < numDocs; i++) {
+      idField.setStringValue(Integer.toString(i));
+      if (docsWithField.get(i) == false) {
+        Document doc2 = new Document();
+        doc2.add(idField);
+        writer.addDocument(doc2);
+      } else {
+        long value = norms[j++];
+        dvField.setLongValue(value);
+        indexedField.setStringValue(Long.toString(value));
+        writer.addDocument(doc);
+      }
+      if (random().nextInt(31) == 0) {
+        writer.commit();
+      }
+    }
+
+    DirectoryReader reader = writer.getReader();
+    writer.close();
+
+    final int numThreads = TestUtil.nextInt(random(), 3, 30);
+    Thread[] threads = new Thread[numThreads];
+    final CountDownLatch latch = new CountDownLatch(1);
+    for (int i = 0; i < numThreads; ++i) {
+      threads[i] = new Thread(new Runnable() {
+        @Override
+        public void run() {
+          try {
+            latch.await();
+            checkNormsVsDocValues(reader);
+            TestUtil.checkReader(reader);
+          } catch (Exception e) {
+            throw new RuntimeException(e);
+          }
+        }
+      });
+    }
+
+    for (Thread thread : threads) {
+      thread.start();
+    }
+    latch.countDown();
+    for (Thread thread : threads) {
+      thread.join();
+    }
+
+    reader.close();
+    dir.close();
+  }
 }