Author: chetanm
Date: Wed Nov 16 09:23:46 2016
New Revision: 1769949
URL: http://svn.apache.org/viewvc?rev=1769949&view=rev
Log:
OAK-5113 - Avoid dispatching changes for checkpoint related changes
Fix in segment-tar and re-enable the test.
Modified:
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
jackrabbit/oak/trunk/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStore.java
Modified:
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java?rev=1769949&r1=1769948&r2=1769949&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
(original)
+++
jackrabbit/oak/trunk/oak-it/src/test/java/org/apache/jackrabbit/oak/spi/state/CheckpointTest.java
Wed Nov 16 09:23:46 2016
@@ -91,7 +91,6 @@ public class CheckpointTest extends OakB
assertEquals(props, store.checkpointInfo(cp));
}
- @Ignore("OAK-5113")
@Test
public void noContentChangeForCheckpoints() throws Exception{
final AtomicInteger invocationCount = new AtomicInteger();
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=1769949&r1=1769948&r2=1769949&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 Nov 16 09:23:46 2016
@@ -234,7 +234,7 @@ public class SegmentNodeStore implements
} finally {
// Explicitly give up reference to the previous root state
// otherwise they would block cleanup. See OAK-3347
- refreshHead();
+ refreshHead(true);
commitSemaphore.release();
}
}
@@ -244,12 +244,15 @@ public class SegmentNodeStore implements
/**
* Refreshes the head state. Should only be called while holding a
* permit from the {@link #commitSemaphore}.
+ * @param dispatchChanges if set to true the changes would also be
dispatched
*/
- private void refreshHead() {
+ private void refreshHead(boolean dispatchChanges) {
SegmentNodeState state = reader.readHeadState(revisions);
if (!state.getRecordId().equals(head.get().getRecordId())) {
head.set(state);
- contentChanged(state.getChildNode(ROOT), null);
+ if (dispatchChanges) {
+ contentChanged(state.getChildNode(ROOT), null);
+ }
}
}
@@ -265,7 +268,7 @@ public class SegmentNodeStore implements
public NodeState getRoot() {
if (commitSemaphore.tryAcquire()) {
try {
- refreshHead();
+ refreshHead(true);
} finally {
commitSemaphore.release();
}
@@ -392,7 +395,7 @@ public class SegmentNodeStore implements
public Boolean call() {
long now = System.currentTimeMillis();
- refreshHead();
+ refreshHead(true);
SegmentNodeState state = head.get();
SegmentNodeBuilder builder = state.builder();
@@ -423,7 +426,7 @@ public class SegmentNodeStore implements
SegmentNodeState newState = builder.getNodeState();
if (revisions.setHead(state.getRecordId(),
newState.getRecordId())) {
- refreshHead();
+ refreshHead(false);
return true;
} else {
return false;
@@ -480,7 +483,7 @@ public class SegmentNodeStore implements
for (int i = 0; i < 5; i++) {
if (commitSemaphore.tryAcquire()) {
try {
- refreshHead();
+ refreshHead(true);
SegmentNodeState state = head.get();
SegmentNodeBuilder builder = state.builder();
@@ -491,7 +494,7 @@ public class SegmentNodeStore implements
cp.remove();
SegmentNodeState newState = builder.getNodeState();
if (revisions.setHead(state.getRecordId(),
newState.getRecordId())) {
- refreshHead();
+ refreshHead(false);
return true;
}
}
@@ -530,11 +533,11 @@ public class SegmentNodeStore implements
}
private boolean setHead(SegmentNodeState before, SegmentNodeState
after) {
- refreshHead();
+ refreshHead(true);
if (revisions.setHead(before.getRecordId(), after.getRecordId())) {
head.set(after);
contentChanged(after.getChildNode(ROOT), info);
- refreshHead();
+ refreshHead(true);
return true;
} else {
return false;
@@ -569,7 +572,7 @@ public class SegmentNodeStore implements
for (long backoff = 1; backoff < maximumBackoff; backoff *= 2) {
long start = System.nanoTime();
- refreshHead();
+ refreshHead(true);
SegmentNodeState state = head.get();
if (state.hasProperty("token")
&& state.getLong("timeout") >= currentTimeMillis()) {