Author: chetanm
Date: Wed Jun 29 06:26:19 2016
New Revision: 1750601

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

Exposes a barebone SegmentNodeStore. This instance is not listening for 
observor etc and not directly exposed as a NodeStore but instance exposed via 
NodeStoreProvider

Modified:
    jackrabbit/oak/trunk/oak-segment-tar/pom.xml
    
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
    
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreServiceTest.java
    
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-tar/pom.xml
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/pom.xml?rev=1750601&r1=1750600&r2=1750601&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/pom.xml (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/pom.xml Wed Jun 29 06:26:19 2016
@@ -34,7 +34,7 @@
     <name>Oak Segment Tar</name>
 
     <properties>
-        <oak.version>1.5.3</oak.version>
+        <oak.version>1.6-SNAPSHOT</oak.version>
     </properties>
 
     <scm>

Modified: 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java?rev=1750601&r1=1750600&r2=1750601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
 Wed Jun 29 06:26:19 2016
@@ -81,6 +81,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;
@@ -196,6 +197,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. " +
@@ -308,6 +316,11 @@ public class SegmentNodeStoreService ext
                 return;
             }
 
+            if (toBoolean(property(SECONDARY_STORE), false)){
+                registerSecondaryStore();
+                return;
+            }
+
             if (registerSegmentNodeStore()) {
                 Dictionary<String, Object> props = new Hashtable<String, 
Object>();
                 props.put(Constants.SERVICE_PID, 
SegmentNodeStore.class.getName());
@@ -317,6 +330,20 @@ public class SegmentNodeStoreService ext
         }
     }
 
+    private void registerSecondaryStore() {
+        segmentNodeStore = SegmentNodeStoreBuilders.builder(store).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-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreServiceTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreServiceTest.java?rev=1750601&r1=1750600&r2=1750601&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreServiceTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreServiceTest.java
 Wed Jun 29 06:26:19 2016
@@ -30,6 +30,7 @@ import java.util.Map;
 
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 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 +141,17 @@ 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());
+
+        segmentNodeStoreService = context.registerInjectActivateService(new 
SegmentNodeStoreService(), properties);
+        assertNull(context.getService(NodeStore.class));
+        assertNotNull(context.getService(NodeStoreProvider.class));
+    }
+
     private SegmentNodeStoreService segmentNodeStoreService;
 
     private void registerSegmentNodeStoreService(boolean customBlobStore) {

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=1750601&r1=1750600&r2=1750601&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 06:26:19 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. " +
@@ -351,6 +359,11 @@ public class SegmentNodeStoreService ext
                 return;
             }
 
+            if (toBoolean(property(SECONDARY_STORE), false)){
+                registerSecondaryStore();
+                return;
+            }
+
             if (registerSegmentNodeStore()) {
                 Dictionary<String, Object> props = new Hashtable<String, 
Object>();
                 props.put(Constants.SERVICE_PID, 
SegmentNodeStore.class.getName());
@@ -360,6 +373,22 @@ public class SegmentNodeStoreService ext
         }
     }
 
+    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=1750601&r1=1750600&r2=1750601&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 06:26:19 2016
@@ -30,6 +30,7 @@ import java.util.Map;
 
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 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 +141,17 @@ 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());
+
+        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