blob: ede71b4ebb123ae2d75e629b9e3425dc281f700c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
package org.apache.solr.search;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.client.solrj.SolrClient;
import org.apache.solr.client.solrj.SolrServerException;
import org.apache.solr.client.solrj.impl.ConcurrentUpdateSolrClient;
import org.apache.solr.client.solrj.impl.HttpSolrClient;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.util.RTimer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
public class TestSolrJ extends SolrTestCaseJ4 {
public void testSolrJ() throws Exception {
// docs, producers, connections, sleep_time
// main(new String[] {"1000000","4", "1", "0"});
// doCommitPerf();
}
public static SolrClient client;
public static String idField = "id";
public static Exception ex;
public static void main(String[] args) throws Exception {
// String addr = "http://odin.local:80/solr";
// String addr = "http://odin.local:8983/solr";
String addr = "http://127.0.0.1:8983/solr";
int i = 0;
final int nDocs = Integer.parseInt(args[i++]);
final int nProducers = Integer.parseInt(args[i++]);
final int nConnections = Integer.parseInt(args[i++]);
final int maxSleep = Integer.parseInt(args[i++]);
ConcurrentUpdateSolrClient concurrentClient = null;
// server = concurrentClient = new ConcurrentUpdateSolrServer(addr,32,8);
client = concurrentClient = getConcurrentUpdateSolrClient(addr,64,nConnections);
client.deleteByQuery("*:*");
client.commit();
final RTimer timer = new RTimer();
final int docsPerThread = nDocs / nProducers;
Thread[] threads = new Thread[nProducers];
for (int threadNum = 0; threadNum<nProducers; threadNum++) {
final int base = threadNum * docsPerThread;
threads[threadNum] = new Thread("add-thread"+i) {
@Override
public void run(){
try {
indexDocs(base, docsPerThread, maxSleep);
} catch (Exception e) {
System.out.println("###############################CAUGHT EXCEPTION");
e.printStackTrace();
ex = e;
}
}
};
threads[threadNum].start();
}
// optional: wait for commit?
for (int threadNum = 0; threadNum<nProducers; threadNum++) {
threads[threadNum].join();
}
if (concurrentClient != null) {
concurrentClient.blockUntilFinished();
}
double elapsed = timer.getTime();
System.out.println("time="+elapsed + " throughput="+(nDocs*1000/elapsed) + " Exception="+ex);
// should server threads be marked as daemon?
// need a server.close()!!!
}
@SuppressWarnings({"unchecked"})
public static SolrInputDocument getDocument(int docnum) {
SolrInputDocument doc = new SolrInputDocument();
doc.setField(idField, docnum );
doc.setField("cat", Integer.toString(docnum&0x0f) );
doc.setField("name", "my name is " + Integer.toString(docnum&0xff) );
doc.setField("foo_t", "now is the time for all good men to come to the aid of their country" );
doc.setField("foo_i", Integer.toString(docnum&0x0f) );
doc.setField("foo_s", Integer.toString(docnum&0xff) );
doc.setField("foo_b", Boolean.toString( (docnum&0x01) == 1) );
doc.setField("parent_s", Integer.toString(docnum-1) );
doc.setField("price", Integer.toString(docnum >> 4));
int golden = (int)2654435761L;
int h = docnum * golden;
int n = (h & 0xff) + 1;
@SuppressWarnings({"rawtypes"})
List lst = new ArrayList(n);
for (int i=0; i<n; i++) {
h = (h+i) * golden;
lst.add(h & 0xfff);
}
doc.setField("num_is", lst);
return doc;
}
public static void indexDocs(int base, int count, int maxSleep) throws IOException, SolrServerException {
Random r = new Random(base);
for (int i=base; i<count+base; i++) {
if ((i & 0xfffff) == 0) {
System.out.print("\n% " + new Date()+ "\t" + i + "\t");
System.out.flush();
}
if ((i & 0xffff) == 0) {
System.out.print(".");
System.out.flush();
}
SolrInputDocument doc = getDocument(i);
client.add(doc);
if (maxSleep > 0) {
int sleep = r.nextInt(maxSleep);
try {
Thread.sleep(sleep);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
}
public void doCommitPerf() throws Exception {
try (HttpSolrClient client = getHttpSolrClient("http://127.0.0.1:8983/solr")) {
final RTimer timer = new RTimer();
for (int i = 0; i < 10000; i++) {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", Integer.toString(i % 13));
client.add(doc);
client.commit(true, true, true);
}
System.out.println("TIME: " + timer.getTime());
}
}
}