Index: oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java =================================================================== --- oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java (revision 1842684) +++ oak-store-composite/src/main/java/org/apache/jackrabbit/oak/composite/CompositeNodeStore.java (working copy) @@ -33,9 +33,12 @@ import org.apache.jackrabbit.oak.spi.commit.Observer; import org.apache.jackrabbit.oak.spi.mount.Mount; import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider; +import org.apache.jackrabbit.oak.spi.state.Clusterable; import org.apache.jackrabbit.oak.spi.state.NodeBuilder; import org.apache.jackrabbit.oak.spi.state.NodeState; import org.apache.jackrabbit.oak.spi.state.NodeStore; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -438,7 +441,11 @@ if (checks != null) { nonDefaultStores.forEach( s -> checks.check(globalStore, s)); } - return new CompositeNodeStore(mip, globalStore, nonDefaultStores, nodeStateMonitor, nodeBuilderMonitor); + if (globalStore instanceof Clusterable) { + return new ClusterableCNS(mip, globalStore, nonDefaultStores, nodeStateMonitor, nodeBuilderMonitor); + } else { + return new CompositeNodeStore(mip, globalStore, nonDefaultStores, nodeStateMonitor, nodeBuilderMonitor); + } } private void checkMountsAreConsistentWithMounts() { @@ -449,4 +456,41 @@ buildMountCount, mipMountCount); } } + + private static class ClusterableCNS + extends CompositeNodeStore + implements Clusterable { + + private final Clusterable clusterable; + + ClusterableCNS(MountInfoProvider mip, + NodeStore globalStore, + List nonDefaultStore, + CompositeNodeStoreMonitor nodeStateMonitor, + CompositeNodeStoreMonitor nodeBuilderMonitor) { + super(mip, globalStore, nonDefaultStore, nodeStateMonitor, nodeBuilderMonitor); + checkArgument(globalStore instanceof Clusterable, + "globalStore must implement Clusterable"); + this.clusterable = (Clusterable) globalStore; + } + + @Override + @NotNull + public String getInstanceId() { + return clusterable.getInstanceId(); + } + + @Override + @Nullable + public String getVisibilityToken() { + return clusterable.getVisibilityToken(); + } + + @Override + public boolean isVisible(@NotNull String visibilityToken, + long maxWaitMillis) + throws InterruptedException { + return clusterable.isVisible(visibilityToken, maxWaitMillis); + } + } } Index: oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java =================================================================== --- oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (nonexistent) +++ oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java (working copy) @@ -0,0 +1,50 @@ +/* + * 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.composite; + +import org.apache.jackrabbit.oak.plugins.document.DocumentMKBuilderProvider; +import org.apache.jackrabbit.oak.plugins.document.DocumentNodeStore; +import org.apache.jackrabbit.oak.plugins.memory.MemoryNodeStore; +import org.apache.jackrabbit.oak.spi.mount.MountInfoProvider; +import org.apache.jackrabbit.oak.spi.mount.Mounts; +import org.apache.jackrabbit.oak.spi.state.Clusterable; +import org.junit.Rule; +import org.junit.Test; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class CompositeNodeStoreTest { + + @Rule + public DocumentMKBuilderProvider builderProvider = new DocumentMKBuilderProvider(); + + @Test + public void clusterable() { + MemoryNodeStore mount = new MemoryNodeStore(); + DocumentNodeStore global = builderProvider.newBuilder().getNodeStore(); + // DocumentNodeStore is clusterable + assertNotNull(global.getInstanceId()); + + MountInfoProvider mip = Mounts.newBuilder().readOnlyMount("libs", "/libs", "/apps").build(); + CompositeNodeStore cns = new CompositeNodeStore.Builder(mip, global) + .addMount("libs", mount).build(); + + assertTrue(cns instanceof Clusterable); + } + +} Property changes on: oak-store-composite/src/test/java/org/apache/jackrabbit/oak/composite/CompositeNodeStoreTest.java ___________________________________________________________________ Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property