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();
+ }
}