You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@lucene.apache.org by mi...@apache.org on 2006/11/18 03:55:14 UTC
svn commit: r476422 -
/lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java
Author: mikemccand
Date: Fri Nov 17 18:55:14 2006
New Revision: 476422
URL: http://svn.apache.org/viewvc?view=rev&rev=476422
Log:
Lockless commits: LUCENE-701
Added:
lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java
Added: lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java
URL: http://svn.apache.org/viewvc/lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java?view=auto&rev=476422
==============================================================================
--- lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java (added)
+++ lucene/java/trunk/src/test/org/apache/lucene/index/TestStressIndexing.java Fri Nov 17 18:55:14 2006
@@ -0,0 +1,173 @@
+package org.apache.lucene.index;
+
+/**
+ * Copyright 2004 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import org.apache.lucene.util.*;
+import org.apache.lucene.store.*;
+import org.apache.lucene.document.*;
+import org.apache.lucene.analysis.*;
+import org.apache.lucene.index.*;
+import org.apache.lucene.search.*;
+import org.apache.lucene.queryParser.*;
+
+import junit.framework.TestCase;
+
+import java.util.Random;
+import java.io.File;
+
+public class TestStressIndexing extends TestCase {
+ private static final Analyzer ANALYZER = new SimpleAnalyzer();
+ private static final Random RANDOM = new Random();
+ private static Searcher SEARCHER;
+
+ private static int RUN_TIME_SEC = 15;
+
+ private static class IndexerThread extends Thread {
+ IndexModifier modifier;
+ int nextID;
+ public int count;
+ boolean failed;
+
+ public IndexerThread(IndexModifier modifier) {
+ this.modifier = modifier;
+ }
+
+ public void run() {
+ long stopTime = System.currentTimeMillis() + 1000*RUN_TIME_SEC;
+ try {
+ while(true) {
+
+ if (System.currentTimeMillis() > stopTime) {
+ break;
+ }
+
+ // Add 10 docs:
+ for(int j=0; j<10; j++) {
+ Document d = new Document();
+ int n = RANDOM.nextInt();
+ d.add(new Field("id", Integer.toString(nextID++), Field.Store.YES, Field.Index.UN_TOKENIZED));
+ d.add(new Field("contents", English.intToEnglish(n), Field.Store.NO, Field.Index.TOKENIZED));
+ modifier.addDocument(d);
+ }
+
+ // Delete 5 docs:
+ int deleteID = nextID;
+ for(int j=0; j<5; j++) {
+ modifier.deleteDocuments(new Term("id", ""+deleteID));
+ deleteID -= 2;
+ }
+
+ count++;
+ }
+
+ modifier.close();
+
+ } catch (Exception e) {
+ System.out.println(e.toString());
+ e.printStackTrace();
+ failed = true;
+ }
+ }
+ }
+
+ private static class SearcherThread extends Thread {
+ private Directory directory;
+ public int count;
+ boolean failed;
+
+ public SearcherThread(Directory directory) {
+ this.directory = directory;
+ }
+
+ public void run() {
+ long stopTime = System.currentTimeMillis() + 1000*RUN_TIME_SEC;
+ try {
+ while(true) {
+ for (int i=0; i<100; i++) {
+ (new IndexSearcher(directory)).close();
+ }
+ count += 100;
+ if (System.currentTimeMillis() > stopTime) {
+ break;
+ }
+ }
+ } catch (Exception e) {
+ System.out.println(e.toString());
+ e.printStackTrace();
+ failed = true;
+ }
+ }
+ }
+
+ /*
+ Run one indexer and 2 searchers against single index as
+ stress test.
+ */
+ public void runStressTest(Directory directory) throws Exception {
+ IndexModifier modifier = new IndexModifier(directory, ANALYZER, true);
+
+ // One modifier that writes 10 docs then removes 5, over
+ // and over:
+ IndexerThread indexerThread = new IndexerThread(modifier);
+ indexerThread.start();
+
+ // Two searchers that constantly just re-instantiate the searcher:
+ SearcherThread searcherThread1 = new SearcherThread(directory);
+ searcherThread1.start();
+
+ SearcherThread searcherThread2 = new SearcherThread(directory);
+ searcherThread2.start();
+
+ indexerThread.join();
+ searcherThread1.join();
+ searcherThread2.join();
+ assertTrue("hit unexpected exception in indexer", !indexerThread.failed);
+ assertTrue("hit unexpected exception in search1", !searcherThread1.failed);
+ assertTrue("hit unexpected exception in search2", !searcherThread2.failed);
+ //System.out.println(" Writer: " + indexerThread.count + " iterations");
+ //System.out.println("Searcher 1: " + searcherThread1.count + " searchers created");
+ //System.out.println("Searcher 2: " + searcherThread2.count + " searchers created");
+ }
+
+ /*
+ Run above stress test against RAMDirectory and then
+ FSDirectory.
+ */
+ public void testStressIndexAndSearching() throws Exception {
+
+ // First in a RAM directory:
+ Directory directory = new RAMDirectory();
+ runStressTest(directory);
+ directory.close();
+
+ // Second in an FSDirectory:
+ String tempDir = System.getProperty("java.io.tmpdir");
+ File dirPath = new File(tempDir, "lucene.test.stress");
+ directory = FSDirectory.getDirectory(dirPath, true);
+ runStressTest(directory);
+ directory.close();
+ rmDir(dirPath);
+ }
+
+ private void rmDir(File dir) {
+ File[] files = dir.listFiles();
+ for (int i = 0; i < files.length; i++) {
+ files[i].delete();
+ }
+ dir.delete();
+ }
+}