Index: oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/ReindexIT.java =================================================================== --- oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/ReindexIT.java (nonexistent) +++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/ReindexIT.java (working copy) @@ -0,0 +1,186 @@ +/* + * 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.jackrabbit.oak.jcr; + +import java.io.File; +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.jcr.Node; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; +import javax.jcr.SimpleCredentials; + +import com.mongodb.DB; + +import org.apache.jackrabbit.commons.JcrUtils; +import org.apache.jackrabbit.oak.api.CommitFailedException; +import org.apache.jackrabbit.oak.plugins.document.DocumentMKBuilderProvider; +import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; +import org.apache.jackrabbit.oak.plugins.document.MongoConnectionFactory; +import org.apache.jackrabbit.oak.plugins.document.MongoUtils; +import org.apache.jackrabbit.oak.plugins.index.IndexEditorProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.IndexCopier; +import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexEditorProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.LuceneIndexProvider; +import org.apache.jackrabbit.oak.plugins.index.lucene.util.LuceneIndexHelper; +import org.apache.jackrabbit.oak.spi.commit.CommitInfo; +import org.apache.jackrabbit.oak.spi.commit.EmptyHook; +import org.apache.jackrabbit.oak.spi.query.QueryIndexProvider; +import org.apache.jackrabbit.oak.spi.state.NodeBuilder; +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TemporaryFolder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static org.apache.jackrabbit.oak.plugins.document.util.Utils.closeIfCloseable; +import static org.junit.Assume.assumeTrue; + +public class ReindexIT { + + private static final Logger log = LoggerFactory.getLogger(ReindexIT.class); + + private static final int NUM_INDEXES = 10; + + @Rule + public TemporaryFolder tempFolder = new TemporaryFolder(new File("target")); + + @Rule + public MongoConnectionFactory connectionFactory = new MongoConnectionFactory(); + + @Rule + public DocumentMKBuilderProvider builderProvider = new DocumentMKBuilderProvider(); + + private ExecutorService executor; + + private DocumentNodeStore ns; + + private Repository repo; + + private Session s; + + @BeforeClass + public static void assumeMongo() { + assumeTrue(MongoUtils.isAvailable()); + } + + @Before + public void before() throws Exception { + executor = Executors.newCachedThreadPool(new ThreadFactory() { + private final AtomicInteger counter = new AtomicInteger(); + @Override + public Thread newThread(Runnable r) { + Thread t = new Thread(r); + t.setName("IndexCopier-" + counter.incrementAndGet()); + return t; + } + }); + DB db = connectionFactory.getConnection().getDB(); + MongoUtils.dropCollections(db); + ns = builderProvider.newBuilder().setMongoDB(db).getNodeStore(); + QueryIndexProvider qip = new LuceneIndexProvider(); + IndexEditorProvider iep = new LuceneIndexEditorProvider(new IndexCopier(executor, tempFolder.newFolder())); + repo = new Jcr(ns).with(qip).with(iep) + .withAsyncIndexing().createRepository(); + for (int i = 0; i < NUM_INDEXES; i++) { + createIndexDefinition("p" + i); + } + s = login(); + populateRepository(); + log.info("waiting for index to catch up"); + Thread.sleep(10000); + } + + @After + public void after() throws Exception { + s.logout(); + closeIfCloseable(repo); + ns.dispose(); + executor.shutdown(); + executor.awaitTermination(5, TimeUnit.SECONDS); + } + + + @Test + public void reindex() throws Exception { + for (int i = 0; i < 10; i++) { + doReindex(); + } + } + + private void doReindex() throws Exception { + s.refresh(false); + Node indexes = s.getRootNode().getNode("oak:index"); + for (Node idx : JcrUtils.getChildNodes(indexes)) { + if (idx.hasProperty("async")) { + idx.setProperty("reindex", true); + } + } + s.save(); + log.info("reindexing triggered"); + while (isReindexing()) { + Thread.sleep(1000); + } + } + + private Session login() throws RepositoryException { + return repo.login(new SimpleCredentials("admin", "admin".toCharArray())); + } + + private void createIndexDefinition(String propertyName) + throws CommitFailedException { + NodeBuilder builder = ns.getRoot().builder(); + NodeBuilder index = builder.child("oak:index"); + LuceneIndexHelper.newLuceneIndexDefinition(index, propertyName, null, null, "async"); + ns.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); + } + + private void populateRepository() throws RepositoryException { + Random r = new Random(42); + for (int i = 0; i < 30; i++) { + Node f = s.getRootNode().addNode("folder-" + i, "oak:Unstructured"); + for (int j = 0; j < 1000; j++) { + Node n = f.addNode("node-" + j); + for (int k = 0; k < NUM_INDEXES; k++) { + n.setProperty("p" + k, r.nextInt(100)); + } + } + log.info("populating repository"); + s.save(); + } + } + + private boolean isReindexing() throws RepositoryException { + s.refresh(false); + Node indexes = s.getRootNode().getNode("oak:index"); + for (Node idx : JcrUtils.getChildNodes(indexes)) { + if (idx.hasProperty("reindex") && idx.getProperty("reindex").getBoolean()) { + return true; + } + } + return false; + } +} Property changes on: oak-lucene/src/test/java/org/apache/jackrabbit/oak/jcr/ReindexIT.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Index: oak-lucene/src/test/resources/logback-test.xml =================================================================== --- oak-lucene/src/test/resources/logback-test.xml (revision 1773092) +++ oak-lucene/src/test/resources/logback-test.xml (working copy) @@ -29,6 +29,9 @@ + + +