+++ /dev/null
-package org.apache.lucene.benchmark.byTask.tasks;
-
-/**
- * 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.
- */
-
-import org.apache.lucene.benchmark.byTask.PerfRunData;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.util.ArrayUtil;
-
-/**
- * Spawns a BG thread that periodically (defaults to 3.0
- * seconds, but accepts param in seconds) wakes up and asks
- * IndexWriter for a near real-time reader. Then runs a
- * single query (body: 1) sorted by docdate, and prints
- * time to reopen and time to run the search.
- *
- * @lucene.experimental It's also not generally usable, eg
- * you cannot change which query is executed.
- */
-public class NearRealtimeReaderTask extends PerfTask {
-
- long pauseMSec = 3000L;
-
- int reopenCount;
- int[] reopenTimes = new int[1];
-
- public NearRealtimeReaderTask(PerfRunData runData) {
- super(runData);
- }
-
- @Override
- public int doLogic() throws Exception {
-
- final PerfRunData runData = getRunData();
-
- // Get initial reader
- IndexWriter w = runData.getIndexWriter();
- if (w == null) {
- throw new RuntimeException("please open the writer before invoking NearRealtimeReader");
- }
-
- if (runData.getIndexReader() != null) {
- throw new RuntimeException("please close the existing reader before invoking NearRealtimeReader");
- }
-
- long t = System.currentTimeMillis();
- IndexReader r = IndexReader.open(w, true);
- runData.setIndexReader(r);
- // Transfer our reference to runData
- r.decRef();
-
- // TODO: gather basic metrics for reporting -- eg mean,
- // stddev, min/max reopen latencies
-
- // Parent sequence sets stopNow
- reopenCount = 0;
- while(!stopNow) {
- long waitForMsec = (pauseMSec - (System.currentTimeMillis() - t));
- if (waitForMsec > 0) {
- Thread.sleep(waitForMsec);
- //System.out.println("NRT wait: " + waitForMsec + " msec");
- }
-
- t = System.currentTimeMillis();
- final IndexReader newReader = r.reopen();
- if (r != newReader) {
- final int delay = (int) (System.currentTimeMillis()-t);
- if (reopenTimes.length == reopenCount) {
- reopenTimes = ArrayUtil.grow(reopenTimes, 1+reopenCount);
- }
- reopenTimes[reopenCount++] = delay;
- // TODO: somehow we need to enable warming, here
- runData.setIndexReader(newReader);
- // Transfer our reference to runData
- newReader.decRef();
- r = newReader;
- }
- }
- stopNow = false;
-
- return reopenCount;
- }
-
- @Override
- public void setParams(String params) {
- super.setParams(params);
- pauseMSec = (long) (1000.0*Float.parseFloat(params));
- }
-
- @Override
- public void close() {
- System.out.println("NRT reopen times:");
- for(int i=0;i<reopenCount;i++) {
- System.out.print(" " + reopenTimes[i]);
- }
- System.out.println();
- }
-
- @Override
- public boolean supportsParams() {
- return true;
- }
-}