You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by fr...@apache.org on 2016/10/12 14:38:22 UTC
svn commit: r1764475 - in
/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment:
SegmentNodeStore.java SegmentNodeStoreService.java
Author: frm
Date: Wed Oct 12 14:38:22 2016
New Revision: 1764475
URL: http://svn.apache.org/viewvc?rev=1764475&view=rev
Log:
OAK-4883 - Register a BlobGCMBean on standby instances
Contribution by Timothee Maret.
Modified:
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreService.java
Modified: jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java?rev=1764475&r1=1764474&r2=1764475&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java (original)
+++ jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java Wed Oct 12 14:38:22 2016
@@ -72,6 +72,15 @@ import org.slf4j.LoggerFactory;
*/
public class SegmentNodeStore implements NodeStore, Observable {
+ private static final Closeable NOOP = new Closeable() {
+
+ @Override
+ public void close() throws IOException {
+ // This method was intentionally left blank.
+ }
+
+ };
+
public static class SegmentNodeStoreBuilder {
private static final Logger LOG = LoggerFactory.getLogger(SegmentNodeStoreBuilder.class);
@@ -89,6 +98,8 @@ public class SegmentNodeStore implements
private boolean isCreated;
+ private boolean dispatchChanges = true;
+
private SegmentNodeStoreBuilder(
@Nonnull Revisions revisions,
@Nonnull SegmentReader reader,
@@ -101,6 +112,12 @@ public class SegmentNodeStore implements
}
@Nonnull
+ public SegmentNodeStoreBuilder dispatchChanges(boolean dispatchChanges) {
+ this.dispatchChanges = dispatchChanges;
+ return this;
+ }
+
+ @Nonnull
public SegmentNodeStore build() {
checkState(!isCreated);
isCreated = true;
@@ -188,7 +205,11 @@ public class SegmentNodeStore implements
this.writer = builder.writer;
this.blobStore = builder.blobStore;
this.head = new AtomicReference<SegmentNodeState>(reader.readHeadState(revisions));
- this.changeDispatcher = new ChangeDispatcher(getRoot());
+ if (builder.dispatchChanges) {
+ this.changeDispatcher = new ChangeDispatcher(getRoot());
+ } else {
+ this.changeDispatcher = null;
+ }
}
void setMaximumBackoff(long max) {
@@ -228,13 +249,16 @@ public class SegmentNodeStore implements
SegmentNodeState state = reader.readHeadState(revisions);
if (!state.getRecordId().equals(head.get().getRecordId())) {
head.set(state);
- changeDispatcher.contentChanged(state.getChildNode(ROOT), null);
+ contentChanged(state.getChildNode(ROOT), null);
}
}
@Override
public Closeable addObserver(Observer observer) {
- return changeDispatcher.addObserver(observer);
+ if (changeDispatcher != null) {
+ return changeDispatcher.addObserver(observer);
+ }
+ return NOOP;
}
@Override @Nonnull
@@ -509,7 +533,7 @@ public class SegmentNodeStore implements
refreshHead();
if (revisions.setHead(before.getRecordId(), after.getRecordId())) {
head.set(after);
- changeDispatcher.contentChanged(after.getChildNode(ROOT), info);
+ contentChanged(after.getChildNode(ROOT), info);
refreshHead();
return true;
} else {
@@ -626,4 +650,10 @@ public class SegmentNodeStore implements
this.checkpointsLockWaitTime = checkpointsLockWaitTime;
}
+ private void contentChanged(NodeState root, CommitInfo info) {
+ if (changeDispatcher != null) {
+ changeDispatcher.contentChanged(root, info);
+ }
+ }
+
}
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=1764475&r1=1764474&r2=1764475&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 Oct 12 14:38:22 2016
@@ -335,18 +335,16 @@ public class SegmentNodeStoreService ext
}
private synchronized void registerNodeStore() throws IOException {
- if (registerSegmentStore()) {
- if (toBoolean(property(STANDBY), false)) {
- return;
- }
-
- if (registerSegmentNodeStore()) {
- Dictionary<String, Object> props = new Hashtable<String, Object>();
- props.put(Constants.SERVICE_PID, SegmentNodeStore.class.getName());
- props.put("oak.nodestore.description", new String[]{"nodeStoreType=segment"});
- storeRegistration = context.getBundleContext().registerService(NodeStore.class.getName(), this, props);
- }
+ if (!registerSegmentStore()) {
+ return;
}
+ if (toBoolean(property(STANDBY), false)) {
+ return;
+ }
+ Dictionary<String, Object> props = new Hashtable<String, Object>();
+ props.put(Constants.SERVICE_PID, SegmentNodeStore.class.getName());
+ props.put("oak.nodestore.description", new String[] {"nodeStoreType=segment"});
+ storeRegistration = context.getBundleContext().registerService(NodeStore.class.getName(), this, props);
}
private boolean registerSegmentStore() throws IOException {
@@ -483,34 +481,19 @@ public class SegmentNodeStoreService ext
"FileStore statistics"
));
- // Register a factory service to expose the FileStore
-
- providerRegistration = context.getBundleContext().registerService(SegmentStoreProvider.class.getName(), this, null);
-
- return true;
- }
-
- private SegmentGCOptions newGCOptions() {
- boolean pauseCompaction = toBoolean(property(PAUSE_COMPACTION), PAUSE_DEFAULT);
- int retryCount = toInteger(property(COMPACTION_RETRY_COUNT), RETRY_COUNT_DEFAULT);
- int forceTimeout = toInteger(property(COMPACTION_FORCE_TIMEOUT), FORCE_TIMEOUT_DEFAULT);
-
- byte gainThreshold = getGainThreshold();
- long sizeDeltaEstimation = toLong(property(COMPACTION_SIZE_DELTA_ESTIMATION), SIZE_DELTA_ESTIMATION_DEFAULT);
-
- return new SegmentGCOptions(pauseCompaction, gainThreshold, retryCount, forceTimeout)
- .setGcSizeDeltaEstimation(sizeDeltaEstimation);
- }
+ // register segment node store
- private boolean registerSegmentNodeStore() throws IOException {
Dictionary<?, ?> properties = context.getProperties();
name = String.valueOf(properties.get(NAME));
final long blobGcMaxAgeInSecs = toLong(property(PROP_BLOB_GC_MAX_AGE), DEFAULT_BLOB_GC_MAX_AGE);
- OsgiWhiteboard whiteboard = new OsgiWhiteboard(context.getBundleContext());
-
- segmentNodeStore = SegmentNodeStoreBuilders.builder(store).build();
+ SegmentNodeStore.SegmentNodeStoreBuilder segmentNodeStoreBuilder =
+ SegmentNodeStoreBuilders.builder(store);
+ if (toBoolean(property(STANDBY), false)) {
+ segmentNodeStoreBuilder.dispatchChanges(false);
+ }
+ segmentNodeStore = segmentNodeStoreBuilder.build();
observerTracker = new ObserverTracker(segmentNodeStore);
observerTracker.start(context.getBundleContext());
@@ -550,7 +533,7 @@ public class SegmentNodeStoreService ext
if (blobStore instanceof BlobTrackingStore) {
final long trackSnapshotInterval = toLong(property(PROP_BLOB_SNAPSHOT_INTERVAL),
- DEFAULT_BLOB_SNAPSHOT_INTERVAL);
+ DEFAULT_BLOB_SNAPSHOT_INTERVAL);
String root = property(DIRECTORY);
if (Strings.isNullOrEmpty(root)) {
root = "repository";
@@ -561,8 +544,8 @@ public class SegmentNodeStoreService ext
trackingStore.getTracker().close();
}
((BlobTrackingStore) blobStore).addTracker(
- new BlobIdTracker(root, repoId, trackSnapshotInterval, (SharedDataStore)
- blobStore));
+ new BlobIdTracker(root, repoId, trackSnapshotInterval, (SharedDataStore)
+ blobStore));
}
}
@@ -585,9 +568,26 @@ public class SegmentNodeStoreService ext
}
log.info("SegmentNodeStore initialized");
+
+ // Register a factory service to expose the FileStore
+
+ providerRegistration = context.getBundleContext().registerService(SegmentStoreProvider.class.getName(), this, null);
+
return true;
}
+ private SegmentGCOptions newGCOptions() {
+ boolean pauseCompaction = toBoolean(property(PAUSE_COMPACTION), PAUSE_DEFAULT);
+ int retryCount = toInteger(property(COMPACTION_RETRY_COUNT), RETRY_COUNT_DEFAULT);
+ int forceTimeout = toInteger(property(COMPACTION_FORCE_TIMEOUT), FORCE_TIMEOUT_DEFAULT);
+
+ byte gainThreshold = getGainThreshold();
+ long sizeDeltaEstimation = toLong(property(COMPACTION_SIZE_DELTA_ESTIMATION), SIZE_DELTA_ESTIMATION_DEFAULT);
+
+ return new SegmentGCOptions(pauseCompaction, gainThreshold, retryCount, forceTimeout)
+ .setGcSizeDeltaEstimation(sizeDeltaEstimation);
+ }
+
private void unregisterNodeStore() {
new CompositeRegistration(registrations).unregister();
if (providerRegistration != null) {