diff --git a/lucene/src/java/org/apache/lucene/index/BufferedDeletesStream.java b/lucene/src/java/org/apache/lucene/index/BufferedDeletesStream.java index f7867a31870..d310b10451d 100644 --- a/lucene/src/java/org/apache/lucene/index/BufferedDeletesStream.java +++ b/lucene/src/java/org/apache/lucene/index/BufferedDeletesStream.java @@ -88,7 +88,7 @@ class BufferedDeletesStream { deletes.add(packet); numTerms.addAndGet(packet.numTermDeletes); bytesUsed.addAndGet(packet.bytesUsed); - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "push deletes " + packet + " delGen=" + packet.delGen() + " packetCount=" + deletes.size() + " totBytesUsed=" + bytesUsed.get()); } assert checkDeleteStats(); @@ -159,13 +159,13 @@ class BufferedDeletesStream { assert checkDeleteStats(); if (!any()) { - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "applyDeletes: no deletes; skipping"); } return new ApplyDeletesResult(false, nextGen++, null); } - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "applyDeletes: infos=" + infos + " packetCount=" + deletes.size()); } @@ -237,7 +237,7 @@ class BufferedDeletesStream { allDeleted.add(info); } - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "seg=" + info + " segGen=" + segGen + " segDeletes=[" + packet + "]; coalesced deletes=[" + (coalescedDeletes == null ? "null" : coalescedDeletes) + "] delCount=" + delCount + (segAllDeletes ? " 100% deleted" : "")); } @@ -279,7 +279,7 @@ class BufferedDeletesStream { allDeleted.add(info); } - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "seg=" + info + " segGen=" + segGen + " coalesced deletes=[" + (coalescedDeletes == null ? "null" : coalescedDeletes) + "] delCount=" + delCount + (segAllDeletes ? " 100% deleted" : "")); } } @@ -290,7 +290,7 @@ class BufferedDeletesStream { } assert checkDeleteStats(); - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "applyDeletes took " + (System.currentTimeMillis()-t0) + " msec"); } // assert infos != segmentInfos || !any() : "infos=" + infos + " segmentInfos=" + segmentInfos + " any=" + any; @@ -313,7 +313,7 @@ class BufferedDeletesStream { minGen = Math.min(info.getBufferedDeletesGen(), minGen); } - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "prune sis=" + segmentInfos + " minGen=" + minGen + " packetCount=" + deletes.size()); } final int limit = deletes.size(); @@ -333,7 +333,7 @@ class BufferedDeletesStream { private synchronized void prune(int count) { if (count > 0) { - if (infoStream != null) { + if (infoStream.isEnabled("BD")) { infoStream.message("BD", "pruneDeletes: prune " + count + " packets; " + (deletes.size() - count) + " packets remain"); } for(int delIDX=0;delIDX */ protected boolean verbose() { - return writer != null && writer.verbose(); + return writer != null && writer.infoStream.isEnabled("CMS"); } /** @@ -226,10 +226,7 @@ public class ConcurrentMergeScheduler extends MergeScheduler { * called and returned true. */ protected void message(String message) { - final InfoStream infoStream = writer.infoStream; - if (infoStream != null) { - infoStream.message("CMS", message); - } + writer.infoStream.message("CMS", message); } private synchronized void initMergeThreadPriority() { diff --git a/lucene/src/java/org/apache/lucene/index/DirectoryReader.java b/lucene/src/java/org/apache/lucene/index/DirectoryReader.java index df06b28bdbf..74f43e6a6f8 100644 --- a/lucene/src/java/org/apache/lucene/index/DirectoryReader.java +++ b/lucene/src/java/org/apache/lucene/index/DirectoryReader.java @@ -36,6 +36,7 @@ import org.apache.lucene.store.LockObtainFailedException; import org.apache.lucene.index.codecs.PerDocValues; import org.apache.lucene.util.Bits; import org.apache.lucene.util.BytesRef; +import org.apache.lucene.util.InfoStream; import org.apache.lucene.util.MapBackedSet; /** @@ -685,9 +686,10 @@ class DirectoryReader extends IndexReader implements Cloneable { segmentInfos.setUserData(commitUserData); // Default deleter (for backwards compatibility) is // KeepOnlyLastCommitDeleter: + // nocommit: Decide what to do with InfoStream here? Use default or keep NO_OUTPUT? IndexFileDeleter deleter = new IndexFileDeleter(directory, deletionPolicy == null ? new KeepOnlyLastCommitDeletionPolicy() : deletionPolicy, - segmentInfos, null, null); + segmentInfos, InfoStream.NO_OUTPUT, null); segmentInfos.updateGeneration(deleter.getLastSegmentInfos()); segmentInfos.changed(); diff --git a/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java b/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java index 1ad37c0dd0e..ea370d4fc93 100644 --- a/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java +++ b/lucene/src/java/org/apache/lucene/index/DocumentsWriter.java @@ -216,9 +216,7 @@ final class DocumentsWriter { } try { - if (infoStream != null) { - infoStream.message("DW", "abort"); - } + infoStream.message("DW", "abort"); final Iterator threadsIterator = perThreadPool.getActivePerThreadsIterator(); while (threadsIterator.hasNext()) { @@ -243,14 +241,14 @@ final class DocumentsWriter { } success = true; } finally { - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "done abort; abortedFiles=" + abortedFiles + " success=" + success); } } } boolean anyChanges() { - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "anyChanges? numDocsInRam=" + numDocsInRAM.get() + " deletes=" + anyDeletions() + " hasTickets:" + ticketQueue.hasTickets() + " pendingChangesInFullFlush: " @@ -289,7 +287,7 @@ final class DocumentsWriter { boolean maybeMerge = false; if (flushControl.anyStalledThreads() || flushControl.numQueuedFlushes() > 0) { // Help out flushing any queued DWPTs so we can un-stall: - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "DocumentsWriter has queued dwpt; will hijack this thread to flush pending segment(s)"); } do { @@ -300,14 +298,14 @@ final class DocumentsWriter { maybeMerge |= doFlush(flushingDWPT); } - if (infoStream != null && flushControl.anyStalledThreads()) { + if (infoStream.isEnabled("DW") && flushControl.anyStalledThreads()) { infoStream.message("DW", "WARNING DocumentsWriter has stalled threads; waiting"); } flushControl.waitIfStalled(); // block if stalled } while (flushControl.numQueuedFlushes() != 0); // still queued DWPTs try help flushing - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "continue indexing after helping out flushing DocumentsWriter is healthy"); } } @@ -466,7 +464,7 @@ final class DocumentsWriter { final double ramBufferSizeMB = indexWriter.getConfig().getRAMBufferSizeMB(); if (ramBufferSizeMB != IndexWriterConfig.DISABLE_AUTO_FLUSH && flushControl.getDeleteBytesUsed() > (1024*1024*ramBufferSizeMB/2)) { - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "force apply deletes bytesUsed=" + flushControl.getDeleteBytesUsed() + " vs ramBuffer=" + (1024*1024*ramBufferSizeMB)); } applyAllDeletes(deleteQueue); @@ -500,7 +498,7 @@ final class DocumentsWriter { assert bufferedDeletes != null; if (bufferedDeletes != null && bufferedDeletes.any()) { indexWriter.publishFrozenDeletes(bufferedDeletes); - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "flush: push buffered deletes: " + bufferedDeletes); } } @@ -527,14 +525,14 @@ final class DocumentsWriter { assert newSegment != null; final SegmentInfo segInfo = indexWriter.prepareFlushedSegment(newSegment); final BufferedDeletes deletes = newSegment.segmentDeletes; - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", Thread.currentThread().getName() + ": publishFlushedSegment seg-private deletes=" + deletes); } FrozenBufferedDeletes packet = null; if (deletes != null && deletes.any()) { // Segment private delete packet = new FrozenBufferedDeletes(deletes, true); - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", "flush: push buffered seg private deletes: " + packet); } } @@ -560,7 +558,7 @@ final class DocumentsWriter { final boolean flushAllThreads() throws IOException { final DocumentsWriterDeleteQueue flushingDeleteQueue; - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", Thread.currentThread().getName() + " startFullFlush"); } @@ -586,7 +584,7 @@ final class DocumentsWriter { // If a concurrent flush is still in flight wait for it flushControl.waitForFlush(); if (!anythingFlushed && flushingDeleteQueue.anyChanges()) { // apply deletes if we did not flush any document - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", Thread.currentThread().getName() + ": flush naked frozen global deletes"); } synchronized (ticketQueue) { @@ -604,7 +602,7 @@ final class DocumentsWriter { final void finishFullFlush(boolean success) { try { - if (infoStream != null) { + if (infoStream.isEnabled("DW")) { infoStream.message("DW", Thread.currentThread().getName() + " finishFullFlush success=" + success); } assert setFlushingDeleteQueue(null); diff --git a/lucene/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java b/lucene/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java index 81ed2140181..d4c8be3548f 100644 --- a/lucene/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java +++ b/lucene/src/java/org/apache/lucene/index/DocumentsWriterFlushControl.java @@ -453,7 +453,7 @@ public final class DocumentsWriterFlushControl { private final List fullFlushBuffer = new ArrayList(); void addFlushableState(ThreadState perThread) { - if (documentsWriter.infoStream != null) { + if (documentsWriter.infoStream.isEnabled("DWFC")) { documentsWriter.infoStream.message("DWFC", Thread.currentThread().getName() + ": addFlushableState " + perThread.perThread); } final DocumentsWriterPerThread dwpt = perThread.perThread; diff --git a/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java b/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java index f87254e0338..15a3b848230 100644 --- a/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java +++ b/lucene/src/java/org/apache/lucene/index/DocumentsWriterPerThread.java @@ -131,9 +131,7 @@ public class DocumentsWriterPerThread { void abort() throws IOException { hasAborted = aborting = true; try { - if (infoStream != null) { - infoStream.message("DWPT", "now abort"); - } + infoStream.message("DWPT", "now abort"); try { consumer.abort(); } catch (Throwable t) { @@ -146,9 +144,7 @@ public class DocumentsWriterPerThread { } finally { aborting = false; - if (infoStream != null) { - infoStream.message("DWPT", "done abort"); - } + infoStream.message("DWPT", "done abort"); } } private final static boolean INFO_VERBOSE = false; @@ -226,12 +222,12 @@ public class DocumentsWriterPerThread { // this call is synchronized on IndexWriter.segmentInfos segment = writer.newSegmentName(); assert numDocsInRAM == 0; - if (INFO_VERBOSE && infoStream != null) { + if (INFO_VERBOSE && infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", Thread.currentThread().getName() + " init seg=" + segment + " delQueue=" + deleteQueue); } } - if (INFO_VERBOSE && infoStream != null) { + if (INFO_VERBOSE && infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", Thread.currentThread().getName() + " update delTerm=" + delTerm + " docID=" + docState.docID + " seg=" + segment); } boolean success = false; @@ -274,11 +270,11 @@ public class DocumentsWriterPerThread { // this call is synchronized on IndexWriter.segmentInfos segment = writer.newSegmentName(); assert numDocsInRAM == 0; - if (INFO_VERBOSE && infoStream != null) { + if (INFO_VERBOSE && infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", Thread.currentThread().getName() + " init seg=" + segment + " delQueue=" + deleteQueue); } } - if (INFO_VERBOSE && infoStream != null) { + if (INFO_VERBOSE && infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", Thread.currentThread().getName() + " update delTerm=" + delTerm + " docID=" + docState.docID + " seg=" + segment); } int docCount = 0; @@ -459,12 +455,12 @@ public class DocumentsWriterPerThread { pendingDeletes.docIDs.clear(); } - if (infoStream != null) { + if (infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", "flush postings as segment " + flushState.segmentName + " numDocs=" + numDocsInRAM); } if (aborting) { - if (infoStream != null) { + if (infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", "flush: skip because aborting is set"); } return null; @@ -476,7 +472,7 @@ public class DocumentsWriterPerThread { consumer.flush(flushState); pendingDeletes.terms.clear(); final SegmentInfo newSegment = new SegmentInfo(segment, flushState.numDocs, directory, false, flushState.codec, fieldInfos.asReadOnly()); - if (infoStream != null) { + if (infoStream.isEnabled("DWPT")) { infoStream.message("DWPT", "new segment has " + (flushState.liveDocs == null ? 0 : (flushState.numDocs - flushState.liveDocs.count())) + " deleted docs"); infoStream.message("DWPT", "new segment has " + (newSegment.getHasVectors() ? "vectors" : "no vectors")); infoStream.message("DWPT", "flushedFiles=" + newSegment.files()); @@ -493,7 +489,7 @@ public class DocumentsWriterPerThread { pendingDeletes = new BufferedDeletes(); } - if (infoStream != null) { + if (infoStream.isEnabled("DWPT")) { final double newSegmentSizeNoStore = newSegment.sizeInBytes(false)/1024./1024.; final double newSegmentSize = newSegment.sizeInBytes(true)/1024./1024.; infoStream.message("DWPT", "flushed: segment=" + newSegment + diff --git a/lucene/src/java/org/apache/lucene/index/FlushByRamOrCountsPolicy.java b/lucene/src/java/org/apache/lucene/index/FlushByRamOrCountsPolicy.java index 104f3915bec..4c7ca1f4c12 100644 --- a/lucene/src/java/org/apache/lucene/index/FlushByRamOrCountsPolicy.java +++ b/lucene/src/java/org/apache/lucene/index/FlushByRamOrCountsPolicy.java @@ -63,7 +63,7 @@ public class FlushByRamOrCountsPolicy extends FlushPolicy { if ((flushOnRAM() && control.getDeleteBytesUsed() > (1024*1024*indexWriterConfig.getRAMBufferSizeMB()))) { control.setApplyAllDeletes(); - if (writer.infoStream != null) { + if (writer.infoStream.isEnabled("FP")) { writer.infoStream.message("FP", "force apply deletes bytesUsed=" + control.getDeleteBytesUsed() + " vs ramBuffer=" + (1024*1024*indexWriterConfig.getRAMBufferSizeMB())); } } @@ -81,7 +81,7 @@ public class FlushByRamOrCountsPolicy extends FlushPolicy { final long totalRam = control.activeBytes() + control.getDeleteBytesUsed(); if (totalRam >= limit) { final DocumentsWriter writer = this.writer.get(); - if (writer.infoStream != null) { + if (writer.infoStream.isEnabled("FP")) { writer.infoStream.message("FP", "flush: activeBytes=" + control.activeBytes() + " deleteBytes=" + control.getDeleteBytesUsed() + " vs limit=" + limit); } markLargestWriterPending(control, state, totalRam); diff --git a/lucene/src/java/org/apache/lucene/index/FlushPolicy.java b/lucene/src/java/org/apache/lucene/index/FlushPolicy.java index 2055d728d31..165ea05491a 100644 --- a/lucene/src/java/org/apache/lucene/index/FlushPolicy.java +++ b/lucene/src/java/org/apache/lucene/index/FlushPolicy.java @@ -129,10 +129,7 @@ public abstract class FlushPolicy { } private boolean assertMessage(String s) { - InfoStream infoStream = writer.get().infoStream; - if (infoStream != null) { - infoStream.message("FP", s); - } + writer.get().infoStream.message("FP", s); return true; } diff --git a/lucene/src/java/org/apache/lucene/index/IndexFileDeleter.java b/lucene/src/java/org/apache/lucene/index/IndexFileDeleter.java index f99f1b8772a..2695da5496d 100644 --- a/lucene/src/java/org/apache/lucene/index/IndexFileDeleter.java +++ b/lucene/src/java/org/apache/lucene/index/IndexFileDeleter.java @@ -102,7 +102,7 @@ final class IndexFileDeleter { private SegmentInfos lastSegmentInfos; /** Change to true to see details of reference counts when - * infoStream != null */ + * infoStream is enabled */ public static boolean VERBOSE_REF_COUNTS = false; // Used only for assert @@ -128,7 +128,7 @@ final class IndexFileDeleter { final String currentSegmentsFile = segmentInfos.getCurrentSegmentFileName(); - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "init: current segments file is \"" + currentSegmentsFile + "\"; deletionPolicy=" + policy); } @@ -160,7 +160,7 @@ final class IndexFileDeleter { // This is a commit (segments or segments_N), and // it's valid (<= the max gen). Load it, then // incref all files it refers to: - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "init: load commit \"" + fileName + "\""); } SegmentInfos sis = new SegmentInfos(); @@ -174,7 +174,7 @@ final class IndexFileDeleter { // file segments_X exists when in fact it // doesn't. So, we catch this and handle it // as if the file does not exist - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "init: hit FileNotFoundException when loading commit \"" + fileName + "\"; skipping this commit point"); } sis = null; @@ -205,7 +205,7 @@ final class IndexFileDeleter { } catch (FileNotFoundException e) { refresh(segmentInfo.name); sis = null; - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "init: hit FileNotFoundException when loading commit \"" + fileName + "\"; skipping this commit point"); } } @@ -242,7 +242,7 @@ final class IndexFileDeleter { } catch (IOException e) { throw new CorruptIndexException("failed to locate current segments_N file"); } - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "forced open of current segments file " + segmentInfos.getCurrentSegmentFileName()); } currentCommitPoint = new CommitPoint(commitsToDelete, directory, sis); @@ -260,7 +260,7 @@ final class IndexFileDeleter { RefCount rc = entry.getValue(); final String fileName = entry.getKey(); if (0 == rc.count) { - if (infoStream != null) { + if (infoStream.isEnabled("IFD")) { infoStream.message("IFD", "init: removing unreferenced file \"" + fileName + "\""); } deleteFile(fileName); @@ -300,7 +300,7 @@ final class IndexFileDeleter { // the now-deleted commits: for(int i=0;i= 1; got " + maxNumSegments); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "forceMerge: index now " + segString()); infoStream.message("IW", "now flush at forceMerge"); } @@ -1753,7 +1737,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { flush(true, true); - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "forceMergeDeletes: index now " + segString()); MergePolicy.MergeSpecification spec; @@ -1947,9 +1931,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { boolean success = false; - if (infoStream != null ) { - infoStream.message("IW", "rollback"); - } + infoStream.message("IW", "rollback"); try { synchronized(this) { @@ -1957,9 +1939,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { stopMerges = true; } - if (infoStream != null ) { - infoStream.message("IW", "rollback: done finish merges"); - } + infoStream.message("IW", "rollback: done finish merges"); // Must pre-close these two, in case they increment // changeCount so that we can then set it to false @@ -1984,7 +1964,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // will always write to a new generation ("write // once"). segmentInfos.rollbackSegmentInfos(rollbackSegments); - if (infoStream != null ) { + if (infoStream.isEnabled("IW") ) { infoStream.message("IW", "rollback: infos=" + segString(segmentInfos)); } @@ -2011,8 +1991,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { if (!success) { closing = false; notifyAll(); - if (infoStream != null) - infoStream.message("IW", "hit exception during rollback"); + infoStream.message("IW", "hit exception during rollback"); } } } @@ -2064,9 +2043,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { } catch (OutOfMemoryError oom) { handleOOM(oom, "deleteAll"); } finally { - if (!success && infoStream != null) { - infoStream.message("IW", "hit exception during deleteAll"); - } + infoStream.message("IW", "hit exception during deleteAll"); } } @@ -2077,7 +2054,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // Abort all pending & running merges: for (final MergePolicy.OneMerge merge : pendingMerges) { - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "now abort pending merge " + merge.segString(directory)); merge.abort(); mergeFinish(merge); @@ -2085,7 +2062,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { pendingMerges.clear(); for (final MergePolicy.OneMerge merge : runningMerges) { - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "now abort running merge " + merge.segString(directory)); merge.abort(); } @@ -2096,7 +2073,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // because the merge threads periodically check if // they are aborted. while(runningMerges.size() > 0) { - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "now wait for " + runningMerges.size() + " running merge to abort"); doWait(); } @@ -2106,8 +2083,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { assert 0 == mergingSegments.size(); - if (infoStream != null) - infoStream.message("IW", "all running merges have aborted"); + infoStream.message("IW", "all running merges have aborted"); } else { // waitForMerges() will ensure any running addIndexes finishes. @@ -2127,9 +2103,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { */ public synchronized void waitForMerges() { ensureOpen(false); - if (infoStream != null) { - infoStream.message("IW", "waitForMerges"); - } + infoStream.message("IW", "waitForMerges"); while(pendingMerges.size() > 0 || runningMerges.size() > 0) { doWait(); } @@ -2137,9 +2111,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // sanity check assert 0 == mergingSegments.size(); - if (infoStream != null) { - infoStream.message("IW", "waitForMerges done"); - } + infoStream.message("IW", "waitForMerges done"); } /** @@ -2175,7 +2147,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { try { if (useCompoundFile(newSegment)) { String compoundFileName = IndexFileNames.segmentFileName(newSegment.name, "", IndexFileNames.COMPOUND_FILE_EXTENSION); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "creating compound file " + compoundFileName); } // Now build compound file @@ -2207,7 +2179,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { newSegment.setDelCount(delCount); newSegment.advanceDelGen(); final String delFileName = newSegment.getDelFileName(); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "flush: write " + delCount + " deletes to " + delFileName); } boolean success2 = false; @@ -2234,7 +2206,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { success = true; } finally { if (!success) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "hit exception " + "reating compound file for newly flushed segment " + newSegment.name); } @@ -2266,9 +2238,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { FrozenBufferedDeletes packet, FrozenBufferedDeletes globalPacket) throws IOException { // Lock order IW -> BDS synchronized (bufferedDeletesStream) { - if (infoStream != null) { - infoStream.message("IW", "publishFlushedSegment"); - } + infoStream.message("IW", "publishFlushedSegment"); if (globalPacket != null && globalPacket.any()) { bufferedDeletesStream.push(globalPacket); @@ -2283,7 +2253,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // generation right away nextGen = bufferedDeletesStream.getNextGen(); } - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "publish sets newSegment delGen=" + nextGen); } newSegment.setBufferedDeletesGen(nextGen); @@ -2362,13 +2332,12 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { noDupDirs(dirs); try { - if (infoStream != null) - infoStream.message("IW", "flush at addIndexes(Directory...)"); + infoStream.message("IW", "flush at addIndexes(Directory...)"); flush(false, true); List infos = new ArrayList(); for (Directory dir : dirs) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "addIndexes: process directory " + dir); } SegmentInfos sis = new SegmentInfos(); // read infos from dir @@ -2381,7 +2350,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { String newSegName = newSegmentName(); String dsName = info.getDocStoreSegment(); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "addIndexes: process segment origName=" + info.name + " newName=" + newSegName + " dsName=" + dsName + " info=" + info); } @@ -2432,8 +2401,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { int numDocs = 0; try { - if (infoStream != null) - infoStream.message("IW", "flush at addIndexes(IndexReader...)"); + infoStream.message("IW", "flush at addIndexes(IndexReader...)"); flush(false, true); String mergedName = newSegmentName(); @@ -2600,7 +2568,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { public final void prepareCommit(Map commitUserData) throws CorruptIndexException, IOException { ensureOpen(false); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "prepareCommit: flush"); infoStream.message("IW", " index before flush " + segString()); } @@ -2660,7 +2628,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { } success = true; } finally { - if (!success && infoStream != null) { + if (!success) { infoStream.message("IW", "hit exception during prepareCommit"); } // Done: finish the full flush! @@ -2745,21 +2713,15 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { private final void commitInternal(Map commitUserData) throws CorruptIndexException, IOException { - if (infoStream != null) { - infoStream.message("IW", "commit: start"); - } + infoStream.message("IW", "commit: start"); synchronized(commitLock) { - if (infoStream != null) { - infoStream.message("IW", "commit: enter lock"); - } + infoStream.message("IW", "commit: enter lock"); if (pendingCommit == null) { - if (infoStream != null) { - infoStream.message("IW", "commit: now prepare"); - } + infoStream.message("IW", "commit: now prepare"); prepareCommit(commitUserData); - } else if (infoStream != null) { + } else { infoStream.message("IW", "commit: already prepared"); } @@ -2771,10 +2733,9 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { if (pendingCommit != null) { try { - if (infoStream != null) - infoStream.message("IW", "commit: pendingCommit != null"); + infoStream.message("IW", "commit: pendingCommit != null"); pendingCommit.finishCommit(directory, codec); - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "commit: wrote segments file \"" + pendingCommit.getCurrentSegmentFileName() + "\""); lastCommitChangeCount = pendingCommitChangeCount; segmentInfos.updateGeneration(pendingCommit); @@ -2789,13 +2750,11 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { notifyAll(); } - } else if (infoStream != null) { + } else { infoStream.message("IW", "commit: pendingCommit == null; skip"); } - if (infoStream != null) { - infoStream.message("IW", "commit: done"); - } + infoStream.message("IW", "commit: done"); } // Ensures only one flush() is actually flushing segments @@ -2835,7 +2794,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { boolean success = false; try { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", " start flush: applyAllDeletes=" + applyAllDeletes); infoStream.message("IW", " index before flush " + segString()); } @@ -2865,18 +2824,16 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // never hit return false; } finally { - if (!success && infoStream != null) + if (!success) infoStream.message("IW", "hit exception during flush"); } } final synchronized void maybeApplyDeletes(boolean applyAllDeletes) throws IOException { if (applyAllDeletes) { - if (infoStream != null) { - infoStream.message("IW", "apply all deletes during flush"); - } + infoStream.message("IW", "apply all deletes during flush"); applyAllDeletes(); - } else if (infoStream != null) { + } else if (infoStream.isEnabled("IW")) { infoStream.message("IW", "don't apply deletes now delTermCount=" + bufferedDeletesStream.numTerms() + " bytesUsed=" + bufferedDeletesStream.bytesUsed()); } } @@ -2889,7 +2846,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { checkpoint(); } if (!keepFullyDeletedSegments && result.allDeleted != null) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "drop 100% deleted segments: " + segString(result.allDeleted)); } for (SegmentInfo info : result.allDeleted) { @@ -2954,7 +2911,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { final List sourceSegments = merge.segments; - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "commitMergeDeletes " + merge.segString(directory)); // Carefully merge deletes that occurred after we @@ -3052,7 +3009,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { throw new IllegalStateException("this writer hit an OutOfMemoryError; cannot complete merge"); } - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "commitMerge: " + merge.segString(directory) + " index=" + segString()); assert merge.registerDone; @@ -3064,7 +3021,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // file that current segments does not reference), we // abort this merge if (merge.isAborted()) { - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "commitMerge: skipping merge " + merge.segString(directory) + ": it was aborted"); return false; } @@ -3080,7 +3037,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { final boolean allDeleted = mergedReader.numDocs() == 0; - if (infoStream != null && allDeleted) { + if (allDeleted && infoStream.isEnabled("IW")) { infoStream.message("IW", "merged segment " + merge.info + " is 100% deleted" + (keepFullyDeletedSegments ? "" : "; skipping insert")); } @@ -3091,7 +3048,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { readerPool.drop(merge.info); } - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "after commit: " + segString()); } @@ -3118,7 +3075,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { final private void handleMergeException(Throwable t, MergePolicy.OneMerge merge) throws IOException { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "handleMergeException: merge=" + merge.segString(directory) + " exc=" + t); } @@ -3167,7 +3124,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { try { mergeInit(merge); - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "now merge\n merge=" + merge.segString(directory) + "\n index=" + segString()); mergeMiddle(merge); @@ -3181,8 +3138,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { mergeFinish(merge); if (!success) { - if (infoStream != null) - infoStream.message("IW", "hit exception during merge"); + infoStream.message("IW", "hit exception during merge"); if (merge.info != null && !segmentInfos.contains(merge.info)) deleter.refresh(merge.info.name); } @@ -3198,7 +3154,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { } catch (OutOfMemoryError oom) { handleOOM(oom, "merge"); } - if (infoStream != null && merge.info != null) { + if (merge.info != null && infoStream.isEnabled("IW")) { infoStream.message("IW", "merge time " + (System.currentTimeMillis()-t0) + " msec for " + merge.info.docCount + " docs"); } //System.out.println(Thread.currentThread().getName() + ": merge end"); @@ -3244,7 +3200,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { pendingMerges.add(merge); - if (infoStream != null) + if (infoStream.isEnabled("IW")) infoStream.message("IW", "add merge to pendingMerges: " + merge.segString(directory) + " [total " + pendingMerges.size() + " pending]"); merge.mergeGen = mergeGen; @@ -3254,7 +3210,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // is running (while synchronized) to avoid race // condition where two conflicting merges from different // threads, start - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { StringBuilder builder = new StringBuilder("registerMerge merging= ["); for (SegmentInfo info : mergingSegments) { builder.append(info.name).append(", "); @@ -3265,7 +3221,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { infoStream.message("IW", builder.toString()); } for(SegmentInfo info : merge.segments) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "registerMerge info=" + info); } mergingSegments.add(info); @@ -3286,9 +3242,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { success = true; } finally { if (!success) { - if (infoStream != null) { - infoStream.message("IW", "hit exception in mergeInit"); - } + infoStream.message("IW", "hit exception in mergeInit"); mergeFinish(merge); } } @@ -3328,7 +3282,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { } if (!keepFullyDeletedSegments && result.allDeleted != null) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "drop 100% deleted segments: " + result.allDeleted); } for(SegmentInfo info : result.allDeleted) { @@ -3353,7 +3307,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { details.put("mergeFactor", Integer.toString(merge.segments.size())); setDiagnostics(merge.info, "merge", details); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "merge seg=" + merge.info.name); } @@ -3495,7 +3449,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { SegmentMerger merger = new SegmentMerger(infoStream, directory, config.getTermIndexInterval(), mergedName, checkAbort, payloadProcessorProvider, merge.info.getFieldInfos(), codec, context); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "merging " + merge.segString(directory) + " mergeVectors=" + merge.info.getFieldInfos().hasVectors()); } @@ -3529,7 +3483,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { segUpto++; } - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "merge: total " + totDocCount + " docs"); } @@ -3542,7 +3496,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { // Record which codec was used to write the segment merge.info.setCodec(codec); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "merge codec=" + codec); } @@ -3562,7 +3516,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { final String compoundFileName = IndexFileNames.segmentFileName(mergedName, "", IndexFileNames.COMPOUND_FILE_EXTENSION); try { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "create compound file " + compoundFileName); } createCompoundFile(directory, compoundFileName, checkAbort, merge.info, new IOContext(merge.getMergeInfo())); @@ -3581,9 +3535,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { handleMergeException(t, merge); } finally { if (!success) { - if (infoStream != null) { - infoStream.message("IW", "hit exception creating compound file during merge"); - } + infoStream.message("IW", "hit exception creating compound file during merge"); synchronized(this) { deleter.deleteFile(compoundFileName); @@ -3602,9 +3554,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { deleter.deleteNewFiles(merge.info.files()); if (merge.isAborted()) { - if (infoStream != null) { - infoStream.message("IW", "abort merge after building CFS"); - } + infoStream.message("IW", "abort merge after building CFS"); deleter.deleteFile(compoundFileName); return 0; } @@ -3613,7 +3563,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { merge.info.setUseCompoundFile(true); } - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", String.format("merged segment size=%.3f MB vs estimate=%.3f MB", merge.info.sizeInBytes()/1024./1024., merge.estimatedMergeBytes/1024/1024.)); } @@ -3787,24 +3737,20 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { try { - if (infoStream != null) { - infoStream.message("IW", "startCommit(): start"); - } + infoStream.message("IW", "startCommit(): start"); synchronized(this) { assert lastCommitChangeCount <= changeCount; if (pendingCommitChangeCount == lastCommitChangeCount) { - if (infoStream != null) { - infoStream.message("IW", " skip startCommit(): no changes pending"); - } + infoStream.message("IW", " skip startCommit(): no changes pending"); deleter.decRef(filesToCommit); filesToCommit = null; return; } - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "startCommit index=" + segString(toSync) + " changeCount=" + changeCount); } @@ -3841,9 +3787,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { pendingCommit = toSync; } - if (infoStream != null) { - infoStream.message("IW", "done all syncs"); - } + infoStream.message("IW", "done all syncs"); assert testPoint("midStartCommitSuccess"); @@ -3856,9 +3800,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { segmentInfos.updateGeneration(toSync); if (!pendingCommitSet) { - if (infoStream != null) { - infoStream.message("IW", "hit exception committing segments file"); - } + infoStream.message("IW", "hit exception committing segments file"); // Hit exception deleter.decRef(filesToCommit); @@ -3910,7 +3852,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { } private void handleOOM(OutOfMemoryError oom, String location) { - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "hit OutOfMemoryError inside " + location); } hitOOM = true; @@ -3935,7 +3877,7 @@ public class IndexWriter implements Closeable, TwoPhaseCommit { synchronized boolean nrtIsCurrent(SegmentInfos infos) { //System.out.println("IW.nrtIsCurrent " + (infos.version == segmentInfos.version && !docWriter.anyChanges() && !bufferedDeletesStream.any())); ensureOpen(); - if (infoStream != null) { + if (infoStream.isEnabled("IW")) { infoStream.message("IW", "nrtIsCurrent: infoVersion matches: " + (infos.version == segmentInfos.version) + " DW changes: " + docWriter.anyChanges() + " BD changes: "+bufferedDeletesStream.any()); } diff --git a/lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java b/lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java index b9a9772615d..5bd997c7a76 100644 --- a/lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java +++ b/lucene/src/java/org/apache/lucene/index/IndexWriterConfig.java @@ -695,6 +695,10 @@ public final class IndexWriterConfig implements Cloneable { * to this. */ public IndexWriterConfig setInfoStream(InfoStream infoStream) { + if (infoStream == null) { + throw new IllegalArgumentException("Cannot set InfoStream implementation to null. "+ + "To disable logging use InfoStream.NO_OUTPUT"); + } this.infoStream = infoStream; return this; } @@ -703,8 +707,7 @@ public final class IndexWriterConfig implements Cloneable { * Convenience method that uses {@link PrintStreamInfoStream} */ public IndexWriterConfig setInfoStream(PrintStream printStream) { - this.infoStream = printStream == null ? null : new PrintStreamInfoStream(printStream); - return this; + return setInfoStream(printStream == null ? InfoStream.NO_OUTPUT : new PrintStreamInfoStream(printStream)); } @Override @@ -725,7 +728,7 @@ public final class IndexWriterConfig implements Cloneable { sb.append("maxBufferedDocs=").append(maxBufferedDocs).append("\n"); sb.append("mergedSegmentWarmer=").append(mergedSegmentWarmer).append("\n"); sb.append("codec=").append(codec).append("\n"); - sb.append("infoStream=").append(infoStream == null ? "null" : infoStream.getClass().getName()).append("\n"); + sb.append("infoStream=").append(infoStream.getClass().getName()).append("\n"); sb.append("mergePolicy=").append(mergePolicy).append("\n"); sb.append("indexerThreadPool=").append(indexerThreadPool).append("\n"); sb.append("readerPooling=").append(readerPooling).append("\n"); diff --git a/lucene/src/java/org/apache/lucene/index/LogMergePolicy.java b/lucene/src/java/org/apache/lucene/index/LogMergePolicy.java index 490178b9ee9..6c105a928d3 100644 --- a/lucene/src/java/org/apache/lucene/index/LogMergePolicy.java +++ b/lucene/src/java/org/apache/lucene/index/LogMergePolicy.java @@ -84,8 +84,8 @@ public abstract class LogMergePolicy extends MergePolicy { } protected boolean verbose() { - IndexWriter w = writer.get(); - return w != null && w.verbose(); + final IndexWriter w = writer.get(); + return w != null && w.infoStream.isEnabled("LMP"); } /** @see #setNoCFSRatio */ @@ -107,10 +107,7 @@ public abstract class LogMergePolicy extends MergePolicy { protected void message(String message) { if (verbose()) { - final InfoStream infoStream = writer.get().infoStream; - if (infoStream != null) { - infoStream.message("LMP", message); - } + writer.get().infoStream.message("LMP", message); } } diff --git a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java index 25f7a553800..7fe99f745e8 100644 --- a/lucene/src/java/org/apache/lucene/index/SegmentMerger.java +++ b/lucene/src/java/org/apache/lucene/index/SegmentMerger.java @@ -175,7 +175,7 @@ final class SegmentMerger { } } - if (mergeState.infoStream != null) { + if (mergeState.infoStream.isEnabled("SM")) { mergeState.infoStream.message("SM", "merge store matchedCount=" + mergeState.matchedCount + " vs " + mergeState.readers.size()); if (mergeState.matchedCount != mergeState.readers.size()) { mergeState.infoStream.message("SM", "" + (mergeState.readers.size() - mergeState.matchedCount) + " non-bulk merges"); diff --git a/lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java b/lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java index fca130cef2c..27aadfdf5ea 100644 --- a/lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java +++ b/lucene/src/java/org/apache/lucene/index/TieredMergePolicy.java @@ -644,16 +644,13 @@ public class TieredMergePolicy extends MergePolicy { } private boolean verbose() { - IndexWriter w = writer.get(); - return w != null && w.verbose(); + final IndexWriter w = writer.get(); + return w != null && w.infoStream.isEnabled("TMP"); } private void message(String message) { if (verbose()) { - final InfoStream infoStream = writer.get().infoStream; - if (infoStream != null) { - infoStream.message("TMP", message); - } + writer.get().infoStream.message("TMP", message); } } diff --git a/lucene/src/java/org/apache/lucene/index/UpgradeIndexMergePolicy.java b/lucene/src/java/org/apache/lucene/index/UpgradeIndexMergePolicy.java index 40dfcdb0185..19346960252 100644 --- a/lucene/src/java/org/apache/lucene/index/UpgradeIndexMergePolicy.java +++ b/lucene/src/java/org/apache/lucene/index/UpgradeIndexMergePolicy.java @@ -147,16 +147,13 @@ public class UpgradeIndexMergePolicy extends MergePolicy { } private boolean verbose() { - IndexWriter w = writer.get(); - return w != null && w.verbose(); + final IndexWriter w = writer.get(); + return w != null && w.infoStream.isEnabled("UPGMP"); } private void message(String message) { if (verbose()) { - final InfoStream infoStream = writer.get().infoStream; - if (infoStream != null) { - infoStream.message("UPGMP", message); - } + writer.get().infoStream.message("UPGMP", message); } } diff --git a/lucene/src/java/org/apache/lucene/util/InfoStream.java b/lucene/src/java/org/apache/lucene/util/InfoStream.java index c70cde6e8af..2a89eef9202 100644 --- a/lucene/src/java/org/apache/lucene/util/InfoStream.java +++ b/lucene/src/java/org/apache/lucene/util/InfoStream.java @@ -18,30 +18,47 @@ package org.apache.lucene.util; */ import java.io.Closeable; -import java.util.concurrent.atomic.AtomicInteger; /** @lucene.internal */ public abstract class InfoStream implements Closeable { - // Used for printing messages - private static final AtomicInteger MESSAGE_ID = new AtomicInteger(); - protected final int messageID = MESSAGE_ID.getAndIncrement(); + + /** Instance of InfoStream that does no logging at all. */ + public static final InfoStream NO_OUTPUT = new NoOutput(); + private static final class NoOutput extends InfoStream { + @Override + public void message(String component, String message) {} + + @Override + public boolean isEnabled(String component) { return false; } + + @Override + public void close() {} + } /** prints a message */ public abstract void message(String component, String message); - private static InfoStream defaultInfoStream; + /** returns true if messages are enabled and should be posted to {@link #message}. */ + public abstract boolean isEnabled(String component); - /** The default infoStream (possibly null) used - * by a newly instantiated classes. + private static InfoStream defaultInfoStream = NO_OUTPUT; + + /** The default {@code InfoStream} used by a newly instantiated classes. * @see #setDefault */ - public static InfoStream getDefault() { + public static synchronized InfoStream getDefault() { return defaultInfoStream; } - /** Sets the default infoStream (possibly null) used - * by a newly instantiated classes. - * @see #setDefault */ - public static void setDefault(InfoStream infoStream) { + /** Sets the default {@code InfoStream} used + * by a newly instantiated classes. It cannot be {@code null}, + * to disable logging use {@link #NO_OUTPUT}. + * @see #getDefault */ + public static synchronized void setDefault(InfoStream infoStream) { + if (infoStream == null) { + throw new IllegalArgumentException("Cannot set InfoStream default implementation to null. "+ + "To disable logging use InfoStream.NO_OUTPUT"); + } defaultInfoStream = infoStream; } + } diff --git a/lucene/src/java/org/apache/lucene/util/PrintStreamInfoStream.java b/lucene/src/java/org/apache/lucene/util/PrintStreamInfoStream.java index 365faa70271..3785a1dd9f6 100644 --- a/lucene/src/java/org/apache/lucene/util/PrintStreamInfoStream.java +++ b/lucene/src/java/org/apache/lucene/util/PrintStreamInfoStream.java @@ -20,15 +20,25 @@ package org.apache.lucene.util; import java.io.IOException; import java.io.PrintStream; import java.util.Date; +import java.util.concurrent.atomic.AtomicInteger; /** * @lucene.internal */ public class PrintStreamInfoStream extends InfoStream { + // Used for printing messages + private static final AtomicInteger MESSAGE_ID = new AtomicInteger(); + protected final int messageID; + private final PrintStream stream; public PrintStreamInfoStream(PrintStream stream) { + this(stream, MESSAGE_ID.getAndIncrement()); + } + + public PrintStreamInfoStream(PrintStream stream, int messageID) { this.stream = stream; + this.messageID = messageID; } @Override @@ -36,6 +46,11 @@ public class PrintStreamInfoStream extends InfoStream { stream.println(component + " " + messageID + " [" + new Date() + "; " + Thread.currentThread().getName() + "]: " + message); } + @Override + public boolean isEnabled(String component) { + return true; + } + @Override public void close() throws IOException { if (!isSystemStream()) { diff --git a/lucene/src/test-framework/java/org/apache/lucene/util/FailOnNonBulkMergesInfoStream.java b/lucene/src/test-framework/java/org/apache/lucene/util/FailOnNonBulkMergesInfoStream.java index f8b1ef3200f..086157f94c1 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/util/FailOnNonBulkMergesInfoStream.java +++ b/lucene/src/test-framework/java/org/apache/lucene/util/FailOnNonBulkMergesInfoStream.java @@ -26,6 +26,11 @@ public class FailOnNonBulkMergesInfoStream extends InfoStream { @Override public void close() throws IOException { } + + @Override + public boolean isEnabled(String component) { + return true; + } @Override public void message(String component, String message) { diff --git a/lucene/src/test-framework/java/org/apache/lucene/util/NullInfoStream.java b/lucene/src/test-framework/java/org/apache/lucene/util/NullInfoStream.java index f8115141d5e..e6e5fb52246 100644 --- a/lucene/src/test-framework/java/org/apache/lucene/util/NullInfoStream.java +++ b/lucene/src/test-framework/java/org/apache/lucene/util/NullInfoStream.java @@ -20,7 +20,7 @@ package org.apache.lucene.util; import java.io.IOException; /** - * Prints nothing. Just to make sure tests pass w/ and without infostream + * Prints nothing. Just to make sure tests pass w/ and without enabled InfoStream * without actually making noise. * @lucene.experimental */ @@ -31,6 +31,12 @@ public class NullInfoStream extends InfoStream { assert message != null; } + @Override + public boolean isEnabled(String component) { + assert component != null; + return true; // to actually enable logging, we just ignore on message() + } + @Override public void close() throws IOException { } diff --git a/lucene/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java b/lucene/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java index 88d7366b02a..b402ceae92b 100644 --- a/lucene/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java +++ b/lucene/src/test/org/apache/lucene/index/TestIndexWriterExceptions.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Random; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.lucene.analysis.*; import org.apache.lucene.document.Document; @@ -958,18 +959,22 @@ public class TestIndexWriterExceptions extends LuceneTestCase { // LUCENE-1429 public void testOutOfMemoryErrorCausesCloseToFail() throws Exception { - final List thrown = new ArrayList(); + final AtomicBoolean thrown = new AtomicBoolean(false); final Directory dir = newDirectory(); final IndexWriter writer = new IndexWriter(dir, newIndexWriterConfig( TEST_VERSION_CURRENT, new MockAnalyzer(random)).setInfoStream(new InfoStream() { @Override public void message(String component, final String message) { - if (message.startsWith("now flush at close") && 0 == thrown.size()) { - thrown.add(null); + if (message.startsWith("now flush at close") && thrown.compareAndSet(false, true)) { throw new OutOfMemoryError("fake OOME at " + message); } } + @Override + public boolean isEnabled(String component) { + return true; + } + @Override public void close() throws IOException {} })); diff --git a/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java b/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java index 076288e12fe..3217307a27a 100644 --- a/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java +++ b/solr/core/src/java/org/apache/solr/update/SolrIndexWriter.java @@ -74,9 +74,9 @@ public class SolrIndexWriter extends IndexWriter { File parent = f.getParentFile(); if (parent != null) parent.mkdirs(); FileOutputStream fos = new FileOutputStream(f, true); - return new PrintStreamInfoStream(new TimeLoggingPrintStream(fos, true)); + return new PrintStreamInfoStream(new PrintStream(fos, true)); } else { - return null; + return InfoStream.NO_OUTPUT; } } @@ -155,23 +155,4 @@ public class SolrIndexWriter extends IndexWriter { } } - - // Helper class for adding timestamps to infoStream logging - static class TimeLoggingPrintStream extends PrintStream { - private DateFormat dateFormat; - public TimeLoggingPrintStream(OutputStream underlyingOutputStream, - boolean autoFlush) { - super(underlyingOutputStream, autoFlush); - this.dateFormat = DateFormat.getDateTimeInstance(); - } - - // We might ideally want to override print(String) as well, but - // looking through the code that writes to infoStream, it appears - // that all the classes except CheckIndex just use println. - @Override - public void println(String x) { - print(dateFormat.format(new Date()) + " "); - super.println(x); - } - } }