Author: chetanm
Date: Wed Jun 29 10:13:27 2016
New Revision: 1750615

URL: http://svn.apache.org/viewvc?rev=1750615&view=rev
Log:
OAK-4490 - Expose SegmentNodeStore as a secondary NodeStore

Reapply incorrectly reverted change

Modified:
    
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
    
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java

Modified: 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java?rev=1750615&r1=1750614&r2=1750615&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/main/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreService.java
 Wed Jun 29 10:13:27 2016
@@ -86,6 +86,7 @@ import org.apache.jackrabbit.oak.spi.com
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitorTracker;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeStoreProvider;
 import org.apache.jackrabbit.oak.spi.state.ProxyNodeStore;
 import org.apache.jackrabbit.oak.spi.state.RevisionGC;
 import org.apache.jackrabbit.oak.spi.state.RevisionGCMBean;
@@ -237,6 +238,13 @@ public class SegmentNodeStoreService ext
     )
     public static final String STANDBY = "standby";
 
+    @Property(
+            boolValue = false,
+            label = "Secondary Store Mode",
+            description = "Flag indicating that this component will not 
register as a NodeStore but just as a SecondaryNodeStoreProvider"
+    )
+    public static final String SECONDARY_STORE = "secondary";
+
     @Property(boolValue = false,
             label = "Custom BlobStore",
             description = "Boolean value indicating that a custom BlobStore is 
to be used. " +
@@ -306,7 +314,8 @@ public class SegmentNodeStoreService ext
     @Activate
     public void activate(ComponentContext context) throws IOException {
         this.context = context;
-        this.customBlobStore = 
Boolean.parseBoolean(property(CUSTOM_BLOB_STORE));
+        //In secondaryNodeStore mode customBlobStore is always enabled
+        this.customBlobStore = 
Boolean.parseBoolean(property(CUSTOM_BLOB_STORE)) || isSecondaryStoreMode();
 
         if (blobStore == null && customBlobStore) {
             log.info("BlobStore use enabled. SegmentNodeStore would be 
initialized when BlobStore would be available");
@@ -351,6 +360,11 @@ public class SegmentNodeStoreService ext
                 return;
             }
 
+            if (isSecondaryStoreMode()){
+                registerSecondaryStore();
+                return;
+            }
+
             if (registerSegmentNodeStore()) {
                 Dictionary<String, Object> props = new Hashtable<String, 
Object>();
                 props.put(Constants.SERVICE_PID, 
SegmentNodeStore.class.getName());
@@ -360,6 +374,26 @@ public class SegmentNodeStoreService ext
         }
     }
 
+    private boolean isSecondaryStoreMode() {
+        return toBoolean(property(SECONDARY_STORE), false);
+    }
+
+    private void registerSecondaryStore() {
+        SegmentNodeStore.SegmentNodeStoreBuilder nodeStoreBuilder = 
SegmentNodeStore.builder(store);
+        nodeStoreBuilder.withCompactionStrategy(compactionStrategy);
+        segmentNodeStore = nodeStoreBuilder.build();
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        props.put(NodeStoreProvider.ROLE, "secondary");
+        storeRegistration = 
context.getBundleContext().registerService(NodeStoreProvider.class.getName(), 
new NodeStoreProvider() {
+                    @Override
+                    public NodeStore getNodeStore() {
+                        return SegmentNodeStoreService.this;
+                    }
+                },
+                props);
+        log.info("Registered NodeStoreProvider backed by SegmentNodeStore");
+    }
+
     private boolean registerSegmentStore() throws IOException {
         if (context == null) {
             log.info("Component still not activated. Ignoring the 
initialization call");

Modified: 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java?rev=1750615&r1=1750614&r2=1750615&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment/src/test/java/org/apache/jackrabbit/oak/plugins/segment/SegmentNodeStoreServiceTest.java
 Wed Jun 29 10:13:27 2016
@@ -29,7 +29,9 @@ import java.io.File;
 import java.util.Map;
 
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
+import org.apache.jackrabbit.oak.spi.blob.MemoryBlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeStore;
+import org.apache.jackrabbit.oak.spi.state.NodeStoreProvider;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
 import org.apache.sling.testing.mock.osgi.junit.OsgiContext;
 import org.junit.Before;
@@ -140,6 +142,18 @@ public class SegmentNodeStoreServiceTest
         unregisterSegmentNodeStoreService();
     }
 
+    @Test
+    public void nodeStoreProvider() throws Exception{
+        Map<String, Object> properties = newHashMap();
+        properties.put(SegmentNodeStoreService.SECONDARY_STORE, true);
+        properties.put(SegmentNodeStoreService.DIRECTORY, 
folder.getRoot().getAbsolutePath());
+        context.registerService(BlobStore.class, new MemoryBlobStore());
+
+        segmentNodeStoreService = context.registerInjectActivateService(new 
SegmentNodeStoreService(), properties);
+        assertNull(context.getService(NodeStore.class));
+        assertNotNull(context.getService(NodeStoreProvider.class));
+    }
+
     private SegmentNodeStoreService segmentNodeStoreService;
 
     private void registerSegmentNodeStoreService(boolean customBlobStore) {


Reply via email to