Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/counter/NodeCounterEditor.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/counter/NodeCounterEditor.java (revision 1864607) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/index/counter/NodeCounterEditor.java (working copy) @@ -159,7 +159,19 @@ } root.callback.indexUpdate(); for (Map.Entry e : countOffsets.entrySet()) { - NodeBuilder builder = getBuilder(e.getKey()); + NodeBuilder builder = null; +System.out.println("leaveNew"); + try { + builder = getBuilder(e.getKey()); + } catch (UnsupportedOperationException uoe) { + // read-only builder: ignore + // (when indexing the counter index from scratch, + // for example because the checkpoint is not found, + // or due to manually reindexing, it will also try to update + // the read-only part of the index, which is not allowed) +System.out.println("leaveNew continue " + uoe); + continue; + } int countOffset = e.getValue(); PropertyState p = builder.getProperty(COUNT_HASH_PROPERTY_NAME); Index: oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreLuceneIndexTest.java =================================================================== --- oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreLuceneIndexTest.java (revision 1864609) +++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreLuceneIndexTest.java (working copy) @@ -30,6 +30,8 @@ import org.junit.Test; import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; import javax.jcr.Repository; import javax.jcr.RepositoryException; import javax.jcr.Session; @@ -103,19 +105,54 @@ } /** - * Given a composite node store , trying to create an index in read-write part - * with the same index node already existing in the read only part already - * we should get OakConstraint001 . This is the current behaviour, - * but can be worked upon (improved) in the future . + * Given a composite node store , create an index in read-write part + * with the same index node already existing in the read-only part already. */ @Test - public void tryAddIndexInReadWriteWithIndexExistinginReadOnly() { + public void addIndexInReadWriteWithIndexExistinginReadOnly() throws Exception { + repoV1.setupIndexAndContentInRepo("luceneTest", "foo", true, VERSION_1); + repoV1.cleanup(); + } + + @Test + public void reindexCounterIndex() throws Exception { + repoV1.setupIndexAndContentInRepo("luceneTest", "foo", true, VERSION_1); try { - repoV1.setupIndexAndContentInRepo("luceneTest", "foo", true, VERSION_1); - assertTrue(false); - } catch (Exception e) { - assert (e.getLocalizedMessage().contains( - "OakConstraint0001: /oak:index/luceneTest/:oak:mount-readOnlyV1-index-data[[]]: The primary type null does not exist")); + Session s = repoV1.getSession(); + Node c = s.getRootNode().getNode(INDEX_DEFINITIONS_NAME).getNode("counter"); + System.out.println("type " + c.getProperty("type").getString()); + System.out.println("async " + c.getProperty("async").getString()); + + // maybe disable async (speedup) + // c.setProperty("async", (String) null); + + c.setProperty("resolution", 1); + c.setProperty("reindex", true); + s.save(); + + // restart repository (maybe not needed) + repoV1.restartRepo(); + s = repoV1.getSession(); + c = s.getRootNode().getNode(INDEX_DEFINITIONS_NAME).getNode("counter"); + + for (int i = 0; i < 1000; i++) { + if (!c.getProperty("reindex").getBoolean()) { + break; + } + Thread.sleep(1000); + s.refresh(false); + c = s.getRootNode().getNode(INDEX_DEFINITIONS_NAME).getNode("counter"); + PropertyIterator it = c.getProperties(); + while(it.hasNext()) { + Property p = it.nextProperty(); + System.out.println(" " + p.getName() + ": " + p.getString()); + } + if (i > 100) { + throw new AssertionError(); + } + } + } finally { + repoV1.cleanup(); } } Index: oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreQueryTestBase.java =================================================================== --- oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreQueryTestBase.java (revision 1864609) +++ oak-lucene/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreQueryTestBase.java (working copy) @@ -163,6 +163,7 @@ // create a property on the root node NodeBuilder builder = globalStore.getRoot().builder(); builder.setProperty("prop", "val"); + new InitialContent().initialize(builder); globalStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY); assertTrue(globalStore.getRoot().hasProperty("prop")); @@ -182,6 +183,7 @@ // create a /tmp child on the mounted store and set a property builder = mountedStore.getRoot().builder(); + new InitialContent().initialize(builder); NodeBuilder tmpBuilder = builder.child("tmp"); tmpBuilder.setProperty("prop1", "val1"); tmpBuilder.child("child1").setProperty("prop1", "val1"); @@ -308,7 +310,8 @@ .with((Observer) luceneIndexProvider) .with(new NodeTypeIndexProvider().with(mip)) .with(new ReferenceEditorProvider().with(mip)) - .with(new ReferenceIndexProvider().with(mip)); + .with(new ReferenceIndexProvider().with(mip)). + withAsyncIndexing("async", 1); } } @@ -460,13 +463,12 @@ throw new IllegalStateException("instance already created"); } - // TODO - don't use Unix directory separators String directoryName = name != null ? "segment-" + name : "segment"; - storePath = new File("target/classes/" + directoryName); + storePath = new File("target/compositeTest/" + directoryName); //String blobStoreDirectoryName = name != null ? "blob-" + name : "blob"; String blobStoreDirectoryName = "blob" ; - blobStorePath = "target/classes/" + blobStoreDirectoryName; + blobStorePath = "target/compositeTest/" + blobStoreDirectoryName; BlobStore blobStore = new FileBlobStore(blobStorePath); @@ -501,7 +503,7 @@ @Override public NodeStore get() throws Exception { RDBOptions options = new RDBOptions().dropTablesOnClose(true); - String jdbcUrl = "jdbc:h2:file:./target/classes/document"; + String jdbcUrl = "jdbc:h2:file:./target/compositeTest/document"; if ( name != null ) { jdbcUrl += "-" + name; }