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) {