/* * Copyright (C) 2014 Indeed Inc. * * 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. */ package com.indeed.imhotep.service; //import com.indeed.common.search.directory.MMapBufferDirectory; import com.indeed.util.io.Files; import com.indeed.flamdex.api.FlamdexReader; import com.indeed.flamdex.lucene.LuceneFlamdexReader; import com.indeed.imhotep.ImhotepMemoryPool; import com.indeed.imhotep.MemoryReservationContext; import com.indeed.imhotep.api.FTGSIterator; import com.indeed.imhotep.api.ImhotepOutOfMemoryException; import com.indeed.imhotep.api.ImhotepSession; import com.indeed.imhotep.local.ImhotepLocalSession; import org.apache.lucene.analysis.WhitespaceAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexReader; import org.apache.lucene.index.IndexWriter; import org.junit.BeforeClass; import org.junit.Test; import java.io.IOException; import java.util.Random; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicBoolean; import static org.junit.Assert.assertTrue; /** * @author jsgroth */ public class TestCloseSessionDuringFTGS { @BeforeClass public static void setMMapBufferDirectory() { // Use MMapBufferDirectory because it has the convenient behavior of segfaulting the JVM if you try to // read from a closed index // System.setProperty("org.apache.lucene.FSDirectory.class", MMapBufferDirectory.class.getName()); } @Test public void testCloseSessionDuringFTGS() throws ImhotepOutOfMemoryException, IOException, InterruptedException { String tempDir = Files.getTempDirectory("asdf", ""); try { IndexWriter w = new IndexWriter(tempDir, new WhitespaceAnalyzer(), true, IndexWriter.MaxFieldLength.LIMITED); Random rand = new Random(); for (int i = 0; i < 1000000; ++i) { int numTerms = rand.nextInt(5) + 5; Document doc = new Document(); for (int t = 0; t < numTerms; ++t) { doc.add(new Field("sf1", Integer.toString(rand.nextInt(10000)), Field.Store.NO, Field.Index.NOT_ANALYZED_NO_NORMS)); } w.addDocument(doc); } w.close(); final AtomicBoolean closed = new AtomicBoolean(false); FlamdexReader r = new LuceneFlamdexReader(IndexReader.open(tempDir)) { @Override public void close() throws IOException { super.close(); closed.set(true); } }; final ExecutorService executor = Executors.newCachedThreadPool(); try { ImhotepSession session = new MTImhotepMultiSession(new ImhotepLocalSession[] { new ImhotepLocalSession(r) }, new MemoryReservationContext( new ImhotepMemoryPool( Long.MAX_VALUE)), executor, null); // FTGSIterator iter = session.getFTGSIterator(new String[]{}, new String[]{"sf1"}); //TODO fix this session.close(); assertTrue(closed.get()); } finally { executor.shutdown(); } } finally { Files.delete(tempDir); } } }